📄 sd2304.asm
字号:
;===============================================================================
; 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 + -