📄 sd2304.asm
字号:
;入口:发送数据放在TXBUF 出口:NONE |
;影响资源:A,R2,TXBUF |
;==========================================================================
SENDH_L:MOV A,TXBUF
MOV R2,#08H
CLR FLAG.0
SENDH_L1:
MOV C,ACC.7
MOV IICTEMP.1,C
LCALL BITOUT
RL A
DJNZ R2,SENDH_L1
LCALL BITIN
LCALL ACK_ERR
RET
;=================================接收一个字节=============================
;功能:MCU从IIC总线接收一个字节,MSB在前,LSB在后 |
;入口:NONE 出口:接收数据放在RXBUF中 |
;影响资源:A,R2,TIMEBIT,RXBUF |
;==========================================================================
RXH_L: MOV R2,#08H
RXH_L1: LCALL BITIN
MOV C,IICTEMP.0
MOV ACC.7,C
RLC A
DJNZ R2,RXH_L1
MOV RXBUF ,A
RET
;=================================接收一个字节=============================
;功能:MCU从IIC总线接收一个字节,LSB在前,MSB在后 |
;入口:NONE 出口:接收数据放在RXBUF中 |
;影响资源:A,R2,TIMEBIT,RXBUF |
;==========================================================================
RXL_H: MOV R2,#08H
RXL_H1: LCALL BITIN
MOV C,IICTEMP.0
RRC A
DJNZ R2,RXL_H1
MOV RXBUF ,A
RET
;================================送出一位数================================
;功能:从MCU发送一位数给7218 |
;入口:发送位数放在EEPREM.1 出口:NONE |
;影响资源:A,IICTEMP |
;==========================================================================
BITOUT:
MOV C,IICTEMP.1
MOV SDA,C
LCALL DELAY_7218
SETB SCL
LCALL DELAY_7218
CLR SCL
LCALL DELAY_7218
RET
;=================================读入一位数===============================
;功能:MCU从7218接收一位数 |
;入口:NONE 出口:接收位数放在IICTEMP.0 |
;影响资源:A,IICTEMP |
;==========================================================================
BITIN:
SETB SDA
SETB SCL
LCALL DELAY_7218
MOV C,SDA
MOV IICTEMP.0,C
CLR SCL
CLR SDA
LCALL DELAY_7218
RET
;============================短延时子程序==================================
;功能:延时 入口:NONE 出口:NONE |
;影响资源:R7,PSW |
;==========================================================================
DELAY: MOV R7,#2
DELAY1: NOP
DJNZ R7,DELAY1
RET
;--------
DELAY_7218:
MOV R7,#10
DELAY1_7218:
NOP
DJNZ R7,DELAY1_7218
RET
LONGDELAY: ;DELAY 300MS
MOV R6,#240
LD0: MOV R7,#250 ;5*250*240
LD1: NOP
NOP
NOP
DJNZ R7,LD1
DJNZ R6,LD0
RET
DELAY10MS: ;DELAY >10MS
MOV R6,#11
LD00: MOV R7,#250 ;5*250*11
LD10: NOP
NOP
NOP
DJNZ R7,LD10
DJNZ R6,LD00
RET
;============================写八位LED数据缓冲器程序=======================
;功能:写八位LED数据缓冲器 |
;入口:NONE 出口:NONE |
;影响资源: A |
;==========================================================================
INIT_LEDBUF:
MOV R0,#DIG8
MOV R3,#8
INIT_LEDBUF_LOOP:
MOV A,R3
DEC A
MOV DPTR,#TABLE
MOVC A,@A+DPTR ;查表取LED显示数据
MOV @R0,A
DEC R0
DJNZ R3,INIT_LEDBUF_LOOP ;赋值完八个LED数据?
RET
TABLE: DB 3FH,3FH,86H,3EH,4FH,5BH,6DH,31H ;"TS23 V1.00"
;==================读实时时钟实时数据寄存器子程序==========================
;功能:从实时时钟读入当前时间数据 |
;入口:NONE |
;出口:接收数据放在年、月、日、星期、时、分、秒各寄存器 |
;影响资源:A,R0,R3,TIMETX,TIMERX,YEAR,MONTH,DAY,WEEK,HOUR,MINUTE,SECOND |
;==========================================================================
READ_TIME:
RDTIME_LOOP:
LCALL T_IICSTART
LCALL T_IICSTOP
LCALL T_IICSTART
JB FLAG.1,T_ERR_IICSTOP ;如SDA线被箝位为低电平则退出
MOV TIMETX,#SD2300_W ;发送写时钟SD2300的数据命令
LCALL T_SENDH_L
JB FLAG.0,T_ERR_IICSTOP ;ACK信号不正常则退出.
MOV TIMETX,#00H ;读时间内部的起始地址
LCALL T_SENDH_L
LCALL T_IICSTART ;重新开始信号
MOV TIMETX,#SD2300_R ;发送读时钟SD2300的数据命令
LCALL T_SENDH_L
MOV R0,#SECOND
MOV R3,#07H
RDTIME1:
LCALL T_RXH_L
MOV A,TIMERX
MOV @R0,A
DEC R0
DJNZ R3,RDTIME2 ;读完一个字节数据后确认数据传输
JMP RDTIME3 ;若为最后一个字节数据则为NOACK
RDTIME2:
CALL T_ACK
JMP RDTIME1
RDTIME3:
CALL T_NOACK
LCALL T_IICSTOP
RDTIME_RET:
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 DELAY
JB T_SDA,T_IIC_SDAHI
SETB FLAG.1
T_IIC_SDAHI:
CLR T_SDA
LCALL DELAY
CLR T_SCL
LCALL DELAY
RET
;===============================关闭IIC总线================================
;功能:关闭实时时钟IIC总线
;入口:NONE 出口:NONE
;影响资源:NONE
;==========================================================================
T_IICSTOP:CLR T_SDA
SETB T_SCL
LCALL DELAY
SETB T_SDA
LCALL DELAY
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
MOV TIMETEMP.1,C
LCALL T_BITOUT
RL A
DJNZ R2,T_SENDH_L1
LCALL T_BITIN
LCALL T_ACK_ERR
RET
;=================================接收一个字节=============================
;功能:MCU从IIC总线接收一个字节,MSB在前,LSB在后 |
;入口:NONE 出口:接收数据放在RXBUF中 |
;影响资源:A,R2,TIMEBIT,RXBUF |
;==========================================================================
T_RXH_L:MOV R2,#08H
T_RXH_L1: LCALL T_BITIN
MOV C,TIMETEMP.0
MOV ACC.7,C
RLC A
DJNZ R2,T_RXH_L1
MOV TIMERX,A
RET
;================================送出一位数================================
;功能:从MCU发送一位数给实时时钟 |
;入口:发送位数放在EEPREM.1 出口:NONE |
;影响资源:A,TIMETEMP |
;==========================================================================
T_BITOUT:
MOV C,TIMETEMP.1
MOV T_SDA,C
LCALL DELAY
SETB T_SCL
LCALL DELAY
CLR T_SCL
LCALL DELAY
RET
;=================================读入一位数===============================
;功能:MCU从实时时钟接收一位数 |
;入口:NONE 出口:接收位数放在TIMETEMP.0 |
;影响资源:A,TIMETEMP |
;==========================================================================
T_BITIN:
SETB T_SDA
SETB T_SCL
LCALL DELAY
MOV C,T_SDA
MOV TIMETEMP.0,C
CLR T_SCL
CLR T_SDA
LCALL DELAY
RET
;============================写状态寄存器程序==============================
;功能:读/写实时时钟状态寄存器,对其进行设置 |
;入口:NONE 出口:NONE |
;影响资源: A,TIMETX |
;==========================================================================
TIMESTATUS_INT12ON:
LCALL T_IICSTART
LCALL T_IICSTOP
LCALL T_IICSTART
JNB FLAG.1,TIME_SETMODE_1
LJMP T_ERR_IICSTOP ;SDA线被箝位为低电平则退出
TIME_SETMODE_1:
MOV TIMETX,#SD2300_W ;发送时钟SD2300的器件地址(写)
LCALL T_SENDH_L
JNB FLAG.0,TIME_SETMODE_2
LJMP T_ERR_IICSTOP ;ACK信号不正常则退出?
TIME_SETMODE_2:
MOV TIMETX,#0E0H ;设置时钟数据的内部起始地址为0EH
LCALL T_SENDH_L ;
MOV TIMETX,#11010011B ;向0EH寄存器写数据,INTA OUTPUT 1HZ
LCALL T_SENDH_L
MOV TIMETX,#00100100B ;向0FH寄存器写数据,INTB OUTPUT 32768HZ
LCALL T_SENDH_L
LCALL T_IICSTOP ;
RET
;-----------------------------------
TIMESTATUS_INT12OFF:
LCALL T_IICSTART
LCALL T_IICSTOP
LCALL T_IICSTART
MOV TIMETX,#SD2300_W ;发送时钟SD2300的器件地址(写)
LCALL T_SENDH_L
MOV TIMETX,#0E0H ;设置时钟数据的内部起始地址为0EH
LCALL T_SENDH_L
MOV TIMETX,#00000000B ;向0EH寄存器写数据,TURN OFF INTA/INTB
LCALL T_SENDH_L
LCALL T_IICSTOP
RET
;-----------------------------------
TIMESTATUS_RESET:
LCALL T_IICSTART
LCALL T_IICSTOP
LCALL T_IICSTART
MOV TIMETX,#SD2300_W ;发送时钟SD2300的器件地址(写)
LCALL T_SENDH_L
MOV TIMETX,#0E0H ;设置时钟数据的内部起始地址为0EH
LCALL T_SENDH_L ;
MOV TIMETX,#11000000B ;向0EH寄存器写数据,INTB OUTPUT 32768HZ
LCALL T_SENDH_L
MOV TIMETX,#00100000B ;向0FH寄存器写数据
LCALL T_SENDH_L
MOV TIMETX,#55H ;SECOND
LCALL T_SENDH_L
MOV TIMETX,#59H ;MINUTE
LCALL T_SENDH_L
MOV TIMETX,#23H ;HOUR
LCALL T_SENDH_L
MOV TIMETX,#1H ;WEEK
LCALL T_SENDH_L
MOV TIMETX,#12H ;DAY
LCALL T_SENDH_L
MOV TIMETX,#07H ;MONTH
LCALL T_SENDH_L
MOV TIMETX,#04H ;YEAR
LCALL T_SENDH_L ;
MOV TIMETX,#00H ;清零数字调整寄存器
LCALL T_SENDH_L
LCALL T_IICSTOP ;
RET
;----------------------------------------------------
BCD_LEDHOURSECOND:
MOV A,HOUR
SWAP A
ANL A,#0FH
MOV DIG6,A
MOV A,HOUR
ANL A,#0FH
MOV DIG5,A
MOV A,MINUTE
SWAP A
ANL A,#0FH
MOV DIG4,A
MOV A,MINUTE
ANL A,#0FH
MOV DIG3,A
MOV A,SECOND
SWAP A
ANL A,#0FH
MOV DIG2,A ;
MOV A,SECOND
ANL A,#0FH
MOV DIG1,A
RET
BCD_LEDYEARWEEK:
MOV A,YEAR
SWAP A
ANL A,#0FH
MOV DIG8,A
MOV A,YEAR
ANL A,#0FH
MOV DIG7,A
MOV A,MONTH
SWAP A
ANL A,#0FH
MOV DIG6,A
MOV A,MONTH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -