📄 m41t81.txt
字号:
m41t81的汇编程序:
M41T81_INIT:
NOP
LCALL START
MOV A,#0D0H ;SLAVE ADDRESS :1101000Wb
LCALL WRBYTE ;SEND SLAVE ADDRESS
NOP
LCALL MACK
NOP
MOV A,#0CH ;TIME REGISTER ADDRESS
LCALL WRBYTE ;SEND TIME REGISTER ADDRESS
NOP
LCALL MACK
MOV A,#00H ;TIME DATA
LCALL WRBYTE ;SEND TIME DATA
NOP
LCALL MACK
LCALL STOP
READ_M41T81_TIME:
NOP
LCALL START
MOV A,#0D0H ;SLAVE ADDRESS :1101000Wb
LCALL WRBYTE ;SEND SLAVE ADDRESS
NOP
LCALL MACK
NOP
MOV A,#00H ;TIME REGISTER ADDRESS
LCALL WRBYTE ;SEND TIME REGISTER ADDRESS
NOP
LCALL MACK
NOP
NOP
LCALL START
MOV A,#0D1H ;SLAVE ADDRESS :1101000Rb
LCALL WRBYTE ;SEND SLAVE ADDRESS
LCALL CACK
NOP
MOV R1,#SECONDS00
MOV R3,#08H
READ_M41T81_TIME01:
LCALL RDBYTE ;READ TIME VALUE
MOV @R1,A ;SAVE VALUE
DJNZ R3,READ_M41T81_TIME02
LCALL MNACK ;最后一字节法非应答信号
LCALL STOP
RET
READ_M41T81_TIME02:
LCALL MACK
INC R1
SJMP READ_M41T81_TIME01
START:
SETB SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
RET
;结束I2C总线子程序
STOP:
CLR SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
RET
;发送应答信号
MACK:
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;发送非应答信号
MNACK:
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;发送字节子程序
;字节数据放入ACC
;每发送一字节要调用一次CACK子程序,取应答位
WRBYTE:
MOV R0,#08H
WLP:
RLC A ;取数据位
JC WR1
SJMP WR0 ;判断数据位
WLP1:
DJNZ R0,WLP
NOP
RET
WR1:
SETB SDA ;发送“1”
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
SJMP WLP1
WR0:
CLR SDA
NOP ;发送“0”
NOP
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
SJMP WLP1
;读取字节子程序
;读出的值在ACC
;每取一个字节要发送一个应答/非应答信号
RDBYTE:
MOV R0,#08H
RLP:
SETB SDA
NOP
NOP
NOP
NOP
NOP
NOP
SETB SCL ;时钟线为高,接收数据
NOP
NOP
MOV C,SDA ;读数据位
MOV A,R2
CLR SCL ;将SCL拉低,时间大于4.7us
RLC A ;进行数据位处理
MOV R2,A
NOP
NOP
NOP
DJNZ R0,RLP ;未够8位,再来一次
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -