找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1401|回复: 1
打印 上一主题 下一主题
收起左侧

单片机汇编语言使用共阳极静态数码管按键显示0到9(中断子程序)

[复制链接]
跳转到指定楼层
楼主
ID:1135835 发表于 2024-11-7 21:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前写了一个没有中断子程序的版本,想要用中断子程序但是不清楚该怎么加,求教各位大佬TAT
按键显示1-9(简易版)
ORG 0000H ; 设置程序的起始地址为0000H
LJMP START ; 无条件跳转到标号START,开始执行主程序

ORG 0050H ; 程序存储地址从0050H开始
START:
MOV A,#0FFH ; 将累加器A清零,用于初始化P0口
MOV P0,A ; 将累加器A的值(0FFH)输出到P0口,熄灭数码管上的所有段
MOV DPTR,#NUMTAB ; 将数据指针DPTR指向数码管段码表NUMTAB的起始地址
MOV R0,#00H ; 初始化R0寄存器,用于存储当前要显示的数字
MOV P1,#0FFH ; 将P1口的所有位设置为高电平,准备读取按键状态

LOPDSP: ; 主循环标签
MOV A, R0 ; 将当前要显示的数字(存储在R0中)加载到累加器A
MOV DPTR,#NUMTAB ; 再次将数据指针DPTR指向数码管段码表NUMTAB的起始地址
MOVC A,@A+DPTR ; 根据累加器A的值(当前数字)和DPTR的地址,读取对应的数码管编码到累加器A
MOV P0, A ; 将累加器A中的数码管编码输出到P0口,显示当前数字

CHECK_BUTTON: ; 检查按键标签
JB P1.0, KEY_PRESSED ; 检查P1.0是否被按下(假设低电平有效)
SJMP LOPDSP ; 如果没有按键按下,跳回LOPDSP继续循环显示当前数字

KEY_PRESSED: ; 按键按下处理标签
LCALL DELAY ; 调用延时子程序,消除抖动
JB P1.0, CHECK_BUTTON ; 再次检查按键是否仍然被按下
INC R0 ; 数字加1
CJNE R0, #10, SKIP_RESET ; 如果计数器R0达到10,跳转到SKIP_RESET重置为0
MOV R0, #00H ; 重置计数器R0为0
SKIP_RESET:
SJMP LOPDSP ; 跳回LOPDSP继续循环

HERE: ; 死循环标签,用于程序结束后停止
SJMP HERE ; 无限循环

DELAY: ; 延时子程序标签
MOV R1,#02H ; 设置延时计数器R1为2,用于控制延时长度
LP1: MOV R2,#0FFH ; 设置内部延时计数器R2为255
LP2: MOV R3,#0FFH ; 设置最内层延时计数器R3为255
LP3: DJNZ R3,LP3 ; 递减R3,直到为0,然后跳回LP3继续循环
DJNZ R2,LP2 ; 递减R2,直到为0,然后跳回LP2继续循环
DJNZ R1,LP1 ; 递减R1,直到为0,然后跳回LP1继续循环
RET ; 返回主程序

NUMTAB: ; 数码管段码表标签
DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H,82H,0F8H, 80H, 90H ; 共阳极数码管0-9的编码表
END ; 程序结束






