📄 sd2200读写c51演示程序.txt
字号:
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -