凔海笔记之单片机(五):给按键编个码
按键通常是一种长常开型按钮开关,例如下图,如果不按动得话它就是断开状态的。
它作为单片机的附属小鬼,主要就是为了让单片机检测出它的状态,然后单片机根据这个状态来干一些事。例如,当按键按下灯亮,当按键按下开启某个器件。
看上面这四个按键,如果你不按他的话,单片机的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进行寻找即可 。
欢迎观看:
近期精彩内容推荐: