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