89c51单片机中用汇编语言编程,在原来点亮的数码管加入中断,key1按一下,显示字符“22”。其中,第一块数码管端口从p0.0到p0.7。第二块数码管端口从p2.0到p2.7。key1按钮接int0
时间: 2024-03-24 13:42:04 浏览: 23
好的,我来回答你的问题。
首先,需要定义中断向量表,将INT0中断与相应的中断处理程序关联起来。代码如下:
```
ORG 0000H ; 程序从地址0开始存放
LJMP MAIN ; 跳转到主程序
ORG 0003H ; 定义INT0的中断向量表
LJMP KEYINT ; 跳转到中断处理程序
MAIN:
MOV P0, #0FFH ; 将第一块数码管全部置为低电平
MOV P2, #0FFH ; 将第二块数码管全部置为低电平
SETB IT0 ; 设置INT0为下降沿触发
SETB EA ; 开启全局中断
LOOP: ; 主程序循环
SJMP LOOP
KEYINT: ; 中断处理程序
MOV P0, #0 ; 将第一块数码管全部置为高电平
MOV P2, #0 ; 将第二块数码管全部置为高电平
MOV P0.0, #0 ; 将第一块数码管的第一位点亮
MOV P2.1, #0 ; 将第二块数码管的第二位点亮
MOV P2.2, #0 ; 将第二块数码管的第三位点亮
MOV A, #22H ; 将字符“22”存入累加器A
ACALL DISPLAY ; 调用显示函数
RETI ; 中断返回
DISPLAY: ; 数码管显示函数
MOV P0, #0FFH ; 将第一块数码管全部置为低电平
MOV P2, #0FFH ; 将第二块数码管全部置为低电平
MOV R1, #10 ; 将常数10存入寄存器R1
DIV AB, R1 ; 将累加器A中的数除以10,商存在B中,余数存在A中
MOV P0.0, A ; 将余数A显示在第一块数码管的第一位
MOV P2.1, B ; 将商B显示在第二块数码管的第二位
MOV A, #0AH ; 将常数0AH存入累加器A
DIV AB, R1 ; 将累加器A中的数除以10,商存在B中,余数存在A中
MOV P2.2, A ; 将余数A显示在第二块数码管的第三位
MOV P2.3, B ; 将商B显示在第二块数码管的第四位
RET ; 函数返回
```
以上是完整的汇编代码,其中用到了数码管显示函数和中断处理程序。在主程序中,将第一块数码管和第二块数码管全部置为低电平,然后设置INT0为下降沿触发,开启全局中断。
在中断处理程序中,将第一块数码管和第二块数码管全部置为高电平,然后点亮第一块数码管的第一位和第二块数码管的第二、三位,最后将字符“22”存入累加器A,调用显示函数显示在数码管上。
数码管显示函数中,先将第一块数码管和第二块数码管全部置为低电平,然后将累加器A中的数除以10,商存在B中,余数存在A中,将余数A显示在第一块数码管的第一位,将商B显示在第二块数码管的第二位。再将累加器A中的数除以10,商存在B中,余数存在A中,将余数A显示在第二块数码管的第三位,将商B显示在第二块数码管的第四位。
以上就是用汇编语言编写在原来点亮的数码管加入中断,key1按一下,显示字符“22”的程序。