51汇编Proteus仿真教程——9.独立按键

简介:

本文详细介绍如何使用51汇编的Proteus仿真去实现独立按键控制对应LED灯亮。此教程只做操作过程,不具体解释每一步具体含义,以极简的方式,通过操作让你实现相关功能。
前提条件:
①新建好相关的仿真工程,绘制好相关原理图
②学会了IO口的基本控制
如果不具备以上条件,可以往回看相关教程,往期内容有较详细的讲解!

1、整体原理图如下

在这里插入图片描述

2、独立按键原理图

在这里插入图片描述
这里使用的按键的名称BUTTON。将按键的一端连接在一起与GND相连,另一端连接到对应的IO口:P1.0,P1.2,P1.3,P1.4,通过检测IO是否为低电平,判断按键是否按下。

3、按键检测子程序程序

;=========================
; 按键检测子程序
; 名称:KEY_SCAN
; 输入:空
; 输出:空
; 功能:检测按键是否被按下
;=========================
KEY_SCAN:
SETB KEY1
SETB KEY2
SETB KEY3
SETB KEY4
KEY1_SCAN:
JB KEY1, KEY2_SCAN ;按键1是否按下:是:继续执行,否:跳去检测按键2
ACALL DELAY_200MS ;消抖
JB KEY1, KEY2_SCAN ;按键1是否按下:是:继续执行,否:跳去检测按键2
AJMP KEY1_TASK ;跳转执行按键1的任务
KEY2_SCAN:
JB KEY2, KEY3_SCAN
ACALL DELAY_200MS
JB KEY2, KEY3_SCAN
AJMP KEY2_TASK
KEY3_SCAN:
JB KEY3, KEY4_SCAN
ACALL DELAY_200MS
JB KEY3, KEY4_SCAN
AJMP KEY3_TASK
KEY4_SCAN:
JB KEY4, KEY_SCAN_END
ACALL DELAY_200MS
JB KEY4, KEY_SCAN_END
AJMP KEY4_TASK

KEY1_TASK: ;按键1任务
JNB KEY1, KEY1_TASK ;等待按键松开
MOV P0, #1 ;执行按键1对应的操作
AJMP KEY_SCAN_END ;跳出按键扫描程序
KEY2_TASK:
JNB KEY2, KEY2_TASK
MOV P0, #2
AJMP KEY_SCAN_END
KEY3_TASK:
JNB KEY2, KEY3_TASK
MOV P0, #4
AJMP KEY_SCAN_END
KEY4_TASK:
JNB KEY4, KEY4_TASK
MOV P0, #8

KEY_SCAN_END:
RET
;=========================

4、具体效果展示(由于gif格式问题,显示有点问题)

在这里插入图片描述
在这里插入图片描述

5、完整程序

;=========================
; 文件名称:main.asm
; 文件描述:汇编基本程序教程:按键
; 创建人:lsh
; 创建日期: 2023.10.09
; 程序版本:1.0
; 完成日期:2023.10.09
;=修改记录====
; 修改人:
; 修改内容:
; 修改时间:
;=========================

$NOMOD51
$INCLUDE (80C52.MCU)
; IO引脚定义
;=========================
KEY1 EQU P1.1 ; 定义P1.1口为KEY1
KEY2 EQU P1.2 ; 定义P1.2口为KEY2
KEY3 EQU P1.3 ; 定义P1.3口为KEY3
KEY4 EQU P1.4 ; 定义P1.4口为KEY4

SEG_DUAN EQU P0 ;定义P0口为SEG_DUAN
;=========================
;=========================
org 0000h
jmp Start ; 跳转到程序开始入口

;=========================
; 主程序
;=========================
org 0100h
Start:

;=========================
; 主程序的主循环
;=========================
Loop: ; 程序主循环
LCALL DELAY ; 调用延时子程序
LCALL KEY_SCAN
AJMP Loop ; 跳转到程序主循环开头

;=========================
;子程序
;=========================

;=========================
; 延时子程序
; 名称:DELAY
; 输入:空
; 输出:空
; 功能:占用cpu,实现延时一段时间
;=========================
DELAY:
MOV R0,#228
DELAY1:
MOV R1,#20
DELAY2:
MOV R2,#20
DJNZ R2,$
DJNZ R1,DELAY2
DJNZ R0,DELAY1
RET
;=========================
;=========================
; 延时子200MS程序
; 名称:DELAY_200MS
; 输入:空
; 输出:空
; 功能:占用cpu,实现延时一段时间
;=========================
DELAY_200MS:
MOV R0,#48
DELAY_200MS1:
MOV R1,#142
DELAY_200MS2:
MOV R2,#9
DJNZ R2,$
DJNZ R1,DELAY_200MS2
DJNZ R0,DELAY_200MS1
RET
;=========================
; 按键检测子程序
; 名称:KEY_SCAN
; 输入:空
; 输出:空
; 功能:检测按键是否被按下
;=========================
KEY_SCAN:
SETB KEY1
SETB KEY2
SETB KEY3
SETB KEY4
KEY1_SCAN:
JB KEY1, KEY2_SCAN ;按键1是否按下:是:继续执行,否:跳去检测按键2
ACALL DELAY_200MS ;消抖
JB KEY1, KEY2_SCAN ;按键1是否按下:是:继续执行,否:跳去检测按键2
AJMP KEY1_TASK ;跳转执行按键1的任务
KEY2_SCAN:
JB KEY2, KEY3_SCAN
ACALL DELAY_200MS
JB KEY2, KEY3_SCAN
AJMP KEY2_TASK
KEY3_SCAN:
JB KEY3, KEY4_SCAN
ACALL DELAY_200MS
JB KEY3, KEY4_SCAN
AJMP KEY3_TASK
KEY4_SCAN:
JB KEY4, KEY_SCAN_END
ACALL DELAY_200MS
JB KEY4, KEY_SCAN_END
AJMP KEY4_TASK

KEY1_TASK: ;按键1任务
JNB KEY1, KEY1_TASK ;等待按键松开
MOV P0, #1 ;执行按键1对应的操作
AJMP KEY_SCAN_END ;跳出按键扫描程序
KEY2_TASK:
JNB KEY2, KEY2_TASK
MOV P0, #2
AJMP KEY_SCAN_END
KEY3_TASK:
JNB KEY2, KEY3_TASK
MOV P0, #4
AJMP KEY_SCAN_END
KEY4_TASK:
JNB KEY4, KEY4_TASK
MOV P0, #8

KEY_SCAN_END:
RET
;=========================

;=========================
END ; 程序结束
;=========================

点赞、收藏加关注,下期不迷路!

更多精彩内容,请看往期!

一起学起来,让我们成为更优秀的自己!我们下期不见不散!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值