重工电子论坛

标题: STM32矩阵键盘中断形式和扫描形式程序 [打印本页]

作者: 王志洋-12级-电气    时间: 2015-7-26 13:16
标题: STM32矩阵键盘中断形式和扫描形式程序
本帖最后由 王志洋-12级-电气 于 2015-7-26 13:54 编辑

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

2, 另外利用键值不同也能实现边沿触发
作者: 王志洋-12级-电气    时间: 2015-7-27 09:22
程浥 发表于 2015-7-26 19:17
1, 中断里延时了10 ms,感觉影响比放在while里大

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

10ms拿来消抖的,不然误触发太多了。
作者: 王志洋-12级-电气    时间: 2015-7-27 09:25
程浥 发表于 2015-7-26 19:17
1, 中断里延时了10 ms,感觉影响比放在while里大

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

键值不同实现边沿触发是什么意思呀~学长教我~
作者: 园丁    时间: 2015-7-30 13:18
中断服务程序执行的越快越好,中断延时10ms是不好的设计。
作者: 王志洋-12级-电气    时间: 2015-7-30 21:17
园丁 发表于 2015-7-30 13:18
中断服务程序执行的越快越好,中断延时10ms是不好的设计。

我也觉得不好,中断里面不宜延时,但是按键的防抖延时典型值是10ms,不加延时很容易误触发,考虑扫描和中断的利弊,所以还是加了延时,万老师,这个如果不加延时该怎么处理呢?
作者: 园丁    时间: 2015-7-31 16:03
例如用键盘中断标志,在主程序中延时,更好的方法是用操作系统。
作者: 顾福源    时间: 2015-8-1 21:18
在主函数里面做延时的话那就得保证while(1)里面的内容全部轮循一遍还能检测得到按键按下额




欢迎光临 重工电子论坛 (http://www.cqutlab.cn/) Powered by Discuz! X3.1