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

📄 sd2304.asm

📁 sd2304时钟芯片的读写程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;===============================================================================
;  SD2300系列SRAM/EEPROM功能测试程序
;     VER1。00
;    本程序功能如下:
;
;(1)	电源上电,LED显示"TS23V1.00"版本号
;(2)	按K66键进入选择型号状态,LED显示"BP0001--",其中LED8及LED7在闪烁显示"BP"。
;       此时按K88向下选型号,依此为"BP-EL-DL-CL-BL-FL-EP-DP-CP-BP"循环
;       此时按K77向上选型号, 依此为"BP-CP-DP-EP-FL-BL-CL-DL-EL-BP"循环
;       分别表示:BP=SD2300BP/SD2301BP/SD2302BP
;	CP= SD2300CP/SD2301CP/SD2302CP
;	DP= SD2300DP/SD2301DP/SD2302DP
;	EP= SD2300EP/SD2301EP/SD2302EP 
;	FL= SD2300FLP/SD2301FLP/SD2302FLP
;	BL= SD2300BLP/SD2301BLP/SD2302BLP
;	CL= SD2300CLP/SD2301CLP/SD2302CLP 
;	DL= SD2300DLP/SD2301DLP/SD2302DLP
;	EL= SD2300ELP/SD2301ELP/SD2302ELP
;          再按K66确定型号。
;          注:SD2300A/SD2301A/SD2302A可以选用"BP"来测试,只是测试时不用RAM测试
;	       功能而已。
;(3)	按K55键进入RAM/EEPROM测试功能:
;	测试过程中LED2、LED1闪烁显示"--";
;	测试结束如RAM/EEPROM无问题则显示"OK";
;	测试结束如RAM/EEPROM有问题则显示"EE"
;(4)	按K44键清LED2、LED1显示为"--",重置时间。
;(5)	按K33键显示从SD2300芯片中读到的时间"年、月、日、星期",/INT1脚输出1HZ,
;        /INT2脚输出32768HZ。
;(6)	按K22键显示从SD2300芯片中读到的时间"    小时、分钟、秒",秒数随时间不断
;       变化,禁止/INT1和/INT2输出。此时只响应K22键.
;	重按K22键停止读取"    小时、分钟、秒",此时可响应键K55、K44、K33、K22、
;       K11.
; (7)   按K11键功能复位,从第一条操作重新执行。
;
;       注: 单片机是AT89C51,外晶振为12Mhz,在兴威帆公司的SD7218评估板(ver2.00)上
;           运行,原理图及PCB图请从网上下载.
;       Last update:2004/07/28
;       本程序仅供参考,如有问题请联系:陈工 0755-83246178,fax:83225561
;       13922865036   chendw@whwave.com.cn  http://www.whwave.com.cn
;===============================================================================
;define the general register
;LED寄存器
        DIG1    EQU     20H             ;LED第一位缓冲器
        DIG2    EQU     21H             ;
        DIG3    EQU     22H             ;
        DIG4    EQU     23H             ;
        DIG5    EQU     24H             ;
        DIG6    EQU     25H             ;
        DIG7    EQU     26H             ;
        DIG8    EQU     27H
        FLAG    EQU     28H             ;通用标志寄存器
                                        ;BIT0=1, ACK ERR
                                        ;BIT0=0 ,ACK OK

        YEAR    EQU     30H             ;年
        MONTH   EQU     31H             ;月
        DAY     EQU     32H             ;日
        WEEK    EQU     33H             ;星期
        HOUR    EQU     34H             ;小时
        MINUTE  EQU     35H             ;分钟
        SECOND  EQU     36H             ;秒
;单片机与实时时钟间通信寄存器
        TIMETEMP        EQU     2EH     ;时间数据缓存器
        TIMETX          EQU     43H     ;时间数据发送寄存器
        TIMERX          EQU     44H     ;时间数据接收寄存器
;单片机与IIC通信寄存器
        IICTEMP         EQU     2FH     ;IIC标志寄存器
        SLAVE_ADD       EQU     40H     ;SD7218地址寄存器
        DATAI1          EQU     41H
        DATAI2          EQU     42H
        TXBUF           EQU     47H     ;IIC数据发送寄存器
        RXBUF           EQU     48H     ;IIC数据接收寄存器
        KEYBUF          EQU     49H     ;键盘数据缓冲器
        READDATA        EQU     4FH

