⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd2304.asm

📁 sd2304时钟芯片的读写程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;入口:发送数据放在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 + -