;*************
;* title: X25045
;*实现2051对 X25045 的写入和读出,及看门狗超时周期的设置。
;* version: 1.0
;* last date: 01.03.27
;* target: At89c2051 at 12Mhz
;* design by: Heyuesheng 010-64889568
;*************
;**** define register ****
;**** code
ORG 0000H
AJMP START
ORG 0040H
START: MOV SP,#60H
MOV R0,#10H;将状态寄存器置为 00010000(即无写保护,看门狗超时周期为 600 毫秒)
ACALL WRSR
TEST:
MOV R0,#89H;定义R0 为写入的数据(89H)
MOV R1,#00H;定义R1 为写入数据的地址(00H)
ACALL WRITE
MOV R0,#51H;定义R0 为写入的数据(51H)
MOV R1,#01H;定义R1 为写入数据的地址(01H)
ACALL WRITE
MOV R1,#00H;定义R1 为读出数据的地址(00H)
ACALL READ
MOV R4,A;将读出的数据存入 R4
MOV R1,#01H;定义R1 为读出数据的地址(01H)
ACALL READ
MOV R5,A;将读出的数据存入 R5
SJMP TEST
;*******本子程序写状态寄存器
;*入口参数:R0
WRSR: SETB P1.4
MOV R7,#10H
ACALL DELAY
CLR P1.4
MOV A,#01H;写状态寄存器指令
ACALL SIN
MOV A,R0;将状态寄存器置为 R0 的值
ACALL SIN
SETB P1.4
RET
;*******写使能子程序
;*入口参数:无
WREN: SETB P1.2 ;将 WP 写保护管脚置高,打开写保护。
SETB P1.4
MOV R7,#10H
ACALL DELAY
CLR P1.4
MOV A,#06H;写使能指令
ACALL SIN
SETB P1.4
RET
;*******写入子程序
;*入口参数:
;*R0 要写入的数据
;*R1 要写入的地址
WRITE: ACALL WREN
SETB P1.4
MOV R7,#10H
ACALL DELAY
CLR P1.4
MOV A,#02H;写指令
ACALL SIN
MOV A,R1;写入数据的开始地址
ACALL SIN
MOV A,R0;将 RO 的值写入地址为 R1的单元
ACALL SIN
SETB P1.4
RET
;*******读出子程序
;*R1 要读出数据的地址
READ: SETB P1.4
MOV R7,#10H
ACALL DELAY
CLR P1.4
MOV A,#03H;读指令
ACALL SIN
MOV A,R1;读以 R1 为地址的数据
ACALL SIN
ACALL SOUT
MOV R0,A
SETB P1.4
RET
;*******串行写入
SIN: MOV R3,#8
LOOP1: RLC A
MOV P1.1,C
SETB P1.0
CLR P1.0
DJNZ R3,LOOP1
RET
;*******串行读出
SOUT: MOV R3,#8
MOV A,#00H
LOOP2: CLR C
MOV C,P1.3
RLC A
SETB P1.0
CLR P1.0
DJNZ R3,LOOP2
RET
;*******延时子程序
;*入口参数:R7
DELAY: MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,DELAY
RET
END
|