;=============================================================================== ; SD2200系列SRAM/EEPROM功能测试程序 ; VER1。00 ; 上电显示:"TS22U1.00" ; 本程序 ; 程序功能如下: ; ; 注: 单片机是AT89C51,外晶振为12Mhz,在兴威帆公司的SD7218评估板上运行 ; Last update:2003/07/29 ; 本程序仅供参考,如有问题请联系:陈工 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 ;温度数据寄存器 TEMPHI EQU 50H ;温度高字节 TEMPLO EQU 51H ;温度低字节 ;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 ;SD2200型号寄存器 EE_PAGE EQU 58H TEMP EQU 5CH ; ;--------------------------------------------------------------------------- ;define port bit ;各通信口位代号 SDA EQU P3.1 ;IIC的SDA口线 SCL EQU P3.2 ;IIC的SCL口线 KEY EQU P3.0 ;键盘中断信号线 T_SDA EQU P3.4 ;SD2200的SDA口线 T_SCL EQU P3.5 ;SD2200的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数据缓冲器,"TS22U1.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 LED_TYPE LCALL TEST_LEDBUF JMP WAIT_KEY_RELEASE 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总线================================ ;功能:开启实时时钟的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总线================================ ;功能:关闭实时时钟IIC总线 ;入口:NONE 出口:NONE ;影响资源:NONE ;========================================================================== IICSTOP:CLR SDA SETB SCL LCALL DELAY_7218 SETB SDA LCALL DELAY_7218 RET ;============================发送一个字节,由高位到低位发送================ ;功能:从MCU发送一个字节给实时时钟,由高位到低位发送 | ;入口:发送数据放在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发送一位数给实时时钟 | ;入口:发送位数放在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从实时时钟接收一位数 | ;入口: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,#15 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,5BH,5BH,6DH,31H ;"TS22 V1.00" ;==================读实时时钟实时数据寄存器子程序========================== ;功能:从实时时钟读入当前时间数据 | ;入口: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,#65H ;发送读时钟数据命令 LCALL T_SENDH_L JB FLAG.0,T_ERR_IICSTOP ;ACK信号不正常则退出. MOV R0,#YEAR MOV R3,#07H T_RDTIME1: LCALL T_RXL_H MOV A,TIMERX MOV @R0,A INC R0 DJNZ R3,RDTIME2 ;读完一个字节数据后确认数据传输 JMP RDTIME3 ;若为最后一个字节数据则为NOACK RDTIME2: CALL T_ACK JMP T_RDTIME1 RDTIME3: CALL T_NOACK LCALL T_IICSTOP ANL HOUR,#03FH ;小时的高两位在24小时制时没有用,如果是12小时制请删掉此行. 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发送一个字节给实时时钟,由低位到高位发送 | ;入口:发送数据放在TIMETX 出口:NONE | ;影响资源:A,R2,TIMETX | ;========================================================================== T_SENDL_H:MOV A,TIMETX MOV R2,#08H CLR FLAG.0 T_SENDL_H1: MOV C,ACC.0 MOV TIMETEMP.1,C LCALL T_BITOUT RR A DJNZ R2,T_SENDL_H1 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从IIC总线接收一个字节,LSB在前,MSB在后 | ;入口:NONE 出口:接收数据放在RXBUF中 | ;影响资源:A,R2,TIMEBIT,RXBUF | ;========================================================================== T_RXL_H:MOV R2,#08H T_RXL_H1: LCALL T_BITIN MOV C,TIMETEMP.0 RRC A DJNZ R2,T_RXL_H1 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 JNB FLAG.1,TIME_SETMODE_1 LJMP T_ERR_IICSTOP ;SDA线被箝位为低电平则退出 TIME_SETMODE_1: MOV TIMETX,#60H ;发送写时钟状态寄存器_1命令 LCALL T_SENDH_L JNB FLAG.0,TIME_SETMODE_2 LJMP T_ERR_IICSTOP ;ACK信号不正常则退出? TIME_SETMODE_2: MOV TIMETX,#32H ;24小时进制,/INT1及/INT2脚的输出 LCALL T_SENDL_H ; LCALL T_IICSTOP ; LCALL T_IICSTART MOV TIMETX,#62H ;发送写时钟状态寄存器_2命令 LCALL T_SENDH_L MOV TIMETX,#18H ;/INT1为32768hz,/INT2脚输出固定频率 LCALL T_SENDL_H ; LCALL T_IICSTOP ; LCALL T_IICSTART MOV TIMETX,#6AH ;发送写INT1_2命令 LCALL T_SENDH_L MOV TIMETX,#10H ;/INT2输出 16HZ LCALL T_SENDL_H ; LCALL T_IICSTOP ; RET ;----------------------------------- TIMESTATUS_INT12OFF: LCALL T_IICSTART MOV TIMETX,#62H ;发送写时钟状态寄存器_2命令 LCALL T_SENDH_L MOV TIMETX,#00H ;关闭/INT1和/INT2脚的输出 LCALL T_SENDL_H ; LCALL T_IICSTOP RET ;============================写状态寄存器程序============================== ;功能:读/写实时时钟状态寄存器,对其进行设置 | ;入口:NONE 出口:NONE | ;影响资源: A,TIMETX | ;========================================================================== TIME_RESET: LCALL T_IICSTART JNB FLAG.1,TIME_RESET_1 LJMP T_ERR_IICSTOP ;SDA线被箝位为低电平则退出 TIME_RESET_1: MOV TIMETX,#60H ;读写状态寄存器_1命令 LCALL T_SENDH_L MOV TIMETX,#03H ;RESET命令,24H制 LCALL T_SENDL_H 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 ANL A,#0FH MOV DIG5,A MOV A,DAY SWAP A ANL A,#0FH MOV DIG4,A MOV A,DAY ANL A,#0FH MOV DIG3,A MOV A,WEEK SWAP A ANL A,#0FH MOV DIG2,A ; MOV A,WEEK ANL A,#0FH MOV DIG1,A RET ;==============================WRITE SRAM/EEPROM ========================== ;功能:把数据储存到SD2200的SRAM的全部地址中去 ;入口:数据首地址在A中,储存首地址在SRAMADD中,数据个数在SRAMNUM中 ;出口:无 ;影响资源:A,TIMETX,SRAMADD,R0,R1,SRAMNUM ;========================================================================== WRITESRAM: LCALL T_IICSTART JNB FLAG.1,SRAM_WRITE_1 LJMP SRAM_ERROR ;SDA线被箝位为低电平则退出 SRAM_WRITE_1: MOV TIMETX,#0A0H ;A2A1A0="000" LCALL T_SENDH_L ;SLAVE ADDRESS JNB FLAG.0,SRAM_WRITE_2 LJMP SRAM_ERROR ;ACK信号不正常则退出? SRAM_WRITE_2: MOV A,SRAMADD_LO ;RAM首地址在SRAMADD_LO中 MOV TIMETX,A ;WORD ADDRESS LCALL T_SENDH_L MOV A,TYPE CJNE A,#3,SRAM_WRITE_NODE1 ;SD2200DP JMP SRAM_WRITE_DE SRAM_WRITE_NODE1: CJNE A,#4,SRAM_WRITE_NODE ;SD2200EP SRAM_WRITE_DE: MOV A,#0 ;RAM首地址的低八位 MOV TIMETX,A ;WORD ADDRESS LCALL T_SENDH_L SRAM_WRITE_NODE: MOV A,SRAMADD_HI ;RAM页地址在SRAMADD_HI中 MOV R0,A WRITESRAM_PAGES: MOV A,#0 MOV R1,A ; WRITESRAM_LOOP: ;循环写入连续数据 MOV A,SRAMDATA MOV TIMETX,A LCALL T_SENDH_L DJNZ R1,WRITESRAM_LOOP DJNZ R0,WRITESRAM_PAGES LCALL T_IICSTOP RET ;==========================读取SRAM 数据子程序============================== ;功能:从SRAM中读取数据 ;入口:储存数据首地址在A中,SRAM读取数据首地址在SRAMADD中,数据个数在SRAMNUM中 ;出口:读取数据储存在CPU中 ;影响资源:A,TIMETX,SRAMADD,R0,R1,SRAMNUM,SRAMRX ;=========================================================================== READSRAM: LCALL T_IICSTART JNB FLAG.1,SRAM_READ_1 LJMP SRAM_ERROR ;SDA线被箝位为低电平则退出 SRAM_READ_1: MOV TIMETX,#0A0H ;A2A1A0="000" LCALL T_SENDH_L ;SLAVE ADDRESS JNB FLAG.0,SRAM_READ_2 LJMP SRAM_ERROR ;ACK信号不正常则退出? SRAM_READ_2: MOV A,SRAMADD_LO ;RAM首地址在SRAMADD_LO中 MOV TIMETX,A ;WORD ADDRESS LCALL T_SENDH_L MOV A,TYPE CJNE A,#3,SRAM_READ_NODE1 ;SD2200DP JMP SRAM_READ_DE SRAM_READ_NODE1: CJNE A,#4,SRAM_READ_NODE ;SD2200EP SRAM_READ_DE: MOV A,#0 ;RAM首地址的低八位 MOV TIMETX,A ;WORD ADDRESS LCALL T_SENDH_L SRAM_READ_NODE: LCALL T_IICSTART MOV A,#0A1H ;发送读操作指令 MOV TIMETX,A LCALL T_SENDH_L MOV A,SRAMADD_HI ;RAM页地址在SRAMADD_HI中 MOV R0,A CLR FLAG.7 ;清除RAM错误标志 MOV A,#0 MOV R1,A READSRAM_LOOP: ;循环读取数据 LCALL T_RXH_L MOV A,TIMERX CJNE A,SRAMDATA,SRAM_ERROR DJNZ R1,READSRAM_NEXT ;读完一个字节数据后确认数据传输 JMP READSRAM2 READSRAM_NEXT: CALL T_ACK JMP READSRAM_LOOP READSRAM2: DJNZ R0,READSRAM_NEXT ;PAGES READSRAM_INT: CALL T_NOACK LCALL T_IICSTOP RET SRAM_ERROR: SETB FLAG.7 JMP READSRAM_INT ;============================写八位LED数据缓冲器程序======================= ;功能:写八位LED数据缓冲器 ? ? | ;入口:NONE 出口:NONE | ;影响资源: A | ;========================================================================== BIN_BCD: CLR DATAI1 CLR DATAI2 MOV A,TEMP MOV B,#10 DIV AB MOV DATAI1,A MOV DATAI2,B RET ;==============================WRITE 2K EEPROM ========================== ;功能:把数据储存到SD2200的EEPROM的全部地址中去 ;入口:数据首地址在A中,储存首地址在SRAMADD中,数据个数在SRAMNUM中 ;出口:无 ;影响资源:A,TIMETX,SRAMADD,R0,R1,SRAMNUM ;========================================================================== WRITE_EEFL: MOV R4,#0 ;PAGE SELECT WRITE_EEFL_LOOP: LCALL T_IICSTART JNB FLAG.1,EEFL_WRITE_1 LJMP SRAM_ERROR ;SDA线被箝位为低电平则退出 EEFL_WRITE_1: MOV A,R4 RL A ORL A,#0A0H ;&A2A1A0 MOV TIMETX,A LCALL T_SENDH_L ;SLAVE ADDRESS JNB FLAG.0,EEFL_WRITE_2 LJMP SRAM_ERROR ;ACK信号不正常则退出? EEFL_WRITE_2: MOV A,SRAMADD_LO ;RAM首地址在SRAMADD_LO中 MOV TIMETX,A ;WORD ADDRESS LCALL T_SENDH_L MOV A,SRAMADD_HI ;RAM页地址在SRAMADD_HI中 MOV R0,A WRITEEEFL_PAGES: MOV A,#0 MOV R1,A ; WRITEEEFL_LOOP: ;循环写入连续数据 MOV A,SRAMDATA MOV TIMETX,A LCALL T_SENDH_L LCALL DELAY10MS DJNZ R1,WRITEEEFL_LOOP DJNZ R0,WRITEEEFL_PAGES LCALL T_IICSTOP RET ;============================RAM功能测试程序=============================== ;功能:RAM功能测试程序 | ; 全RAM区先写00,再写FF,分别读出比较 | ; ? | ;入口:NONE 出口:NONE | ;影响资源: A | ;========================================================================== RAM_TEST: MOV TEMP,#03H ;FLASH DIG3,4 MOV SLAVE_ADD,#SLAVE2_WR LCALL LED_FLASH MOV SRAMADD_LO,#00H ;SRAM的地址低八位 MOV VERIFY_LO,#01H ;校验次数低八位 MOV VERIFY_HI,#00H ;校验次数高八位 MOV SRAMDATA,#000H ;写入SRAM数据的数据 LCALL WRITESRAM ;写入SRAM NOP LCALL LONGDELAY LCALL READSRAM ;将从SRAM读出来的数据放到从STOREYEAR开始的位置 JB FLAG.7,RAM_BAD ;NO ERROR, JUMP MOV SRAMDATA,#0FFH ;写入SRAM数据的数据 LCALL WRITESRAM ;写入SRAM NOP LCALL LONGDELAY LCALL READSRAM ;将从SRAM读出来的数据放到从STOREYEAR开始的位置 JB FLAG.7,RAM_BAD ;NO ERROR, JUMP MOV SRAMDATA,#0AAH ;写入SRAM数据的数据 LCALL WRITESRAM ;写入SRAM NOP LCALL LONGDELAY LCALL READSRAM ;将从SRAM读出来的数据放到从STOREYEAR开始的位置 JB FLAG.7,RAM_BAD ;NO ERROR, JUMP MOV SRAMDATA,#055H ;写入SRAM数据的数据 LCALL WRITESRAM ;写入SRAM NOP LCALL LONGDELAY LCALL READSRAM ;将从SRAM读出来的数据放到从STOREYEAR开始的位置 JB FLAG.7,RAM_BAD ;NO ERROR, JUMP MOV DIG2,#3FH MOV DIG1,#70H ;"OK",NO BAD EEPROM JNB FLAG.7,RAM_OK ;NO ERROR, JUMP RAM_BAD: MOV DIG2,#79H MOV DIG1,#79H ;"EE",ERROR RAM_OK: MOV TEMP,#000H ;FLASH DIG3,4 MOV SLAVE_ADD,#SLAVE2_WR LCALL LED_FLASH RET ;============================写八位LED数据缓冲器程序======================= ;功能:写八位LED数据缓冲器 ? ? | ;入口:NONE 出口:NONE | ;影响资源: A | ;========================================================================== TEST_LEDBUF: MOV DIG1,#40H MOV DIG2,#40H RET ;===========================设置SD2200系列型号子程序======================= ;功能:设置SD2200系列型号子程序 ? | ;入口:NONE 出口:NONE | ;影响资源: A | ;========================================================================== SET_TYPE: MOV TYPE,#1 ;型号为1="SD2200BP" MOV DIG6,#3FH ;0 MOV DIG5,#3FH ;0 MOV DIG4,#3FH ;0 MOV DIG3,#06H ;1 MOV DIG2,#40H ;"-" MOV DIG1,#40H ;"-" SET_TYPE_WAIT: SETB KEY NOP JB KEY,$; ;等待SD7218的键盘输入信号 ;----------------------------------------------------------------- MOV SLAVE_ADD,#SLAVE2_RD LCALL READ_KEY ;读SD7218内的键值 MOV A,KEYBUF CJNE A,#66H,SET_TYPE_WAIT SETB KEY JNB KEY,$ MOV TEMP,#0C0H ;FLASH DIG7,8 MOV SLAVE_ADD,#SLAVE2_WR LCALL LED_FLASH SET_TYPE_KEYLOOP: LCALL LED_TYPE MOV SLAVE_ADD,#SLAVE2_WR LCALL WRITE_LED8 ; SETB KEY NOP JB KEY,$; ;等待SD7218的键盘输入信号 MOV SLAVE_ADD,#SLAVE2_RD LCALL READ_KEY ;读SD7218内的键值 MOV A,KEYBUF CJNE A,#88H,SET_TYPE_UP MOV A,TYPE CJNE A,#1,SET_TYPE_DOWN1 MOV TYPE,#10 SET_TYPE_DOWN1: DEC TYPE SET_TYPE_UP: MOV A,KEYBUF CJNE A,#77H,SET_TYPE_END MOV A,TYPE CJNE A,#9,SET_TYPE_UP1 MOV TYPE,#0 SET_TYPE_UP1: INC TYPE SET_TYPE_END: SETB KEY JNB KEY,$ MOV A,KEYBUF CJNE A,#66H,SET_TYPE_KEYLOOP MOV TEMP,#00H ;TURN OFF FLASH DIG5,6 MOV SLAVE_ADD,#SLAVE2_WR LCALL LED_FLASH LCALL LED_TYPE MOV SLAVE_ADD,#SLAVE2_WR LCALL WRITE_LED8 RET ;------------------ LED_TYPE: MOV DIG6,#3FH ;0 MOV DIG5,#3FH ;0 MOV DIG4,#3FH ;0 MOV DIG3,#06H ;1 MOV DIG2,#40H ;"-" MOV DIG1,#40H ;"-" MOV A,TYPE CJNE A,#1,TYPE_LED2 ;SD2200BP MOV DIG8,#7FH ;"BP" MOV DIG7,#73H ; 1 MOV SRAMADD_HI,#02H ;SRAM的地址高八位 TYPE_LED2: CJNE A,#2,TYPE_LED3 ;SD2200CP MOV DIG8,#39H ;"CP" MOV DIG7,#73H ;2 MOV SRAMADD_HI,#08H ;SRAM的地址高八位 TYPE_LED3: CJNE A,#3,TYPE_LED4 ;SD2200DP MOV DIG8,#3FH ;"DP" MOV DIG7,#73H ;3 MOV SRAMADD_HI,#32 ;SRAM的地址高八位 TYPE_LED4: CJNE A,#4,TYPE_LED5 ;SD2200EP MOV DIG8,#79H ;"EP" MOV DIG7,#73H ;4 MOV SRAMADD_HI,#128 ;SRAM的地址高八位 TYPE_LED5: CJNE A,#5,TYPE_LED6 ;SD2200FLP MOV DIG8,#71H ;"FL" MOV DIG7,#38H ;5 MOV SRAMADD_LO,#8 ;8BYTES=ONE PAGE MOV SRAMADD_HI,#32 ;EE的页数,8x32 MOV EE_PAGE,#1 ;PAGE SELECT TYPE_LED6: CJNE A,#6,TYPE_LED7 ;SD2200BLP MOV DIG8,#7FH ;"BL" MOV DIG7,#38H ;6 MOV SRAMADD_HI,#2 ;SRAM的地址高八位 TYPE_LED7: CJNE A,#7,TYPE_LED8 ;SD2200CLP MOV DIG8,#39H ;"CL" MOV DIG7,#38H ;7 MOV SRAMADD_HI,#8 ;SRAM的地址高八位 TYPE_LED8: CJNE A,#8,TYPE_LED9 ;SD2200DLP MOV DIG8,#3FH ;"DL" MOV DIG7,#38H ;8 MOV SRAMADD_HI,#32 ;SRAM的地址高八位 TYPE_LED9: CJNE A,#9,TYPE_LED10 ;SD2200ELP MOV DIG8,#79H ;"EL" MOV DIG7,#38H ;9 MOV SRAMADD_HI,#128 ;SRAM的地址高八位 TYPE_LED10: RET ;====================== RESER LED ======================================= ;功能: | ;入口: | ;出口:NONE | ;影响资源: | ;=========================================================================== LED_RESET: LCALL IICSTART MOV A,SLAVE_ADD MOV TXBUF,A ;送SD7218地址 LCALL SENDH_L MOV TXBUF,#79H ;COMMAND_RESET LCALL SENDH_L ;送RESET命令 MOV A,#0H ;RESET DATA MOV TXBUF,A LCALL SENDH_L LCALL IICSTOP RET END