;SRAM寄存器
        SRAMADD_LO	EQU     52H     ;SRAM地址低8位
        SRAMADD_HI	EQU     53H     ;SRAM地址高8位
        SRAMDATA        EQU     54H     ;写入SRAM内的数据
        VERIFY_LO       EQU     55H     ;校验次数低八位
        VERIFY_HI       EQU     56H     ;校验次数高八位
        TYPE 		EQU     57H     ;SD2300型号寄存器
        EE_PAGE		EQU     58H
        TEMP            EQU     5CH     ;
        CON_REG2        EQU     5FH     ;SD2300的控制寄存器
        VAL_CON_REG2_12 EQU      0H     ;12H
        VAL_CON_REG2_24 EQU     20H     ;24H
;--------------------------------------------------------------------------
;define time device address
        SD2300_R        EQU     65H     ;SD2300的器件地址(读)
        SD2300_W        EQU     64H     ;SD2300的器件地址(写)
;---------------------------------------------------------------------------
;define port bit
;各通信口位代号
        SDA     EQU     P3.1            ;IIC的SDA口线
        SCL     EQU     P3.2            ;IIC的SCL口线
        KEY     EQU     P3.0            ;键盘中断信号线
        T_SDA   EQU     P3.4            ;SD2300的SDA口线
        T_SCL   EQU     P3.5            ;SD2300的SCL口线
;===========================================================================
;			*** IIC命令定义 ***
;===========================================================================

	COMMAND_RESET				EQU	68H
	COMMAND_TEST	 			EQU	6AH
	COMMAND_SHIFT_LEFT	              	EQU	61H
	COMMAND_SHIFT_RIGHT	  	        EQU	62H
	COMMAND_SHIFT_ROUND_LEFT         	EQU	63H
	COMMAND_SHIFT_ROUND_RIGHT	        EQU	64H
	COMMAND_UPDATE_DISP_DECODE              EQU	40H
	COMMAND_UPDATE_DISP		        EQU	50H
	COMMAND_FLASH_CONTROL	         	EQU	78H
	COMMAND_HIDE_CONTROL		        EQU	79H
	COMMAND_SEGMENT_ON	  	        EQU	08H
	COMMAND_SEGMENT_OFF 	        	EQU	09H
	COMMAND_READ_KEY_VALUE	                EQU	10H
	COMMAND_RW_RAM_VALUE		        EQU	80H
        COMMAND_LED_HEXS_WR                     EQU     40H

;===========================================================================
;			*** 常数定义 ***
;===========================================================================
        SLAVE2_RD                               EQU     51H    ;sd7218 ver2.0
        SLAVE2_WR                               EQU     50H
;===========================================================================

        ORG     0000H                   ;RESET
        LJMP    START

;---------------------------------------------------------------------------

        ORG     0100H
START:
        CLR     A                       ;开始初始化各寄存器
        MOV     IE,A                    ;关中断
        MOV     SP,#60H                 ;定义堆栈
        CLR     FLAG                    ;清除标志位
        LCALL   INIT_LEDBUF             ;初始化LED数据缓冲器,"TS23V1.00"
	LCALL	LONGDELAY
	LCALL	LONGDELAY
        MOV     SLAVE_ADD,#SLAVE2_WR
        LCALL   WRITE_LED8

WAIT_KEY:
	LCALL   SET_TYPE
;-----------------------------------------------------------------
GET_KEY:
        SETB    KEY
        NOP
        JB      KEY,$                   ;等待SD7218的键盘输入信号
;-----------------------------------------------------------------

        MOV     SLAVE_ADD,#SLAVE2_RD
        LCALL   READ_KEY                ;读SD7218内的键值
        MOV     A,KEYBUF
        CJNE    A,#44H,RAM_TEST_KEY
	LCALL   TIMESTATUS_RESET
        LCALL   READ_TIME
        LCALL   BCD_LEDYEARWEEK
        MOV     SLAVE_ADD,#SLAVE2_WR
        LCALL   WRITE_LED8_DECODE
        JMP	WAIT_KEY_RELEASE1

RAM_TEST_KEY:
        CJNE    A,#55H,DISP_TIME_YEARWEEK
        LCALL	LED_TYPE
        LCALL   TEST_LEDBUF
        MOV     SLAVE_ADD,#SLAVE2_WR
        LCALL   WRITE_LED8
      	LCALL   RAM_TEST
        JMP	WAIT_KEY_RELEASE

