📄 zlg7290.asm
字号:
;连线说明: mcu zlg7290 数码管 键盘
; P1.0---------SDA
; PI.1---------SCL
; ~INT0(P3.2)--------~KEY
; SegA-SegH------ 段码线
; Dig0-Dig7------GND0-GND7
; SegA-SegH------------------------列线
; Dig0-Dig7------------------------行线
ZLG_ADD_W EQU 70H ;ZLG_7290的I2C写地址
ZLG_ADD_R EQU 71H ;ZLG_7290的I2C读地址
ZLG_KEY EQU 01H ;ZLG_7290键值寄存器的片内地址
ZLG_CMDBUF0 EQU 07H ;ZLG_7290命令缓冲区0片内地址
SDA BIT P1.0 ;数据传输口DATA
SCL BIT P1.1 ;时钟
Delay_tBUF MACRO ;宏汇编
PUSH ACC
MOV A,#11;10
DJNZ ACC,$
POP ACC
ENDM
Delay_tHD_STA MACRO
PUSH ACC
MOV A,#11;10
DJNZ ACC,$
POP ACC
ENDM
Delay_tHD_DAT MACRO
PUSH ACC
MOV A,#2;5
DJNZ ACC,$
POP ACC
ENDM
Delay_tSU_STO MACRO
PUSH ACC
MOV A,#11;10
DJNZ ACC,$
POP ACC
ENDM
Delay_tHIGH MACRO
PUSH ACC
MOV A,#11;10
DJNZ ACC,$
POP ACC
ENDM
Delay_tLOW MACRO
PUSH ACC
MOV A,#11;10
DJNZ ACC,$
POP ACC
ENDM
Delay_tSU_DAT MACRO
PUSH ACC
MOV A,#11;10
DJNZ ACC,$
POP ACC
ENDM
;主函数
;使用外部0中断 电平触发
;调用函数:WRITE_COMD,READ_KEY
;R1:全局变量,标示是否有新的的按键值 无新按键值时为0,在中断程序中修改为FFH,
; READ_KEY程序结束改为0
;R0:全局变量,在READ_KEY中带回键码
ORG 0000H
SJMP MAIN
ORG 0003H ;中断服务程序入口
LJMP EXINT0
ORG 0030H
MAIN: MOV SP,#60H
CLR IT0 ;
SETB EX0 ;外部中断允许
SETB EA ;开中断
MOV R0,#01FH; 传入ZLG7290中08H参数,表示无显示(见ZLG7290数据手册)
MOV R1,#0
LOOP: LCALL WRITE_COMD
CJNE R1,#0FFH,LOOP
LCALL READ_KEY
MOV R1,#0
SJMP LOOP
;中断服务程序 修改全局标示R1
EXINT0 : MOV R1,#0FFH
RETI
;函数:WRITE_COMD
;功能:向ZLG7290中写键码
;说明:按照I2C协议,整个流程:开始信号--->写ZLG7290的I2C写地址--->写ZLG7290内部命令缓冲寄存; 器Cmdbuf0子地址
; --->写控制字到Cmdbuf0--->写控制字到Cmdbuf1--->停止 (ZLG7290支持自动增址)
WRITE_COMD : LCALL Start
MOV A,#ZLG_ADD_W
LCALL Write8bits
LCALL Acknowledge
MOV A,#ZLG_CMDBUF0
LCALL Write8bits
LCALL Acknowledge
MOV A,#011000000B;Cmdbuf0的控制字,参见ZLG7290的datasheet
LCALL Write8bits
LCALL Acknowledge
MOV A,R0 ;Cmdbuf1的内容
LCALL Write8bits
LCALL Acknowledge
LCALL Stop
LCALL DELAY
RET
;函数:READ_KEY
;功能:从ZLG7290中读出键码
;说明:开始信号--->写ZLG7290的I2C写地址--->写ZLG7290的键值寄存器子地址--->开始信号
; --->写ZLG7290的I2C读地址--->调用I2C读程序--->停止
READ_KEY: LCALL Start
MOV A,#ZLG_ADD_W
LCALL Write8bits
LCALL Acknowledge
MOV A,#ZLG_KEY
LCALL Write8bits
LCALL Acknowledge
LCALL Start
MOV A,#ZLG_ADD_R
LCALL Write8bits
LCALL Acknowledge
LCALL Read_8bits
LCALL MasterACKnot;传输最后一个字节,给非应答信号
LCALL Stop
DEC A
MOV R0,A
RET
;延时程序
DELAY: MOV R7,#09H
DELAY1: MOV R6,#0FH
DJNZ R6,$
DJNZ R7,DELAY1
RET
;写入8位数据
Write8bits: PUSH 07H
MOV R7,#8
Write_8bits_1: CLR SCL
Delay_tHD_DAT
RLC A
MOV SDA,C ;数据在SCL为低时,将数据送上SDA
Delay_tSU_DAT
SETB SCL
Delay_tHIGH
DJNZ R7,Write_8bits_1
CLR SCL
POP 07H
RET
;读取8位数据
Read_8bits: PUSH 07H
MOV R7,#8
Read_8bits_1: CLR SCL
Delay_tLOW
SETB SCL ;SCL高电平时,读取SDA数据
Delay_tHIGH
MOV C,SDA
RLC A
DJNZ R7,Read_8bits_1
CLR SCL
POP 07H
RET
;开始信号
Start: SETB SDA
SETB SCL
Delay_tBUF
CLR SDA
Delay_tHD_STA
CLR SCL
RET
;结束信号
Stop: Delay_tHD_DAT
CLR SDA
SETB SCL
Delay_tSU_STO
SETB SDA ;操作结束后,确保IIC总线处于释放状态
RET
;从机应答查询
Acknowledge: Delay_tLOW
SETB SDA ;查询接收端应答信号,要先释放总线
SETB SCL
Delay_tHIGH
JB SDA,$ ;接收端应答标志:将SDA置低
CLR SCL
RET
;主机应答
MasterACK: Delay_tHD_DAT
CLR SDA ;数据线SDA清0应答
Delay_tSU_DAT
SETB SCL
Delay_tHIGH
CLR SCL
SETB SDA ;置高数据,必须
RET
;主机非应答
MasterACKnot: Delay_tHD_DAT
SETB SDA ;数据线SDA置1应答
Delay_tSU_DAT
SETB SCL
Delay_tHIGH
CLR SCL
SETB SDA ;置高数据,必须
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -