在89c51单片机中用汇编语言编程,在原来点亮的LED屏加入中断,key1按一下,显示字符“22”
时间: 2024-03-23 08:42:20 浏览: 13
好的,针对你的问题,以下是一个简单的汇编程序,实现在89c51单片机中加入中断,按下key1后,在LED屏上显示字符“22”。
```
ORG 0H ;程序起始地址
MOV P1,#00H ;初始化P1口输出低电平
MOV TMOD,#01H ;定时器0,模式1
SETB TR0 ;启动定时器0
SETB EA ;开全局中断
SETB ET0 ;开定时器0中断
JMP MAIN ;跳转到主程序
TIMER0_ISR:
CLR TF0 ;清除定时器0中断标志
MOV P1, #22H ;显示字符“22”
RETI ;返回中断
MAIN:
SJMP MAIN ;主程序死循环
ORG 0BH ;中断向量表
DW TIMER0_ISR ;定时器0中断服务程序入口地址
```
以上程序的具体实现方式如下:
1. 首先,将P1口初始化为输出低电平,以便点亮LED屏。
2. 然后,配置定时器0,以便定期触发中断。
3. 开启全局中断和定时器0中断,并将程序跳转到主程序。
4. 在定时器0中断服务程序中,首先清除定时器0中断标志(TF0),然后将P1口设置为22H,以便在LED屏上显示字符“22”。
5. 在中断向量表中,将定时器0中断服务程序的入口地址设置为0BH。
请注意,以上是一个很基本的程序,需要根据具体的硬件平台和需求进行修改。同时,还需要确保硬件平台支持中断和定时器。如果你没有相关的经验,建议先学习一些基础知识,或者寻求专业人士的帮助。
相关问题
89c51单片机中用汇编语言编程,在原来点亮的LED屏加入中断,key1按一下,显示字符“22”。其中,第一块LED屏端口从p0.0到p0.7。第二块LED屏端口从p2.0到p2.7。key1按钮接int0
好的,我来解答你的问题。以下是代码实现:
```
ORG 0H ; 程序从0地址开始执行
MOV P0, #0FFH ; 将P0口所有LED熄灭
MOV P2, #0FFH ; 将P2口所有LED熄灭
MOV IE, #81H ; 打开外部中断0,并开启总中断
MOV TCON, #01H ; 配置外部中断0为下降沿触发
MAIN:
SJMP MAIN ; 主循环无限循环
ORG 0BH ; 定义中断向量表
INT0_ISR:
MOV P0, #0DFH ; 在P0口点亮第3个LED
MOV P2, #0DFH ; 在P2口点亮第3个LED
MOV A, #22H ; 将字符“22”存入寄存器A
ACALL DISP ; 调用显示函数
RETI ; 退出中断服务程序
DISP:
MOV P2, #0FFH ; 将P2口所有LED熄灭
MOV R1, #08H ; 初始化循环计数器
LOOP:
MOV C, A ; 将A的最低位存入C
RRC A ; 将A右移一位,最高位补零
MOV P0, #0FFH ; 将P0口所有LED熄灭
JNC SKIP ; 如果C为0,则跳过点亮LED的步骤
MOV P0, #0FEH ; 如果C为1,则在P0.0点亮LED
SKIP:
MOV P2.1, #0FEH ; 在P2.1点亮小数点LED
DJNZ R1, LOOP ; 循环8次
RET ; 返回主程序
```
解释一下代码实现:
首先,将P0口和P2口的所有LED灯熄灭,然后打开外部中断0,并开启总中断。配置外部中断0为下降沿触发。
在主程序中,使用SJMP指令实现主循环的无限循环。
在中断服务程序INT0_ISR中,先在P0口和P2口点亮第3个LED,然后将字符“22”存入寄存器A,并调用显示函数DISP。
在显示函数DISP中,先将P2口的所有LED灯熄灭。然后使用循环计数器R1和循环指令DJNZ,循环8次,每次将寄存器A右移一位,最高位补零,将A的最低位存入C,根据C的值在P0口点亮LED。最后在P2.1口点亮小数点LED。
89c51单片机中用汇编语言编程,在原来点亮的数码管加入中断,key1按一下,显示字符“22”。其中,第一块数码管端口从p0.0到p0.7。第二块数码管端口从p2.0到p2.7。key1按钮接int0
好的,我来回答你的问题。
首先,需要定义中断向量表,将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”的程序。