DISP_TIME_YEARWEEK:
        CJNE    A,#33H,DISP_TIME_HOURSECOND
	LCALL   TIMESTATUS_INT12ON
        LCALL   READ_TIME
        LCALL   BCD_LEDYEARWEEK
        MOV     SLAVE_ADD,#SLAVE2_WR
        LCALL   WRITE_LED8_DECODE
        JMP	WAIT_KEY_RELEASE1

DISP_TIME_HOURSECOND:
        CJNE    A,#22H,RAM_TEST_RESET_KEY
	LCALL   TIMESTATUS_INT12OFF
DISP_HOURSECOND_LOOP:
        SETB    KEY
DISP_KEY_RELEASE1:
        JNB     KEY,$
        LCALL   READ_TIME
        LCALL   BCD_LEDHOURSECOND	;
        MOV     DIG7,#0
        MOV     DIG8,#0     		;HIGH BIT DISPLAY "00",NO USED
        MOV     SLAVE_ADD,#SLAVE2_WR
        LCALL   WRITE_LED8_DECODE
        MOV     SLAVE_ADD,#SLAVE2_RD
        LCALL   READ_KEY                ;读SD7218内的键值
        MOV     A,KEYBUF
        CJNE    A,#22H,DISP_HOURSECOND_LOOP
        JMP	WAIT_KEY_RELEASE1

RAM_TEST_RESET_KEY:
        CJNE    A,#11H,WAIT_KEY_RELEASE1
	JMP     START			;RESET
SHIFT_ROUND_LEFT_KEY:

WAIT_KEY_RELEASE:
        MOV     SLAVE_ADD,#SLAVE2_WR
        LCALL   WRITE_LED8
WAIT_KEY_RELEASE1:
        JNB     KEY,$
	JMP	GET_KEY



;==================读键值子程序===========================================
;功能:                                                                  |
;入口:NONE                                                              |
;出口:          						         |
;影响资源:       							 |
;==========================================================================
READ_KEY:
	LCALL	IICSTART
        JB      FLAG.1,ERR_IICSTOP      ;如SDA线被箝位为低电平则退出
        MOV     A,SLAVE_ADD
	MOV	TXBUF,A                 ;送SD7218地址
	LCALL	SENDH_L
        JB      FLAG.0,ERR_IICSTOP      ;ACK信号不正常则退出.
        MOV     TXBUF,#COMMAND_READ_KEY_VALUE
        LCALL   SENDH_L                 ;送读键命令
RD_KEY1:
	LCALL	RXH_L
	MOV	A,RXBUF
        MOV     KEYBUF,A
RD_KEY2:
        CALL    NOACK
        LCALL   IICSTOP
RD_KEY_RET:
        RET

ERR_IICSTOP:
        LCALL   IICSTOP
        RET




;======================写8个LED8数据程序====================================
;功能:        							           |
;入口:                  						   |
;出口:NONE                                                                |
;影响资源:        						           |
;===========================================================================
WRITE_LED8:
	LCALL	IICSTART
        JNB     FLAG.1,LED8_WRITE_1
        LJMP    ERR_IICSTOP             ;SDA线被箝位为低电平则退出
LED8_WRITE_1:
        MOV     A,SLAVE_ADD
	MOV	TXBUF,A                 ;送SD7218地址
	LCALL	SENDH_L
        JNB     FLAG.0,LED8_WRITE_2
        LJMP    ERR_IICSTOP             ;ACK信号不正常则退出?
LED8_WRITE_2:
        MOV     TXBUF,#COMMAND_UPDATE_DISP
        LCALL   SENDH_L                 ;送多字节下载数据但不译码命令
        MOV     R0,#DIG1
	MOV	R1,#08H
LED8_WRITE_3:
        MOV	A,@R0
	MOV	TXBUF,A
	LCALL	SENDH_L
	INC	R0
	DJNZ	R1,LED8_WRITE_3
	LCALL	IICSTOP
	RET

;======================写8个LED8数据程序====================================
;功能:        							           |
;入口:                  						   |
;出口:NONE                                                                |
;影响资源:        						           |
;===========================================================================
WRITE_LED8_DECODE:
	LCALL	IICSTART
        JNB     FLAG.1,LED8_WRITE_1D
        LJMP    ERR_IICSTOP             ;SDA线被箝位为低电平则退出
