📄 9300.asm
字号:
STOP:
CLR SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
SETB SDA ;结束总线
NOP ;保证一个终止信号和起始信号的空闲时间大于4.7us
NOP
NOP
NOP
RET
MACK:
CLR SDA ;将SDA置0
NOP
NOP
SETB SCL
NOP ;保持数据时间,即SCL为高时间大于4.7us
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
MNACK:
SETB SDA ;将SDA置1
NOP
NOP
SETB SCL
NOP
NOP ;保持数据时间,即SCL为高时间大于4.7us
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
CACK:
SETB SDA
NOP
NOP
SETB SCL
CLR ACK
NOP
NOP
MOV C,SDA
JC CEND
SETB ACK ;判断应答位
CEND:
NOP
CLR SCL
NOP
RET
MNACK1:
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
WRBYTE:
MOV R2,#08H
WLP:
RLC A ;取数据位
JC WR1
SJMP WRO ;判断数据位
WLP1:
DJNZ R2,WLP
NOP
RET
WR1:
SETB SDA ;发送1
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
SJMP WLP1
WRO:
CLR SDA ;发送0
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
SJMP WLP1
IWRBYTE:
NOP
NOP
PUSH ACC
IWBLOOP:
LCALL START
MOV A,SLA
LCALL WRBYTE
LCALL CACK
JNB ACK,RETWRB
NOP
NOP
POP ACC
LCALL WRBYTE
LCALL CACK
LCALL STOP
RET
RETWRB:
POP ACC
LCALL STOP
NOP
NOP
RET
ASKWAT: LCALL DELAY
SETB SDAAT
LCALL DELAY
SETB SCLAT
WAITASKW:
MOV C,SDAAT
; JC WAITASKW
LCALL DELAY
CLR SCLAT
SETB SDAAT
RET
NOASK:
SETB SDAAT
NOP
NOP
NOP
SETB SCLAT
LCALL DELAY
CLR SCLAT
LCALL DELAY
RET
STARTAT: SETB SCLAT
SETB SDAAT
LCALL DELAY
CLR SDAAT
LCALL DELAY
CLR SCLAT
RET
STOPAT: CLR SCLAT
LCALL DELAY
CLR SDAAT
LCALL DELAY
SETB SCLAT
LCALL DELAY
SETB SDAAT
LCALL DELAY
RET
CACK2AT: SETB SDAAT
NOP
NOP
SETB SCLAT
CLR ACK
NOP
NOP
MOV C,SDAAT
JC CEND2AT
SETB ACK ;判断应答位
CEND2AT: NOP
CLR SCLAT
NOP
RET
RD24: PUSH ACC
LCALL STARTAT
MOV A,#0A0H
LCALL SENDDATE
LCALL ASKWAT
POP ACC
LCALL SENDDATE
LCALL ASKWAT
LCALL STARTAT
MOV A,#0A1H
LCALL SENDDATE
LCALL ASKWAT
SETB SDAAT
MOV R7,#8
CLR A
SETB SDAAT
RD000:
RL A
SETB SCLAT
NOP
NOP
MOV C,SDAAT
MOV ACC.0,C
CLR SCLAT
NOP
NOP
DJNZ R7,RD000
LCALL NOASK
LCALL STOPAT
RET
WT24: PUSH ACC
LCALL STARTAT
MOV A,#0A0H
LCALL SENDDATE
LCALL ASKWAT
POP ACC
LCALL SENDDATE
LCALL ASKWAT
MOV A,B
LCALL SENDDATE
LCALL ASKWAT
LCALL STOPAT
LCALL DELAY
RET
SENDDATE:
MOV R2,#8
LOOPW: RLC A
MOV SDAAT,C
LCALL DELAY
SETB SCLAT
LCALL DELAY
CLR SCLAT
LCALL DELAY
DJNZ R2,LOOPW
SETB SDAAT
RET
DELAY: NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
WRITE_TIME:
MOV 37H,#0h
MOV 38H,#0h
MOV 39H,#0h
MOV 3AH,#0h
MOV 3BH,#0h
MOV 3CH,#0h
MOV 3DH,#0h
MOV 3EH,#0h
MOV 3FH,#00H ; CLEAR THE RTC'RAM
LCALL TIMEWRITE_ON
LCALL T_IICSTART
JB FLAG.1,T_ERR_IICSTOP ;如SDA线被箝位为低电平则退出
TIME_WRITE_1:
MOV TIMETX,#sd2400_W ;发送写时钟sd2400的数据命令
LCALL T_SENDH_L
JB FLAG.0,T_ERR_IICSTOP ;ACK信号不正常则退出.
MOV TIMETX,#00H ;时间内部的起始地址
LCALL T_SENDH_L
TIME_WRITE_2:
MOV R0,#SECOND
MOV R1,#7H
WRTIME1:MOV A,@R0
MOV TIMETX,A
LCALL T_SENDH_L
INC R0
DJNZ R1,WRTIME1
LCALL T_IICSTOP
LCALL T_IICSTART
MOV TIMETX,#sd2400_W ;发送时钟sd2400的器件地址(写)
LCALL T_SENDH_L
MOV TIMETX,#12H ;设置时钟数据的内部起始地址为12H
LCALL T_SENDH_L ;
MOV TIMETX,#0H ;清12H的为0
LCALL T_SENDH_L
LCALL T_IICSTOP
LCALL TIMEWRITE_OFF
RET
;==================读实时时钟实时数据寄存器子程序==========================
;功能:从实时时钟读入当前时间数据 |
;入口:NONE |
;出口:接收数据放在年、月、日、星期、时、分、秒各寄存器 |
;影响资源:A,R0,R3,TIMETX,TIMERX,YEAR,MONTH,DAY,WEEK,HOUR,MINUTE,SECOND |
;==========================================================================
READ_TIME:
RDTIME_LOOP:
LCALL T_IICSTART
JB FLAG.1,T_ERR_IICSTOP ;如SDA线被箝位为低电平则退出
MOV TIMETX,#sd2400_W ;发送写时钟sd2400的数据命令
LCALL T_SENDH_L
JB FLAG.0,T_ERR_IICSTOP ;ACK信号不正常则退出.
MOV TIMETX,#0H ;读时间内部的起始地址
LCALL T_SENDH_L
LCALL T_IICSTART ;重新开始信号
MOV TIMETX,#sd2400_R ;发送读时钟sd2400的数据命令
LCALL T_SENDH_L
MOV R0,#SECOND
MOV R3,#7H
RDTIME1:
LCALL T_RXH_L
MOV A,TIMERX
MOV @R0,A
INC R0
DJNZ R3,RDTIME2 ;读完一个字节数据后确认数据传输
JMP RDTIME3 ;若为最后一个字节数据则为NOACK
RDTIME2:
CALL T_ACK
JMP RDTIME1
RDTIME3:
CALL T_NOACK
LCALL T_IICSTOP
RDTIME_RET:
ANL HOUR,#7FH ;屏蔽小时的最高位
RET
T_ERR_IICSTOP:
LCALL T_IICSTOP
RET
;============================ACK===========================================
;功能:延时 入口:NONE 出口:NONE |
;影响资源: |
;==========================================================================
T_ACK: CLR TIMETEMP.1
LCALL T_BITOUT
RET
;============================ACK===========================================
;功能:延时 入口:NONE 出口:NONE |
;影响资源: |
;==========================================================================
T_NOACK: SETB TIMETEMP.1
LCALL T_BITOUT
RET
;===============================保存错误代码===============================
;功能:保存MCU与IIC接口通信时的错误状态 |
;入口:TIMETEMP.0=ACK位缙? |
;出口:FLAG.0 =错误代码 |
;==========================================================================
T_ACK_ERR:
JNB TIMETEMP.0,T_ACK_ERR_RET ;检查ACK信号是否正常
SETB FLAG.0 ;置ACK出错标志位
T_ACK_ERR_RET:
RET
;===============================启用IIC总线================================
;功能:开启实时时钟的IIC总线
;入口:NONE 出口:NONE
;影响资源:NONE
;==========================================================================
T_IICSTART:
CLR FLAG.1
SETB T_SDA
SETB T_SCL
LCALL DELAY1
JB T_SDA,T_IIC_SDAHI
SETB FLAG.1
T_IIC_SDAHI:
CLR T_SDA
LCALL DELAY1
CLR T_SCL
LCALL DELAY1
RET
;===============================关闭IIC总线================================
;功能:关闭实时时钟IIC总线
;入口:NONE 出口:NONE
;影响资源:NONE
;==========================================================================
T_IICSTOP:CLR T_SDA
SETB T_SCL
LCALL DELAY1
SETB T_SDA
LCALL DELAY1
RET
;============================发送一个字节,由高位到低位发送================
;功能:从MCU发送一个字节给实时时钟,由高位到低位发送 |
;入口:发送数据放在TIMETX 出口:NONE |
;影响资源:A,R2,TIMETX |
;==========================================================================
T_SENDH_L:MOV A,TIMETX
MOV R2,#08H
CLR FLAG.0
T_SENDH_L1:
MOV C,ACC.7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -