?? wl006.asm
字號:
;********************************************************************************
;* 標題: ME300系列單片機開發系統演示程序 - AT93C46讀寫演示程序 *
;* 硬件: ME300A+,ME300B *
;* 文件: wl006.asm *
;* 日期: 2004-1-5 *
;* 版本: 1.0 *
;* 作者: 偉納電子 - Freeman *
;* 郵箱: freeman@willar.com *
;* 網站: http://www.willar.com *
;********************************************************************************
;* 描述: *
;* AT93C46讀寫演示程序 *
;* 從地址0x00開始寫入數據“www.willar.com”, 然后再讀出 *
;* *
;* 注意:在擦除或寫入數據之前,必須先寫入EWEN指令,93C46右邊的JP7跳線 *
;* 用于8位和16位模式選擇,默認為8位模式 *
;* *
;********************************************************************************
;* 跳線設置: *
;* ME300A+ JP1 全部短接,JP2短接3-4端 *
;* ME300B JP1 短接,JP2短接3-4端,JP3短接93端 *
;* *
;********************************************************************************
;* 【版權】 Copyright(C)偉納電子 www.willar.com All Rights Reserved *
;* 【聲明】 此程序僅用于學習與參考,引用請注明版權和作者信息! *
;********************************************************************************
NAME WL006
CODE_SEG SEGMENT CODE
DATA_SEG SEGMENT DATA
STACK_SEG SEGMENT IDATA
RSEG DATA_SEG
INDATA: DS 1
ADDR: DS 1
RSEG STACK_SEG
STACK: DS 20
CS BIT P3.4
SK BIT P3.3
DI BIT P3.5
DO BIT P3.6
;===============================================================================
CSEG AT 0000H
JMP MAIN
;===============================================================================
RSEG CODE_SEG
MAIN:
USING 0
MOV SP,#(STACK-1) ; 設置堆棧
CLR CS ; 初始化端口
CLR SK
SETB DI
SETB DO
LCALL EWEN ; 使能寫入操作
LCALL ERASE ; 擦除全部內容
CLR A ; 寫入顯示代碼到AT93C46
MOV ADDR,A
WRITE_LP:
MOV A,ADDR
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV R5,A ; 數據到R5
MOV R7,ADDR ; 地址到R7
LCALL WRITE
INC ADDR ; 地址加1
MOV A,ADDR
CLR C
SUBB A,#08H ; 共8個字節,判斷是否完成
JC WRITE_LP
LCALL EWDS ; 禁止寫入操作
CLR A
MOV ADDR,A
MAIN_LP: ; 循環讀取AT93C46內容,并輸出到P0口
MOV R7,ADDR
LCALL READ
MOV P0,R7
INC ADDR
ANL ADDR,#07H ; 循環讀取地址為0x00~0x07
MOV R7,#250
LCALL DELAYMS ; 延時250ms
SJMP MAIN_LP
;===============================================================================
RSEG CODE_SEG
WRITE:
; 定入數據到AT93C46
; 傳入參數:R7 --- 要寫入數據的地址
; 傳入參數:R5 --- 要寫入的數據
; 返回值:無
USING 0
MOV INDATA,R5 ; 暫存要寫入的數據
MOV R5,AR7 ; 地址
MOV R7,#040H ; 寫入指令
LCALL INOP ; 調用INOP子程序,寫入指令和地址
MOV R7,INDATA ; 數據
LCALL SHIN ; 移入數據
CLR CS
MOV R7,#10
LJMP DELAYMS ; 延時10ms,Twp
; END OF WRITE
;===============================================================================
RSEG CODE_SEG
READ:
; 讀取AT93C46內的數據
; 傳入參數:R7 --- 地址
; 返回值:R7 --- 讀取的數據
USING 0
MOV R5,AR7
MOV R7,#080H
LCALL INOP ; 調用INOP子程序,寫入指令和地址
LCALL SHOUT ; 調用SHOUT,讀出數據保存到R7
CLR CS
RET
; END OF READ
;===============================================================================
RSEG CODE_SEG
EWEN:
; 寫入使能指令
; 傳入參數:無
; 返回值:無
USING 0
MOV R5,#060H
CLR A
MOV R7,A
LCALL INOP
CLR CS
RET
; END OF EWEN
;===============================================================================
RSEG CODE_SEG
EWDS:
; 寫入禁止指令
; 傳入參數:無
; 返回值:無
USING 0
CLR A
MOV R5,A
MOV R7,A
LCALL INOP
CLR CS
RET
; END OF EWDS
;===============================================================================
RSEG CODE_SEG
ERASE:
; 擦除所有內容
; 傳入參數:無
; 返回值:無
USING 0
MOV R5,#040H
CLR A
MOV R7,A
LCALL INOP
MOV R7,#01EH
LCALL DELAYMS
CLR CS
RET
; END OF ERASE
;===============================================================================
RSEG CODE_SEG
INOP:
; 寫入操作碼
; 傳入參數:R7高兩位 --- 指令碼的高兩位
; 傳入參數:R5低七位 --- 指令碼的低7位或地址
; 返回值:無
USING 0
CLR SK ; 開始位
SETB DI
SETB CS
NOP
NOP
SETB SK
NOP
NOP
CLR SK ; 開始位結束
MOV A,R7 ; 先移入指令碼高位
RLC A
MOV DI,C
SETB SK
RLC A
CLR SK
MOV DI,C ; 移入指令碼次高位
SETB SK
NOP
NOP
CLR SK
MOV A,R5 ; 移入余下的指令碼或地址數據
RLC A
MOV R5,A ; R5左移一位
CLR A
MOV R7,A
INOP_LP:
MOV A,R5 ; 移入R5的高7位
RLC A
MOV DI,C
SETB SK
MOV A,R5
RLC A
MOV R5,A
CLR SK
INC R7
CJNE R7,#07H,INOP_LP ; 判斷是否7位全移完
SETB DI
RET
; END OF INOP
;===============================================================================
RSEG CODE_SEG
SHIN:
; 從MCU移出數據到AT93C46
; 傳入參數:R7 --- 要移入的數據
; 返回值:無
USING 0
CLR A
MOV R6,A
MOV A,R6
MOV A,R7
SHIN_LP:
RLC A
MOV DI,C
SETB SK
NOP
NOP
CLR SK
INC R6
CJNE R6,#08H,SHIN_LP ; 共8位,判斷是否完成
SETB DI
RET
; END OF SHIN
;===============================================================================
RSEG CODE_SEG
SHOUT:
; 從AT93C46移出數據MCU
; 傳入參數:無
; 返回值:R7 --- 讀出的數據
USING 0
CLR A
MOV R6,A
SHOUT_LP:
SETB SK
NOP
NOP
CLR SK
MOV C,DO
RLC A
INC R6
CJNE R6,#08H,SHOUT_LP ; 共8位,判斷是否完成
MOV AR7,A
RET
; END OF SHOUT
;===============================================================================
RSEG CODE_SEG
DELAYMS:
; 延時子程序
; 傳入參數:R7 --- 延時值(MS)
; 返回值:無
MOV A,R7
JZ END_DLYMS
DLY_LP1:
MOV R6,#185
DLY_LP2:
NOP
NOP
NOP
DJNZ R6,DLY_LP2
DJNZ R7,DLY_LP1
END_DLYMS:
RET
; END OF DELAYMS
;===============================================================================
RSEG CODE_SEG
DIS_CODE:
; 寫入到AT93C46的數據串
DB 07EH
DB 0BDH
DB 0DBH
DB 0E7H
DB 0DBH
DB 0BDH
DB 07EH
DB 0FFH
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -