采用外部中断编写程序控制数码管显示从00到99,S1控制加计数,S2控制减计数,汇编语言
时间: 2023-08-21 20:02:38 浏览: 144
好的,下面是一份基于8051汇编语言的代码,实现了通过外部中断控制数码管显示从00到99,S1控制加计数,S2控制减计数的功能。假设使用的是共阳数码管,硬件连接方式与上面提到的相同。
```
ORG 0H
MOV P0, #0FFH ; P0口设置为输出
MOV P2, #0H ; P2口作为数码管位选控制口
MOV TMOD, #01H ; 定时器0工作在模式1
SETB TR0 ; 启动定时器0
SETB ET0 ; 开启定时器0中断
SETB EX0 ; 开启外部中断0
SETB IT0 ; 设置外部中断0为下降沿触发
SETB EA ; 开启总中断
MOV TH0, #0F8H ; 定时器初值,50ms
MOV TL0, #0H
MOV count, #0H ; 初始化计数器
MAIN:
MOV A, count ; 将计数器的值转换成数码管的显示
DIV AB, #10H
MOV P0, table+DPL ; 显示十位数码
MOV P2, #1H ; 选择第一个数码管
ACALL delayms
MOV P2, #0H
MOV A, count
ANL A, #0FH
MOV P0, table+DPL ; 显示个位数码
MOV P2, #2H ; 选择第二个数码管
ACALL delayms
MOV P2, #0H
SJMP MAIN
; 中断服务程序,处理S1和S2中断请求
KEY_ISR:
JNB S1, KEY_ISR_END
INC count ; S1按下,计数器加1
CJNE count, #100, KEY_ISR_END
CLR count ; 计数器加到100后归零
KEY_ISR_END:
JNB S2, KEY_ISR_EXIT
DEC count ; S2按下,计数器减1
CPL count ; 计数器减到-1后变成99
KEY_ISR_EXIT:
RETI
; 定时器0中断服务程序
TIMER0_ISR:
MOV TH0, #0F8H ; 定时器初值,50ms
MOV TL0, #0H
RETI
; 延时函数,约为1ms
delayms:
PUSH ACC
PUSH PSW
MOV R5, #2H
DELAYMS_LOOP1:
MOV R4, #250H
DELAYMS_LOOP2:
DJNZ R4, DELAYMS_LOOP2
DJNZ R5, DELAYMS_LOOP1
POP PSW
POP ACC
RET
; 数据区
count DB 0 ; 计数器
table DB 0C0H, 0F9H, 0A4H, 0B0H, 099H, 092H, 082H, 0F8H, 080H, 090H ; 数字码表
END
```
这份代码与上面提供的C代码实现方法类似,不同之处在于使用了汇编语言。需要注意的是,8051的中断处理方式比较特殊,需要在中断服务程序结束时用RETI指令返回。此外,由于汇编语言对于程序员的编程能力要求比较高,所以在实际应用中需要谨慎使用。
阅读全文