注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题

chenht7的个人空间 http://home.eeworld.com.cn/space-uid-490705.html [收藏] [复制] [分享] [RSS]

日志

单片机_汇编编程_10_一键多功能按键识别技术

已有 115 次阅读2017-10-5 15:48 |个人分类:汇编

 单片机_汇编编程_一键多功能按键识别技术
时间:2017/10/5

# 一、任务描述
通过汇编编程,实现每当按下开关,然后在L1-L4的LED进行按照按下对应的次数,依次单个闪烁。

# 二、任务实现
## 2.1 硬件连接
目前的硬件线路如下:
主控芯片: STC 89C52
输入引脚: P3.7 - 独立式按钮
输出引脚: P1.0 - P1.7 驱动LED
工作频率: 12MHz

[图 10_一键多功能按键识别技术_IO]

## 2.2 分析命题
这次主要的功能如下:
1. 采用实际的按键,按键可能会存在抖动的现象 <-- 设计软件消抖,也就是采用了延时的方法
2. 数据进行累加输出 <-- 需要进行判断数据后,将每个数据进行加一输出
3. 针对不同的按键次数,调用不同的功能 <-- 设置循环和采用寄存器进行判断

## 2.3 确定算法
目前的算法,继承了第9个实验中对按键进行的操作,以及在第8个实验中,进行统计了按键按下的次数。从而跳转到对应的子语句中进行。

## 2.4 流程图

[图 10_一键多功能按键识别技术_流程图]

## 2.5 程序

```

ID EQU 30H
K1 BIT P3.7             ; 进行位定义
L1 BIT P1.0             ; 进行位定义
L2 BIT P1.1             ; 进行位定义
L3 BIT P1.2             ; 进行位定义
L4 BIT P1.3             ; 进行位定义

ORG 00H
MOV ID, #00H
START:
    JB K1, REL                  ; 判断按键是否按下
    LCALL DELAY10MS      ; 进行按键消抖
    JB K1, REL                  ; 判断按键是否按下
    INC ID                       ; ID寄存器加一
    MOV A, ID                  ; 将自增后的数值赋予寄存器A
    CJNE A, #04, REL        ; 如果寄存器的数值满4,则进行重新赋初值
    MOV ID, #00H            ; 重新赋予初值
REL:
    JNB K1, $                 ; 判断按键是否复原-
    MOV A, ID                ; 将ID的数值,写入到寄存器当中
    CJNE A, #00H,IS0     ; 如果寄存器的值为0时,跳转到IS0
    SETB L4                   ; 关闭L4的显示
    CPL L1                     ; L1端口进行取反输出,用于点亮LED
    LCALL DELAY            ; 调用延时函数
    SJMP START             ; 跳转回起始
IS0:
    CJNE A, #01H, IS1   ; 如果寄存器的值为1时,跳转到IS1
    SETB L1                  ; 关闭L1的显示
    CPL L2                    ; L2端口进行取反输出,用于点亮LED
    LCALL DELAY           ; 调用延时函数
    SJMP START            ; 跳转回起始
IS1:
    CJNE A, #02H, IS2   ; 如果寄存器的值为2时,跳转到IS2
    SETB L2                  ; 关闭L2的显示
    CPL L3                    ; L3端口进行取反输出,用于点亮LED
    LCALL DELAY           ; 调用延时函数
    SJMP START            ; 跳转回起始
IS2:
    CJNE A, #03H, IS3   ; 如果寄存器的值为3时,跳转到IS3
    SETB L3                  ; 关闭L3的显示
    CPL L4                    ; L4端口进行取反输出,用于点亮LED
    LCALL DELAY           ; 调用延时函数
    SJMP START            ; 跳转回起始
IS3:
    LJMP START            ; 跳转回起始
DELAY10MS:                ; 延时函数
    MOV R6, #20
LOOP1:
    MOV R7, #248
    DJNZ R7, $
    DJNZ R6, LOOP1
    RET
DELAY:
    MOV R5, #20
LOOP2:
    LCALL DELAY10MS
    DJNZ R5, LOOP2
    RET
    END

```


# 三、总结
目前的程序结合了前面学的一些知识比较多。用于实现多功能按键的方法为,采用一个独立的寄存器用于储存按下的次数。然后依次进行不断的判断,从而实现对应的效果。只是从这个效果来看,貌似这个效果就像是if...else语句,而不是说case这个语句。

# 参考资料
[1] 《单片机的编程与汇编程序案例》, https://wenku.baidu.com/view/9018d6795acfa1c7aa00cc58.html

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-10-17 19:23 , Processed in 0.103837 second(s), 11 queries , Redis On.

Powered by EEWORLD电子工程世界

© 2017 http://bbs.eeworld.com.cn/

返回顶部