📄 7290jt.asm
字号:
SDA BIT P1.7 ;I2C总线定义
SCL BIT P1.6
MTD EQU 30H ;发送数据缓冲器
MRD EQU 40H ;接收数据缓冲区
;定义器件地址,变量
ZLG7290 EQU 70H ;ZLG7290的器件地址
ACK BIT 10H ;应答标志位
KEYON BIT 11H ;有键按下的标志位
K1_ON BIT 12H ;已经按下过k1的标志位
SLA DATA 50H ;器件的从地址
SUBA DATA 51H ;器件的子地址
NUMBYTE DATA 52H ;读/写的字节数变量
BLINK DATA 53H ;控制闪烁的变量
NUM DATA 54H ;指向DISP_BUF的值的变量
DISP_BUF EQU 60H ;显示缓冲区
ORG 8000H
AJMP MAIN
ORG 8003H
AJMP KEYINT0
ORG 8100H
MAIN: MOV R4,#0F0H ;延时,等待芯片复位
DJNZ R4,$
MOV BLINK,#01H ;给闪烁控制变量赋初值
MOV NUM,#00H ;给要指向的变量赋初值
CLR KEYON ;有键按下的标志位清零
CLR K1_ON ;按下过k1的标志位清零
SETB IT0 ;设置外部中断为边沿触发方式
SETB EX0 ;开放外部中断0
SETB EA ;开放总中断
;给显示缓冲区赋值0~8
MOV R0,#DISP_BUF ;取显示缓冲区地址
MOV A,#00H ;赋初值
MOV R1,#08H ;循环8次
WRDISP_BUF: MOV @R0,A ;将值送入显示缓冲区
INC R0 ;地址加1
INC A ;数值加1
DJNZ R1,WRDISP_BUF ;循环8次了吗?
;在LED上显示数字0~8,
;入口参数:R6:复合命令的第一个字节,R7:复合命令的第二个字节。R2:要显示的LED数
MOV R6,#60H ;复合命令第一个字节的初值,是按位下载数据并译码的指令代码
MOV R7,#00H ;复合命令的第二个字节,是要显示的数值
MOV R2,#08H ;循环8次,即显示8位
LOOP1: MOV MTD,R6 ;将复合命令的第一个字节送发送数据缓冲区
MOV MTD+1,R7 ;将复合命令的第二个字节送发送数据缓冲区
INC R6 ;显示下一个位
INC R7 ;数值加1
LCALL SENDCMD ;调用发送命令函数
ACALL DELAY ;延迟
DJNZ R2,LOOP1 ;循环8次了吗?
;键盘处理程序
;K1键:闪烁,表示可以修改闪烁位的值,每按一次K1,闪烁向左移动一位.
;K2键:增加,按一次显示值加1
;K3键:减少,按一次显示值减1
;K4键:确定,停止所有闪烁
KEYHANDLE: SETB EA
JNB KEYON,KEYHANDLE ;判断KEYON(有键按下)标志是否有被置位,没有则在此处循环
CLR EA
CLR KEYON ;如果标志被置位,KEYON标志清零
LCALL SCANKEY ;调用键盘扫描函数,读出键值
MOV A,MRD ;将接收数据缓冲区的内容送A
CJNE A,#01H,KEY2_HANDLE ;如果按下了K1键,即键值为01,就执行KEY1_HANDLE程序,如果不是跳转到KEY2_HANDLE
KEY1_HANDLE: SETB K1_ON ;置位K1_ON(按下K1)标志位
MOV MTD,#70H ;发送闪烁命令,复合命令的第一个字节是07H
MOV MTD+1,BLINK ;复合命令的第二字节,指出要闪烁的位
MOV A,BLINK ;将要闪烁的位左移一位,在下一次按下K1时,闪烁会左移一位
RL A
MOV BLINK,A
INC NUM ;现在显示第NUM个数
MOV A,NUM
CJNE A,#09H,NEXT1 ;如果NUM大于8,要将它重新设置为0
MOV NUM,#01H
NEXT1: LCALL SENDCMD ;调用发送命令函数
AJMP KEYHANDLE ;跳转到KEYHANDLE
;K2的处理程序
KEY2_HANDLE: CJNE A,#02H,KEY3_HANDLE ;如果按下的键是K2
JNB K1_ON,KEYHANDLE ;如果已经按下了K1,则可以继续执行
MOV A,NUM
DEC A
ORL A,#60H ;复合命令第一字节,表示要下载数据的DpRam(0~7)
MOV MTD,A ;送发送数据缓冲区
MOV R0,A ;指向显示缓冲区
INC @R0 ;所指向的值加1,即显示值加1
CJNE @R0,#1FH,NEXT2 ;如果得到的值大于1FH(超过可以显示的值),要将它重新设置为00H
MOV @R0,#00H
NEXT2: MOV MTD+1,@R0 ;作为复合命令的第二字节发送到发送缓冲区
ORL MTD+1,#40H ;该位闪烁
LCALL SENDCMD ;调用发送命令函数
AJMP KEYHANDLE ;跳转到KEYHANDLE
;K3的处理程序
KEY3_HANDLE: CJNE A,#03H,KEY4_HANDLE
JNB K1_ON,KEYHANDLE
MOV A,NUM
DEC A
ORL A,#60H
MOV MTD,A
MOV R0,A
DEC @R0 ;所指向的值加1,即显示值加1
CJNE @R0,#0FFH,NEXT3 ;如果得到的值小于0(0减1为FFH),要将它重新设置为1EH
MOV @R0,#1EH
NEXT3: MOV MTD+1,@R0
ORL MTD+1,#40H
LCALL SENDCMD
AJMP KEYHANDLE
;K4的处理程序
KEY4_HANDLE: CJNE A,#04H,OTHERKEY_HANDLE
MOV MTD,#70H ;发送所有位不闪烁命令
MOV MTD+1,#00H
LCALL SENDCMD
MOV BLINK,#01H ;将控制闪烁的变量设置为初值
MOV NUM,#00H ;将指向显示缓冲区的变量设置为初值
CLR K1_ON ;清除K1_ON标志
AJMP KEYHANDLE
;其他键的处理程序
OTHERKEY_HANDLE: ;如果按下的是K5~K8,跳转到KEYHANDLE,无操作
AJMP KEYHANDLE
;键盘中断程序
KEYINT0: PUSH PSW ;保护现场
PUSH ACC
CLR EX0 ;禁止中断
SETB KEYON ;置位KEYON标志
SETB EX0 ;开放中断
POP ACC ;出栈
POP PSW
RETI ;中断返回
;延时子程序
DELAY: MOV R5,#10H
DELAY0: MOV R4,#0F0H
DELAY1: DJNZ R4,DELAY1
DJNZ R5,DELAY0
RET
$INCLUDE(ZLG7290.INC) ;包含ZLG7290软件包
$INCLUDE(VI2C_ASM.INC) ;包含VIIC软件包
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -