2797|5

57

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

凔海笔记之单片机(五):给按键编个码 [复制链接]

本帖最后由 凔海 于 2016-3-24 07:38 编辑

    按键通常是一种长常开型按钮开关,例如下图,如果不按动得话它就是断开状态的。
   它作为单片机的附属小鬼,主要就是为了让单片机检测出它的状态,然后单片机根据这个状态来干一些事。例如,当按键按下灯亮,当按键按下开启某个器件。
    看上面这四个按键,如果你不按他的话,单片机的IO口接收的就是高点平,如果按键按下则为低电平了。所以嘞,单片机通过检测该IO口的电平是不是低电平来判断是否按下,如果按键按下,可以执行按键按下所对应的一些事。
    然而,这并不代表这你就可以顺利的使用这个按键了。因为我们还没有进行按键消抖。消抖?!按键会抖动?YES!百度说了:“按键作为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。”如下图
        那么,为什么要消抖了?
        答:会产生误判,如果用按键计数的话,按一下就好像按了好几下的样子,不稳定,试想,我就想按下它,它却在那里抖半天,忍受不了。╭∩╮(︶︿︶)╭∩╮
        如何消抖了?有软件消抖和硬件消抖俩种。这里主要说的是软件消抖,就是首次检测到低电平的时候,等待那么一会再检测是不是低电平,如果是的话,那说明却是按下去了,这样就可以了。这个等待,百度说5ms~10ms,但看人家程序差不多15ms。
           if(K1==0)
{
        delay1ms(15);//延时15ms
        if(K1==0)
{
这样就OK啦
下面就用按键实现加一功能。满九归零。
        不过节约资源是人类传统美德,要让单片机用更少的IO口去控制更多的按键自然是必然趋势。所以,我们发明了矩阵键盘,例如2*3、3*4、4*4等等,接下来就一起看看4*4的矩阵键盘吧。
这个与单独一个按键的区别不仅在于多,更在于连个地都没有,该怎么检测哪个键按下了?你不给我GND,我自个模拟个GND( ̄◡◝)。先写P1=0x0f,即让P10、P11、P12、P13为低电平,P14、P15、P16、P17为高电平 。这样,如果K0按下,则P14也为低电平。说实话,我一开始并不知道为什么P10不为高电平而P14为低电平,最后听说这事线与功能。再回到刚才说的,K0按下P14低电平,如果K4按下的话,P14也是低电平,所以这样虽然有了GND,但还是检测不出哪个按下了,是吧?
在这里提供有俩种方法,一种叫扫描法,一种称为线翻转法。
1、扫描法
        扫描,说白了就是挨个问,唉,是不是你啊?不是?那是不是你啊?还不是我靠?!接着问,只要有按键按下总能问出来的。
        所以,用程序如何实现呢?
扫描大法第一步:
        检测有没有按键按下


         P1 = 0xff;
         P1 = 0xf0;
         temp_key = P1;
         if(temp_key != P1)
         {
                 delaynms(15);
                if(temp_key != P1)
这个和单个按键检测方式一样的
扫描大法第二步:
逐行扫描,逐个判断这是扫描大法的精髓所在
首先,给P1 = 0xfe;再把P1的值读取给temp_key = P1;这是何种目的?在说之前要确定一件事,现在你还没有松开按键了,单片机虽然不快吧,但也比咱手按按键快得多,之所以提,因为记得当初我以为这个时候我的手已经松开了(⊙﹏⊙)b。我们看4*4矩阵键盘,因为P1=0xfe,如果第一行K0、K1、K2、K3其中一个按下,则对应的P14、P15、P16、P17其中一个为低电平,这时,把P1检测的值发给temp_key,然后看看temp_key是不是K0、K1、K2、K3其中的一个编码(即ee  de        be  7e)其中一个。那如何看看啊?这个就用switch来进行
                        switch(temp_key)
                        {
                                case(0xee):display(0);break;
                                case(0xde):display(1);break;
                                case(0xbe):display(2);break;
                                case(0x7e):display(3);break;
                        }
当然这只是完成了一行的扫描,咱一共四行嘞,所以要进行这样操作四次。
第二行……
这就是扫描大法 ,虽实现了对按键的检测,但略显麻烦,故有了方法二线翻转法。
线反转大法
第一步:检测是否有按键按下,同扫描大法一样
第二步:线反转法之核心就在于翻转
        temp_1 = P1;temp_1所得到的值可以判断出那一列按下,如果我们P1 = 0x0f;temp_2 = P1; 这样就可以判断出哪一行的贱按下,这样行列交叉或以下就可以判断出世那个歌健按下temp = temp_1 | temp_2;temp的值就是按键的编码,然后用switch进行寻找即可 。


学识浅薄出拙文,如察错误望赐教,小弟在此感涕零。                                                         





按键程序.rar

31.96 KB, 下载次数: 15

此帖出自51单片机论坛

最新回复

厉害.............  详情 回复 发表于 2016-4-5 19:18
点赞 关注
 

回复
举报

361

帖子

5

TA的资源

一粒金砂(高级)

沙发
 
此帖出自51单片机论坛
 
 
 

回复

928

帖子

0

TA的资源

纯净的硅(中级)

板凳
 
楼主好样的,请继续
此帖出自51单片机论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(初级)

4
 
通俗易懂,期待楼主继续,谢谢分享!
此帖出自51单片机论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(初级)

5
 
有意思,但麻烦了点
此帖出自51单片机论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(初级)

6
 
厉害.............
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表