; * *
; * File : wl006.asm *
; * Date : 2004-4-19 *
; * Version : 1.1 *
; * *
; * Author : Freeman myb33695@163.com *
;* Company : Willar http://shop35991384.taobao.com *
*
; * *
; ********************************************************************************
; * Deoon: *
; * AT93C46读写演示程序 *
; * 从地址0x00开始写入数据“www.willar.com”, 然后再读出 *
; * *
; * 注意:在擦除或写入数据之前,必须先写入EWEN指令 *
; * *
; * *
; *******************************************************************************/
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 P1.4
SK BIT P1.0
DI BIT P1.2
DO BIT P1.3
;===============================================================================
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
发表评论 评论 (0 个评论)