汇编程序设计,外部中断

如下图所示,使用外部中断0实现按键计数的功能,并分别使用低电平触发和边沿触发两种方式有何不同结果,并分析原因。

img

需要程序,汇编语言

根据您描述的问题,希望使用汇编语言实现按键累加功能,这里提供一个汇编实现按键累加功能代码,仅供参考:

 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: