如下图所示,使用外部中断0实现按键计数的功能,并分别使用低电平触发和边沿触发两种方式有何不同结果,并分析原因。
需要程序,汇编语言
根据您描述的问题,希望使用汇编语言实现按键累加功能,这里提供一个汇编实现按键累加功能代码,仅供参考:
ORG 0000H
AJMP MAIN
MAIN: LCALL CSH
MAIN1: LCALL KEY ;按键处理
LCALL BCD ;30`33H分别保存数码管1~4显示的数字
LCALL XS ;一个数码管工作时
JMP MAIN1
CSH: MOV R7,#125 ;设定初始值为125
RET
KEY: JB P3.1,KEY2 ;P3.1连接按键低电平有效,高电平则检测P3.3按键状态
JNB P3.1,$ ;等待按键松开
INC R7 ;数码管显示加1
CJNE R7,#250,KEY2 ;由于16位寄存器只有DPTR、PC,所以单寄存器存取数时,只
MOV R7,#250 ;有256个数的范围波动
KEY2: JB P3.3,KEY3
JNB P3.3,$
DEC R7 ;数码管显示减1
CJNE R7,#100,KEY3
MOV R7,#100
KEY3: RET ;LCALL与RET相对应
BCD: MOV 30H,#0 ;通过DIV指令,将该数个、十、百位存放在33H、32H、31H
MOV A,R7
MOV B,#100
DIV AB
MOV 31H,A
MOV A,B
MOV B,#10
DIV AB
MOV 32H,A
MOV 33H,B
RET
XS: MOV R6,#4 ;有4个数码管
MOV R5,#0FEH ;设定第一位数码管位选
MOV R0,#30H
MOV DPTR,#TAB
L
低电平触发:
ORG 00000H
JMP MAIN
ORG 0003H
JMP INTERRUPT0
MAIN:
MOV EA, 1
MOV IE, EA ;开启所有中断
MOV EA, 30H
MOV TMOD, EA ;设置T0为模式1,16位计数
SETB TR0 ;开启T0
MOV TH0, 0
MOV TL0, 0
SETB IT0 ;设置INT0为低电平触发
SETB EX0 ;开启INT0中断
JMP WAIT_INT
WAIT_INT:
JNB P3.2, WAIT_INT ;等待按键按下
JMP COUNT
COUNT:
INC CNT ;计数器加一
JMP WAIT_INT
INTERRUPT0:
MOV A, CNT
MOV R0, A
ACALL DISP ;显示数字
RETI
DISP:
;显示代码省略
RET
CNT: DB 0
END
边沿触发:
ORG 00000H
JMP MAIN
ORG 0003H
JMP INTERRUPT0
MAIN:
MOV EA, 1
MOV IE, EA ;开启所有中断
MOV EA, 30H
MOV TMOD, EA ;设置T0为模式1,16位计数
SETB TR0 ;开启T0
MOV TH0, 0
MOV TL0, 0
SETB IT0 ;设置INT0为边沿触发
SETB EX0 ;开启INT0中断
JMP WAIT_INT
WAIT_INT:
JNB P3.2, WAIT_INT ;等待按键按下
JMP COUNT
COUNT:
INC CNT ;计数器加一
JMP WAIT_INT
INTERRUPT0:
JNB P3.2, WAIT_INT ;判断是否是按键弹起事件
JMP END
MOV A, CNT
MOV R0, A
以下是使用外部中断 0 实现按键计数功能的汇编代码示例,该代码使用 Intel 80x86 架构的汇编语言编写:
; 使用低电平触发方式实现按键计数功能
; 定义变量
counter db 0
; 启用外部中断 0
mov al, 0b00000001b
out 0a0h, al
; 等待中断发生
wait_for_interrupt:
hlt
jmp wait_for_interrupt
; 中断服务程序
; 该程序在每次按键被按下时被调用
interrupt_handler:
; 读取外部设备的状态
in al, 0a1h
; 如果按键处于低电平,则增加计数器
cmp al, 0
jne skip
inc counter
skip:
; 退出中断
iret
以下是使用边沿触发方式实现按键计数功能的汇编代码示例:
; 使用边沿触发方式实现按键计数功能
; 定义变量
counter db 0
last_state db 0
; 启用外部中断 0
mov al, 0b00000001b
out 0a0h, al
; 等待中断发生
wait_for_interrupt:
hlt
jmp wait_for_interrupt
; 中断服务程序
; 该程序在每次按键状态发生变化时被调用
interrupt_handler:
; 读取外部设备的状态
in al, 0a1h
; 如果按键从高电平变为低电平,则增加计数器
cmp al, 0
jne skip
cmp last_state, 0
je skip
inc counter
skip: