凔海笔记之单片机(五):给按键编个码

按键通常是一种长常开型按钮开关,例如下图,如果不按动得话它就是断开状态的。

它作为单片机的附属小鬼,主要就是为了让单片机检测出它的状态,然后单片机根据这个状态来干一些事。例如,当按键按下灯亮,当按键按下开启某个器件。

看上面这四个按键,如果你不按他的话,单片机的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进行寻找即可 。

欢迎观看:

单片机笔记(一):莫在浮沙筑高台

单片机笔记(二):初识单片机

单片机笔记(三):满眼LED多闪烁

单片机笔记(四):数码管的无奈

近期精彩内容推荐:

整流杂谈(一)

整流杂谈(二)

整流杂谈(三)

(0)

相关推荐

  • 单片机实例分享,如何设计八路抢答器

    本文首发于今日头条,并获得青云计划现金奖励 单片机作为可编程器件,简化了电路的设计.方便了逻辑设计,从此再也不用使用一大堆电路做硬件逻辑了.拆开任何一件功能稍微复杂一点电子产品,里边都可以看到单片机的 ...

  • 上拉、下拉以及对应上拉电阻和下拉电阻的作用原理

    一.什么是上拉和下拉电路 上拉(Pull Up )或下拉(Pull Down)电阻两者统称为拉电阻 上拉就是单片机的IO口串联一个电阻到VDD: 下拉就是单片机的IO口串联一个电阻到GND: 如图所示 ...

  • STM32 GPIO模式汇总分析

    IO也叫GPIO,即通用输入输出端口,主要有一下几种模式: 1.浮空输入模式: 2.上拉输入: 3.下拉输入: 4.模拟输入: 5. 推挽输出: 6. 开漏输出: 7. 复用推挽输出: 8. 复用开漏 ...

  • 凔海笔记之FPGA(五):(基本|| 组合)逻辑

    与门电路:有0则为0 与门(英语:AND gate)又称"与电路".逻辑"积".逻辑"与"电路.是执行"与"运算的基本逻 ...

  • 凔海笔记之FPGA(十一):SDRAM

    对于SDRAM,就以以下四个方面来写下自己的笔记吧 1.初探存储器 2.对SDRAM的认识 3.Verilog综合的SDRAM单字节读写时序 4.多字节读写和页读写 嗯,就这样 下图这个,学过数电的都 ...

  • 凔海笔记之FPGA(十):玩一玩DS1302

    现在这日子过得,一周四节课,没有考试没有作业更没有实验课,真不知道说什么好,还是来说说DS1302吧.(- ̄▽ ̄)-            它生有八脚,电源分主备,晶振有要求,时序有讲究,可记年月日, ...

  • 凔海笔记之FPGA(九):Verilog描述IIC单字节读写协议

    一.简介AT24C04 AT24C04是小容量(4KB)IIC总线EPROM存储元件.这句话说得很有内容呀.首先,AT24c04是存储元件,还是EPROM即可擦写可编程只读存储器,而且断电可保存.其次 ...

  • 凔海笔记之FPGA(八):Verilog描述RS232 UART

    在我看来,有些代码会用,但未必理解,有些代码理解,但未必会写,有些代码会写,但未必能用自己的话说出来.当能够以自己的想法深入浅出的讲解所学知识,那也就可以说自己掌握了,所以,我还是来发帖吧. 记得刚用 ...

  • 凔海笔记之FPGA(七):触发器和锁存器

    大多数数字系统中,除了需要具有逻辑运算和算数功能的组合逻辑电路外,还需要具有存储功能的电路,组合逻辑与时序逻辑可构成时序逻辑电路,简称时序电路.现在讨论实现存储功能的两种逻辑单元电路,即锁存器和触发器 ...

  • 凔海笔记之FPGA(四):Verilog HDL语法简单述

    在百度百科中,是这样介绍Verilog HDL的,它是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表 ...

  • 凔海笔记之FPGA(一):我和我的FPGA

    "老师,单片机那个试验箱都弄完了,接下来我想学学arm" "噢,那挺好的,要不你先学学FPGA吧,学好了FPGA再接触arm会学得更好些" "FPGA ...

  • 海厦伤寒论笔记(六五)

    伤寒论第61条辨: 下之后,复发汗,昼日烦躁,不得眠,夜而安静,不呕不渴,无表证,脉沉微,身无大热者,干姜附子汤主之. 原文解释:误用泻下之后,又误发其汗,致肾阳虚弱,病人出现白天烦躁.不能安静睡眠, ...