📄 file.asm.txt
字号:
;===============================================================================
; SD7218M VER1.0
; 本程序用于测试LED显示/键盘芯片SD7218的功能
; 程序功能如下:
;
; 注: 单片机是AT89C51,外晶振为12Mhz,在兴威帆公司的SD7218评估板上运行
; Last update:2003/05/09
; 本程序仅供参考,如有问题请联系:陈工?0755-83246178,83220794,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 ;键盘数据缓冲器
;---------------------------------------------------------------------------
;define port bit
;各通信口位代号
SDA EQU P2.3 ;IIC的SDA口线
SCL EQU P2.4 ;IIC的SCL口线
KEY EQU P2.5 ;键盘中断信号线
T_SDA EQU P1.1 ;sd2000的SDA口线
T_SCL EQU P1.0 ;sd2000的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
;===========================================================================
; *** 常数定义 ***
;===========================================================================
SLAVE1_RD EQU 57H
SLAVE1_WR EQU 56H
SLAVE2_RD EQU 51H
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数据缓冲器
LED_TIME:
MOV SLAVE_ADD,#SLAVE2_WR
LCALL WRITE_LED8 ;写8个16进制数至sd7218(命令2:多字节下载数据且译码)
WAIT_KEY:
LCALL READ_TIME
LCALL BCD_LED
NOP
SETB KEY
NOP
JB KEY,LED_TIME ;等待SD7218的键盘输入信号
;-----------------------------------------------------------------
GET_KEY:
MOV SLAVE_ADD,#SLAVE1_RD
LCALL READ_KEY ;读SD7218内的键值
MOV A,KEYBUF
CJNE A,#31H,SHIFT_ROUND_LEFT_KEY
MOV SLAVE_ADD,#SLAVE1_WR
MOV DATAI1,#COMMAND_SHIFT_ROUND_RIGHT
LCALL WRITE_BYTE
SHIFT_ROUND_LEFT_KEY:
MOV A,KEYBUF
CJNE A,#32H,WAIT_KEY_RELEASE
MOV SLAVE_ADD,#SLAVE1_WR
MOV DATAI1,#COMMAND_SHIFT_ROUND_LEFT
LCALL WRITE_BYTE
WAIT_KEY_RELEASE:
JNB KEY,WAIT_KEY_RELEASE
BREAKPOINT1: NOP ;设断点
JMP WAIT_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_LED_HEXS_WR
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
;======================写单个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 ;送单字节命令
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
JB SDA,IIC_SDAHI
SETB FLAG.1
IIC_SDAHI:
CLR SDA
LCALL DELAY
CLR SCL
LCALL DELAY
RET
;===============================关闭IIC总线================================
;功能:关闭实时时钟IIC总线
;入口:NONE 出口:NONE
;影响资源:NONE
;==========================================================================
IICSTOP:CLR SDA
SETB SCL
LCALL DELAY
SETB SDA
LCALL DELAY
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
;=================================接收一个字节=============================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -