汇编语言实现按键申请外部中断,中断一次,数码管显示的数加1,用2位数码管动态显示计数,计数到12归0
时间: 2024-03-18 07:42:08 浏览: 20
好的,下面是用汇编语言实现的按键计数器程序,使用外部中断来实现按键功能,使用定时器0中断来实现数码管显示。代码注释中有详细说明。
```assembly
; 定义数码管的I/O口
DIO equ P1.0
CLK equ P1.1
; 定义计数器、按键标志、计时器计数值
data segment
counter db 0 ; 计数器
key_pressed db 0 ; 按键标志
timer dw 0 ; 计时器计数值
data ends
; 定义中断向量
org 0
ljmp start
; 定义定时器0中断处理函数
org 0bh
timer0_isr:
push acc ; 保存寄存器
push dph
push dpl
mov dpl, #0 ; 重新设置计时器初值
mov dph, #0
djnz timer, skip ; 倒计时未完成,跳过
mov timer, #500 ; 重新设置计时器计数值
inc counter ; 计数器加1
cjne counter, #13, skip2 ; 如果计数器不等于13,则跳过
mov counter, #0 ; 计数器清零
skip2:
mov a, counter ; 显示计数器的个位数
mov dpl, a
call display
mov a, counter / 10 ; 显示计数器的十位数
mov dpl, a
call display
skip:
clr TF0 ; 清除定时器0中断标志
pop dpl ; 恢复寄存器
pop dph
pop acc
reti ; 退出中断处理函数
; 定义外部中断0处理函数
org 003h
key_isr:
push acc ; 保存寄存器
push dph
push dpl
mov key_pressed, #1 ; 设置按键标志
pop dpl ; 恢复寄存器
pop dph
pop acc
reti ; 退出中断处理函数
; 显示数字子程序
display:
push psw ; 保存寄存器
push acc
push dph
push dpl
mov dph, #table / 0x100 ; 计算表格地址
mov dpl, a
add a, a ; 计算在表格中的偏移量
add a, dph
mov a, @a+dptr ; 读出对应数字的码值
mov dph, #0 ; 开始显示
mov r2, #8 ; 显示8位
clr C ; 清除进位标志
loop:
movx a, @dptr ; 读出下一位数码管的数据
rlc a ; 取出最高位
jnc skip1 ; 如果最高位为0,跳过
setb DIO ; 如果最高位为1,设置DIO为1
skip1:
setb CLK ; CLK上升沿
clr CLK ; CLK下降沿
djnz r2, loop ; 循环8次
pop dpl ; 恢复寄存器
pop dph
pop acc
pop psw
ret
; 程序入口
start:
mov sp, #0ffh ; 初始化堆栈指针
mov dptr, #timer ; 设置计时器初值
movx a, @dptr
mov dptr, #TH0 ; 设置定时器初值
mov @dptr, a
mov dptr, #TL0
mov @dptr, #0
mov tmod, #1 ; 设置定时器0为模式1
setb et0 ; 允许定时器0中断
setb ea ; 允许中断
setb tr0 ; 启动定时器0
setb EX0 ; 允许外部中断0
setb IT0 ; 设置外部中断0为下降沿触发
loop:
jnb key_pressed, loop ; 如果按键标志为0,一直循环
mov key_pressed, #0 ; 清除按键标志
mov timer, #500 ; 重新设置计时器计数值
sjmp loop ; 跳转回循环
; 数码管显示数字表
table:
db 0c0h, 0f9h, 0a4h, 0b0h, 099h, 092h, 082h, 0f8h, 080h, 090h
```
这个程序使用了外部中断0来实现按键功能,使用定时器0中断来实现数码管显示。在外部中断处理函数中,设置按键标志。在定时器0中断处理函数中,先检测计时器是否为0,如果为0,则计数器加1,然后重新设置计时器计数值。如果计数器到达13,则清零计数器,并且显示器显示00。显示函数也在中断处理函数中调用,显示计数器的值。程序的入口处启动定时器0和外部中断0,并且允许定时器0中断、外部中断0和全局中断。循环中检测按键标志,如果为1,则重新设置计时器计数值,并且清除按键标志,否则一直循环。