LED8_WRITE_1D:
        MOV     A,SLAVE_ADD
	MOV	TXBUF,A                 ;送SD7218地址
	LCALL	SENDH_L
        JNB     FLAG.0,LED8_WRITE_2D
        LJMP    ERR_IICSTOP             ;ACK信号不正常则退出?
LED8_WRITE_2D:
        MOV     TXBUF,#COMMAND_UPDATE_DISP_DECODE
        LCALL   SENDH_L                 ;送多字节下载数据但不译码命令
        MOV     R0,#DIG1
	MOV	R1,#08H
LED8_WRITE_3D:
        MOV	A,@R0
	MOV	TXBUF,A
	LCALL	SENDH_L
	INC	R0
	DJNZ	R1,LED8_WRITE_3D
	LCALL	IICSTOP
	RET

;======================  LED FLASH  =======================================
;功能:        							           |
;入口:                  						   |
;出口:NONE                                                                |
;影响资源:        						           |
;===========================================================================
LED_FLASH:
	LCALL	IICSTART
LED_FLASH_1:
        MOV     A,SLAVE_ADD
	MOV	TXBUF,A                 ;送SD7218地址
	LCALL	SENDH_L
LED8_FLASH_2:
        MOV     TXBUF,#COMMAND_FLASH_CONTROL
        LCALL   SENDH_L                 ;送闪烁命令
	MOV     A,TEMP			;FLASH DATA
        MOV     TXBUF,A
        LCALL   SENDH_L
	LCALL	IICSTOP
	RET

;======================写单个BYTE数据程序=================================
;功能:      							         |
;入口:                  						 |
;出口:NONE                                                              |
;影响资源:        					            	 |
;=========================================================================
WRITE_BYTE:
	LCALL	IICSTART
        JNB     FLAG.1,BYTE_WRITE_1
        LJMP    ERR_IICSTOP             ;SDA线被箝位为低电平则退出
BYTE_WRITE_1:
        MOV     A,SLAVE_ADD
	MOV	TXBUF,A                 ;送SD7218地址
	LCALL	SENDH_L
        JNB     FLAG.0,BYTE_WRITE_2
        LJMP    ERR_IICSTOP             ;ACK信号不正常则退出?
BYTE_WRITE_2:
        MOV     A,DATAI1
        MOV     TXBUF,A
        LCALL   SENDH_L                 ;送单字节命令
        MOV     A,DATAI2
        MOV     TXBUF,A
        LCALL   SENDH_L                 ;送单字节命令
	LCALL	IICSTOP
	RET
;============================ACK===========================================
;功能:延时         入口:NONE             出口:NONE                     |
;影响资源:                                                               |
;==========================================================================
ACK:    CLR      IICTEMP.1
        LCALL    BITOUT
        RET

;============================ACK===========================================
;功能:延时         入口:NONE             出口:NONE                     |
;影响资源:                                                               |
;==========================================================================
NOACK:  SETB     IICTEMP.1
        LCALL    BITOUT
        RET

;===============================保存错误代码===============================
;功能:保存MCU与IIC接口通信时的错误状态                                   |
;入口:IICTEMP.0=ACK位值?                                                 |
;出口:FLAG.0 =错误代码                                                   |
;==========================================================================
ACK_ERR:
        JNB     IICTEMP.0,ACK_ERR_RET   ;检查ACK信号是否正常
        SETB    FLAG.0                  ;置ACK出错标志位
ACK_ERR_RET:
        RET
;===============================启用IIC总线================================
;功能:开启7218的IIC总线
;入口:NONE       出口:NONE
;影响资源:NONE
;==========================================================================
IICSTART:
        CLR     FLAG.1
	SETB	SDA
	SETB	SCL
	LCALL	DELAY_7218
        JB      SDA,IIC_SDAHI
        SETB    FLAG.1
IIC_SDAHI:
	CLR	SDA
        LCALL   DELAY_7218
	CLR	SCL
        LCALL   DELAY_7218
        RET
;===============================关闭IIC总线================================
;功能:关闭7218IIC总线
;入口:NONE       出口:NONE
;影响资源:NONE
;==========================================================================
IICSTOP:CLR	SDA
	SETB	SCL
	LCALL	DELAY_7218
	SETB	SDA
	LCALL	DELAY_7218
	RET
;============================发送一个字节,由高位到低位发送================
;功能:从MCU发送一个字节给7218,由高位到低位发送                           |

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -