⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zlg7290.asm

📁 用80C51单片机实现zlg7290扫描键盘并在LED进行显示的汇编语言程序
💻 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 + -