重工电子论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 8871|回复: 7
打印 上一主题 下一主题

STM32矩阵键盘中断形式和扫描形式程序

[复制链接]
跳转到指定楼层
楼主
发表于 2015-7-26 13:16:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 王志洋-12级-电气 于 2015-7-26 13:54 编辑

        扫描按键主要靠的就是不断的去进行按键的扫描,而且有一些局限性,比如主函数中有比较长的代码需要较长时间时,为了得到值,我的按键就得按得久一点。
再比如为了防止连按,程序要死等按键释放。
        这里我主要介绍下中断形式的矩阵键盘,利用中断的形式得到正确的矩阵键盘的值,尽量的节约CPU的资源。中断形式的矩阵键盘,其实是利用行列反转法实现的,
那么什么是行列反转法呢?
        首先,设置列为上拉输入(或外部上拉),设置行为输出且全为0,当有按键按下时,列的四位上会有某一位产生电平变化,只要有电平变化(或者说有沿),
就可以触发外部中断了,在中断服务函数中,可以读出列码,即此时按下的按键在那一列已经知道了,那么要做的就是想办法把行码找到,那么怎么找呢?此时,
如果我把列改为输出,行改为上拉输入,再把列输入的值原原本本的让列输出,那么行输入必然会读到一个行码。此时行列已经被我们解出来了。要注意的是,
按键按下一般都是百毫秒级的时间,这个时间对于CPU来说是很长很长的,所以才允许你做出这些处理动作来。利用外部中断出的扫描按键不存在死等的问题,
因为它是边沿触发的,总结一下,中断形式的矩阵键盘,不需要循环的去扫描按键,在不需要按键的时候不会对CPU带来负担,同时,扫描按键中的死等问题,
中断里面也不会存在。
     额,没有图片,如果有什么疑问和建议的可以和我讨论下,或者可以找找资料看下。至于程序,由于水平有限,希望大家可以提出一些宝贵意见。
STM32矩阵键盘(扫描) LCD1602.zip (333.76 KB, 下载次数: 14) 矩阵键盘(中断) LCD1602(可以的).zip (335.75 KB, 下载次数: 35)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

16

主题

75

帖子

863

积分

版主

Rank: 7Rank: 7Rank: 7

积分
863
QQ
沙发
发表于 2015-7-26 19:17:02 | 只看该作者
1, 中断里延时了10 ms,感觉影响比放在while里大

2, 另外利用键值不同也能实现边沿触发
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2015-7-27 09:22:36 | 只看该作者
程浥 发表于 2015-7-26 19:17
1, 中断里延时了10 ms,感觉影响比放在while里大

2, 另外利用键值不同也能实现边沿触发

10ms拿来消抖的,不然误触发太多了。
回复 支持 反对

使用道具 举报

地板
 楼主| 发表于 2015-7-27 09:25:39 | 只看该作者
程浥 发表于 2015-7-26 19:17
1, 中断里延时了10 ms,感觉影响比放在while里大

2, 另外利用键值不同也能实现边沿触发

键值不同实现边沿触发是什么意思呀~学长教我~
回复 支持 反对

使用道具 举报

1

主题

16

帖子

140

积分

超级版主

Rank: 8Rank: 8

积分
140
5#
发表于 2015-7-30 13:18:21 | 只看该作者
中断服务程序执行的越快越好,中断延时10ms是不好的设计。
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2015-7-30 21:17:18 | 只看该作者
园丁 发表于 2015-7-30 13:18
中断服务程序执行的越快越好,中断延时10ms是不好的设计。

我也觉得不好,中断里面不宜延时,但是按键的防抖延时典型值是10ms,不加延时很容易误触发,考虑扫描和中断的利弊,所以还是加了延时,万老师,这个如果不加延时该怎么处理呢?
回复 支持 反对

使用道具 举报

1

主题

16

帖子

140

积分

超级版主

Rank: 8Rank: 8

积分
140
7#
发表于 2015-7-31 16:03:06 | 只看该作者
例如用键盘中断标志,在主程序中延时,更好的方法是用操作系统。
回复 支持 反对

使用道具 举报

20

主题

74

帖子

382

积分

学生管理组

Rank: 8Rank: 8

积分
382
8#
发表于 2015-8-1 21:18:32 | 只看该作者
在主函数里面做延时的话那就得保证while(1)里面的内容全部轮循一遍还能检测得到按键按下额
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|cqutlab ( 渝ICP备15004556号

GMT+8, 2024-4-29 15:44 , Processed in 0.171204 second(s), 33 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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