使用中断(写了一部分但是不知道该怎么继续了
ORG       0000H ; 设置程序的起始地址为0000H
LJMP      START
ORG      0003H
LJMP     EXINT0


ORG      0050H
MAIN:    MOV      SP,#60
              SETB      IT1
              CLR        IE1
              SETB      EX1
              SETB      EA
HERE:     SJMP      HERE
LEDTAB: DB          00H

DELAY: ; 延时子程序标签
MOV     R1,#02H; 设置延时计数器R1为2,用于控制延时长度
LP1:       MOVR2,#0FFH ; 设置内部延时计数器R2为255
LP2:       MOVR3,#0FFH ; 设置最内层延时计数器R3为255
LP3:       DJNZR3,LP3 ; 递减R3,直到为0,然后跳回LP3继续循环
DJNZ     R2,LP2; 递减R2,直到为0,然后跳回LP2继续循环
DJNZ     R1,LP1; 递减R1,直到为0,然后跳回LP1继续循环
RET ; 返回主程序

EXINT0:  PUSH     PSW
LCALL    DELAY
JB           P3.3,EXIT
中断子程序主体
EXIT:       POP       PSW
RET1

NUMTAB: ; 数码管段码表标签
DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H,82H,0F8H, 80H, 90H ; 共阳极数码管0-9的编码表
END ; 程序结束

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:404160 发表于 2024-11-8 10:41 | 只看该作者
用中断来实现数码管显示和按键检测的功能,需要进行下面的修改。以下是使用外部中断0(INT0)来实现按键检测和数码管显示的8051汇编代码示例:

```assembly
ORG 0000H ; 设置程序的起始地址为0000H
LJMP START ; 无条件跳转到标号START,开始执行主程序

ORG 0003H ; 外部中断0的中断向量地址
LJMP EXINT0 ; 跳转到外部中断0的处理程序

ORG 0050H ; 程序存储地址从0050H开始
START:
    MOV SP, #60H ; 初始化堆栈指针
    MOV A, #0FFH ; 将累加器A清零,用于初始化P0口
    MOV P0, A ; 将累加器A的值(0FFH)输出到P0口,熄灭数码管上的所有段
    MOV DPTR, #NUMTAB ; 将数据指针DPTR指向数码管段码表NUMTAB的起始地址
    MOV R0, #00H ; 初始化R0寄存器,用于存储当前要显示的数字
    MOV P1, #0FFH ; 将P1口的所有位设置为高电平,准备读取按键状态

    SETB IT0 ; 设置INT0为边沿触发模式
    CLR EX0 ; 清除外部中断0的请求标志
    SETB EA ; 开启全局中断
    SETB EX0 ; 开启外部中断0

MAIN_LOOP:
    SJMP MAIN_LOOP ; 主循环,等待中断

; 外部中断0的处理程序
EXINT0:
    PUSH PSW ; 保存程序状态字
    PUSH ACC ; 保存累加器
    PUSH B ; 保存B寄存器
    PUSH DPL ; 保存数据指针低字节
    PUSH DPH ; 保存数据指针高字节

    LCALL DELAY ; 调用延时子程序,消除抖动

    JB P1.0, EXIT_INT ; 检查P1.0是否被按下(假设低电平有效)
    INC R0 ; 数字加1
    MOV A, R0
    CJNE A, #10, DISPLAY ; 如果计数器R0达到10,跳转到DISPLAY重置为0
    MOV R0, #00H ; 重置计数器R0为0

DISPLAY:
    MOV A, R0
    MOVC A, @A+DPTR ; 根据累加器A的值(当前数字)和DPTR的地址,读取对应的数码管编码到累加器A
    MOV P0, A ; 将累加器A中的数码管编码输出到P0口,显示当前数字

EXIT_INT:
    POP DPH ; 恢复数据指针高字节
    POP DPL ; 恢复数据指针低字节
    POP B ; 恢复B寄存器
    POP ACC ; 恢复累加器
    POP PSW ; 恢复程序状态字
    CLR EX0 ; 清除外部中断0的请求标志
    RETI ; 从中断返回

DELAY: ; 延时子程序标签
    MOV R1, #02H ; 设置延时计数器R1为2,用于控制延时长度
LP1: MOV R2, #0FFH ; 设置内部延时计数器R2为255
LP2: MOV R3, #0FFH ; 设置最内层延时计数器R3为255
LP3: DJNZ R3, LP3 ; 递减R3,直到为0,然后跳回LP3继续循环
    DJNZ R2, LP2 ; 递减R2,直到为0,然后跳回LP2继续循环
    DJNZ R1, LP1 ; 递减R1,直到为0,然后跳回LP1继续循环
    RET ; 返回主程序

NUMTAB: ; 数码管段码表标签
DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H ; 共阳极数码管0-9的编码表
END ; 程序结束
```

代码中设置了外部中断0(INT0)来检测按键的按下。当INT0被触发时,程序会跳转到`EXINT0`处理程序。在这个处理程序中,我们首先执行延时以消除按键抖动,然后检查按键是否仍然被按下。如果按键被按下,程序会增加计数器`R0`,并根据`R0`的值显示相应的数码管编码。如果`R0`的值达到10,它会被重置为0。最后,我们清除中断请求标志并从中断返回。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表