新闻| 论坛| 博客| 在线研讨会
对AT24C04进行读写操作的汇编程序
zhchxgh| 2009-07-05 14:31:14 阅读:3880 发布文章

对AT24C04进行读写操作的汇编程序

INDI EQU 0X0
RTCC EQU 0X1
PC EQU 0X2
STATUS EQU 0X3
FSR EQU 0X4
PORT5 EQU 0X5
PORT6 EQU 0X6
PORT7 EQU 0X7
SCL EQU 0X6,0
SDA EQU 0X6,1
INF EQU 0X0F
YS-1 EQU 0X10
YS-2 EQU 0X11
YS-3 EQU 0X12
STACK_S EQU 0X13
STACK_A EQU 0X14
SLAVE EQU 0X15
KWRITE EQU 0X16
YWRITE EQU 0X17
BYTE EQU 0X18
SCNL EQU 0X19
RCNLE EQU 0X1A
RE-A EQU 0X1B
RE-B EQU 0X1C
RE-C EQU 0X1D
RE-D EQU 0X1E
ORG 0
JMP MAIN
ORG 8
MOV STACK_A,A
SWAP STACK_A
JBS KWRITE,2
JMP DCAK
DJZ YWIRE ;内部页写周期延时,每页10MS ,3.58M 2分频时为4次,
JMP DCAK
BS KWRITE,0
BC KWRITE,2
DCAK:
BC 0X0F,0
SWAP STACK_A
MOV A,STACK_A
RETI


WSLAVE: ;开始命令及从器件地址发送子程序
MOV A,@0B00000000
IOW PORT6
BS SDA
CALL YS2
BS SCL
CALL YS1
BC SDA
CALL YS2
BC SCL ;开始位
CALL YS1
MOV A,@8 ;从器件的地址和读写控制位。1,0,1,0,A2,A1,a8,R/W.
MOV CNSL
WSCL:
JBS SLAVE,7
JMP WRD
BS SDA
JMP WRG
WRD:
BC SDA
WRG:
BS SCL
CALL YS2
BC SDA
CALL YS1
BC SCL
RLC SLAVE
DJZ CNSL
JMP WSCL
MOV A,@0B00000010 ;设置SDA为输入,测ACK应答信号
IOW PORT6
BS SCL
CALL YS2
JBS SDA
JMP DACK
CALL YS2
JBS SDA
JMP DACK
JMP CACK
CACK:
BC SCL
BC KWRITE,1 ;测不到ACK应答信号标志位
RET

DACK:
BC SCL
BS KWRITE,1 ;测到ACK应答信号标志位
RET
WBYTE: ;字节地址的发送子程序,a7,a6,a5,a4,a3,a2,a1,a0,
MOV A,@0B00000000
IOW PORT6
BC SDA
CALL YS1
BS SCL
MOV A,@8
MOV CNSL
WSUL:
JBS BYTE,7
JMP WBD
BS SDA
JMP WBG
WBD:
BC SDA
WBG:
CALL YS2
BC SDA
CALL YS1
BC SCL
RLC BYTE
DJZ CNSL
JMP WSUL
MOV A,@0B00000010 ;设置SDA为输入,测ACK应答信号
IOW PORT6
BS SCL
CALL YS2
JBS SDA
JMP AACK
CALL YS2
JBS SDA
JMP AACK
JMP BACK
BACK:
BC SCL
BC KWRITE,1 ;测不到ACK应答信号标志位
RET
AACK:
BC SCL
BS KWRITE,1 ;测到ACK应答信号标志位
NOP
RET
WSTOP:
MOV A,@0B00000000 ;写一个停止信号
IOW PORT6
BC SDA
CALL YS2
BS SCL
CALL YS2
BS SDA
CALL YS2
BC SCL
CALL YS1
RET
YS3: ;内部页写周期延时,每页10MS ,3.58M 2分频时为4次,
MOV YWRITE,A ;内部页写周期延时计数器
BC KWRITE,0 ;内部页写周期延时结束标志位
BS KWRITE,2 ;内部页写周期延时开始标志位
MOV YWRITE,A
RET
RBYTE: ;位读子程序
MOV A,@0B00000010
MOV A,@8 ;数据寄存器为8BITS
MOV CNSL
RSCL:
RLC RCNLE
BS SCL
CALL YS2
JBS SDA
JMP RRD
BS RCNLE,0
JMP RRG
RRD:
BC RCNLE,0
RRG:
BC SCL
CALL YS2
DJZ CNSL
JMP RSCL
RET
SETACK:
MOV A,@0B00000000 ;设置SDA为输入,测ACK应答信号
IOW PORT6
BC SDA
CALL YS2
BS SCL
CALL YS2 ;设置ACK应答信号
BC SDA
RET
YS1:
MOV A,@3
MOV YS-2,A
KOPL:
NOP
DJZ YS-2
JMP KOPL
RET
YS2:

MOV A,@6
MOV YS-3,A
KOPLL:000
NOP
DJZ YS-3
JMP KOPLL
RET
MAIN:
MOV A,@0X0
IOW 0X0E
MOV A,@0B11000000
CONTW
CLR 0X0F
MOV A,@0X01
IOW 0X0F
ENI
MOV A,@0X10
MOV 0X4,A
LOPKN:
MOV A,@0
MOV 0X0,A
JBS 0X4,6
JMP KOL
JMP KIL
KOL:
NOP
INC 0X4
JMP LOPKN
KIL:
BS 0X4,6
MOV A.@0B00000000
IOW PORT5
IOW PORT6

WRITE:
JBS KWRITE,0 ;内部页写周期延时结束标志位
JMP SSOP
MOV A,@0B10100000
MOV SLAVE,A
CALL WSLAVE
JBS KWRITE,1 ;写操作子程序,AT24C04 页写缓冲器有16字节
JMP WCUCO ;连续写不能超过16次,(每次为8-BITS,)
MOV A,@0B00000000 ;内部页写周期每页要大于10mS,通信速率为100K
MOV BYTE,A
CALL WBYTE
JBS KWRITE,1
JMP WCUCO
MOV A,@0B10101010 ;数据1次
MOV BYTE,A
CALL WBYTE
JBS KWRITE,1
JMP WCUCO
MOV A,@0B10101010 ;数据2次
MOV BYTE,A
CALL WBYTE
JBS KWRITE,1
JMP WCUCO
MOV A,@0B10101010 ;数据3次
MOV BYTE,A
CALL WBYTE
JBS KWRITE,1
JMP WCUCO
MOV A,@0B10101010 ;数据4次
MOV BYTE,A
CALL WBYTE
JBS KWRITE,1
JMP WCUCO
MOV A,@0B10101010 ;数据5次
MOV BYTE,A
CALL WBYTE
JBS KWRITE,1
JMP WCUCO
CALL WSTOP
MOV A,@20
CALL YS3 ;调用内部页写周期延时
READ: ;读数据
JBS KWRITE,0
JMP SSOP
MOV A,@0B10100001 ;写入从器件地址
MOV SLAVE,A
CALL WSLAVE
JBS KWRITE,1
JMP RCUCO
MOV A,@0X0 ;写入读伪地址
MOV BYTE,A
CALL WBYTE
JBS KWRITE,1
JMP RCUCO
CALL WSTOP
MOV A,@0B10100001 ;写入从器件地址
MOV SLAVE,A
CALL WSLAVE
JBS KWRITE,1
JMP RCUCO
CALL RBYTE ;数据读出开始
CALL SETACK ;ACK确认
MOV A,RCNLE
MOV RE-A,A
CALL RBYTE ;数据读出开始
CALL SETACK ;ACK确认
MOV A,RCNLE
MOV RE-B,A
CALL RBYTE ;数据读出开始
CALL SETACK ;ACK确认
MOV A,RCNLE
MOV RE-C,A
CALL RBYTE ;数据读出开始
BS SCL
CALL YS2
CALL YS2 ;ON ACK
BC SCL
CALL WSTOP ;发停止位,数据读取结束
MOV A,RCNLE
MOV RE-D,A
JMP LOP
WCUCO:
JMP WRITE
RCUCO:
JMP READ
LOP:
CALL YS2
NOP
NOP
NOP
CALL YS2
NOP
NOP
NOP
JMP LPO
EOP

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客