设为首页 | 加入收藏
您当前位置:主页 > www.466011.com > 单片机按键扫描程序的设计

单片机按键扫描程序的设计

时间:2019-10-23 03:39 来源:未知   点击:

  不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种

  同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点。

  对于老鸟,我建议直接看那两个表达式,然后自己想想就会懂的了,也不需要听我后面的自吹自擂了,我可没有班门弄斧的意思,hoho~~但是对于新手,我建议将全文看完。因为这是实际项目中总结出来的经验,学校里面学不到的东西。

  以下假设你懂C语言,因为纯粹的C语言描述,所以和处理器平台无关,你可以在MCS-51,AVRPIC,甚至是ARM平台上面测试这个程序性能。当然,我自己也是在多个项目用过,效果非常好的。

  好了,工程人员的习惯,废话就应该少说,开始吧。以下我以AVR的MEGA8作为平台讲解,没有其它原因,因为我手头上只有AVR的板子而已没有51的。用51也可以,只是芯片初始化部分不同,还有寄存器名字不同而已。

  完了。有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!!

  1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。

  2:算法1,用来计算触发变量的。一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。

  看到这里,有种“知其然,不知其所以然”的感觉吧?代码很简单,但是它到底是怎么样实现我们的目的的呢?好,下面就让我们绕开云雾看青天吧。

  我们最常用的按键接法如下:AVR是有内部上拉功能的,但是为了说明问题,我是特意用外部上拉电阻。那么,按键没有按下的时候,读端口数据为1,如果按键按下,那么端口读到0。下面就看看具体几种情况之下,这算法是怎么一回事。

  端口为0xff,ReadData读端口并且取反,很显然,就是 0x00 了。

  端口数据为0xfe,ReadData读端口并且取反,很显然,就是 0x01 了。

  Trg = 0x01;Trg只会在这个时候对应位的值为1,其它时候都为0

  因为现在按键是长按着,所以MCU会每个一定时间(20ms左右)不断的执行这个函数,那么下次执行的时候情况会是怎么样的呢?

  Trg 表示的就是触发的意思,也就是跳变,只要有按键按下(电平从1到0的跳变),那么Trg在对应按键的位上面会置一,我们用了PB0则Trg的值为0x01,类似,如果我们PB7按下的话,Trg 的值就应该为 0x80 ,这个很好理解,还有,最关键的地方,Trg 的值每次按下只会出现一次,然后立刻被清除,完全不需要人工去干预。所以按键功能处理程序不会重复执行,省下了一大堆的条件判断,这个可是精粹哦!!Cont代表的是长按键,如果PB0按着不放,那么Cont的值就为 0x01,相对应,PB7按着不放,那么Cont的值应该为0x80,同样很好理解。

  假设PB0为蜂鸣器按键,按一下,蜂鸣器beep的响一声。这个很简单,但是大家以前是怎么做的呢?对比一下看谁的方便?

  怎么样?够和谐不?记得前面解释说Trg的精粹是什么?精粹就是只会出现一次。所以你按下按键的话,Trg & KEY_BEEP 为“真”的情况只会出现一次,所以处理起来非常的方便,蜂鸣器也不会没事乱叫,hoho~~~

  项目中经常会遇到一些要求,例如:一个按键如果短按一下执行功能A,如果长按2秒不放的话会执行功能B,又或者是要求3秒按着不放,计数连加什么什么的功能,很实际。不知道大家以前是怎么做的呢?我承认以前做的很郁闷。

  这里具个简单例子,为了只是说明原理,PB0是模式按键,短按则切换模式,PB1就是加,如果长按的话则连加(玩过电子表吧?没错,就是那个!)

  不知道各位感觉如何?我觉得还是挺简单的完成了任务,当然,作为演示用代码。

  点触形按键估计用的最多,特别是单片机。开关型其实也很常见,例如家里的电灯,那些按下就不松开,除非关。这是两种按键形式的处理原理也没啥特别,但是你有没有想过,如果一个系统里面这两种按键是怎么处理的?我想起了我以前的处理,分开两个非常类似的处理程序,现在看起来真的是笨的不行了,但是也没有办法啊,结构决定了程序。不过现在好了,用上面介绍的办法,很轻松就可以搞定。

  原理么?可能你也会想到,对于点触开关,按照上面的办法处理一次按下和长按,对于开关型,我们只需要处理Cont就OK了,为什么?很简单嘛,把它当成是一个长按键,这样就找到了共同点,屏蔽了所有的细节。程序就不给了,完全就是应用2的内容,在这里提为了就是说明原理~~

  好了,这个好用的按键处理算是说完了。可能会有朋友会问,为什么不说延时消抖问题?哈哈,被看穿了。果然不能偷懒。下面谈谈这个问题,顺便也就非常简单的谈谈我自己用时间片轮办法,以及是如何消抖的。

  延时消抖的办法是非常传统,也就是 第一次判断有按键,延时一定的时间(一般习惯是20ms)再读端口,如果两次读到的数据一样,说明了是真正的按键,而不是抖动,则进入按键处理程序。

  当然,不要跟我说你delay(20)那样去死循环去,真是那样的话,我衷心的建议你先放下手上所有的东西,好好的去了解一下操作系统的分时工作原理,大概知道思想就可以,不需要详细看原理,否则你永远逃不出“菜鸟”这个圈子。当然我也是菜鸟。我的意思是,真正的单片机入门,是从学会处理多任务开始的,这个也是学校程序跟公司程序的最大差别。当然,本文不是专门说这个的,所以也不献丑了。

  貌似扯远了,回到我们刚才的问题,也就是怎么做按键消抖处理。我们将读按键的程序放在了主循环,也就是说,每20ms我们会执行一次KeyRead()函数来得到新的Trg 和 Cont 值。好了,下面是我的消抖部分:很简单

  基本架构如上,我自己比较喜欢的,一直在用。当然,和这个配合,每个子程序必须执行时间不长,更加不能死循环,一般采用有限状态机的办法来实现,具体参考其它资料咯。

  懂得基本原理之后,至于怎么用就大家慢慢思考了,我想也难不到聪明的工程师们。例如还有一些处理,

  中国硬件创新大赛网络培训会—技术培训篇如果你就干这行,毫无疑问你不能错过这次直播;如果不是,可能你不一定喜欢单片机,也不

  要用C语言开发PIC单片机和模拟仿真调试程序,必须有相应的编译器,PICC与PICC18的C编译器是....

  在不少嵌入式&单片机开发工程师眼里 树莓派(Raspberry Pi) 一直一个神奇的存在: 仅有一张银行卡般的面积 却具...

  我们使用PIC32 MX695F512L微控制器,用于5MbPS波特率的高速SPI通信。我们在MoSi和MISO和CLK引脚...

  微控制单元MCU,也叫单片微型计算机,简称单片机,它把CPU做缩减,并将内存、计数器、LCD驱动电路....

  我现在usingcy8cmbr3116,单片机STM32,如何decidecy8cmbr3116addr?...

  用单片机做一个检测系统,检测电压脉冲 并用数码管显示出来,显示电压脉冲数 电压脉冲数在0-2000/s...

  unsigned char a; 请问 if(a==4) 与 if(a==0x04)有何不同,为什么出来的结果不一样?...

  小白一个,现在要做毕设是用探索者STM32F4+ov2640,想植入UCOSIII操作系统进行运动图像的数据采集以及背景...

  VDD处接MCU控制,电阻放在R3和R4的区别是什么?一般都放在R3位置,反正R4的位置是有什么意义? ...

  如图,图中开关量输入电路中光耦输入端有三个电阻和一个二极管,请问在触点闭合及断开时这四个元件的具体作用是什么?...

  RS232串行接口属于个人计算机(PC)及电信应用领域中最为成功的串行数据标准。它被定义为一种在低速....

  外时钟是高频的噪声源,除能引起对本应用系统的干扰之外,还可能产生对外界的干扰,以8051单片机为例最....

  嵌入式系统是一个大类,单片机是其中一个重要的子类。嵌入式系统像是一个完整的计算机,而单片机更像是一个....

  IO口是芯片内部CPU和外设之间沟通的桥梁,也是其他模块(如I2C通讯、SPI通讯)的基础。

  我们要明白嵌入式系统不是PC系统,是另一种独立操作系统。它包括硬件和软件两部分。

  uC/OS-II具有免费、使用简单、可靠性高、实时性好等优点,但也有移植困难、缺乏必要的技术支持等缺....

  嵌入式代码优化,除了最基本的函数实现细节算法优化外,还有一些细节的处理。

  我是电子制作爱好者,最近从网上看到这款单片机驱动的发光二极管做的数码管时钟,以下是作者的介绍“以前做....

  单片机是一种控制芯片,一个微型的计算机,而加上晶振,存储器,地址锁存器,逻辑门,七段译码器(显示器)....

  由于MODEM 是将数据通过公用电话网进行远程发送和传输的桥梁,这里先将MODEM 的功能及用法做一....

  当按键开关闭合或者断开时各有一段电平不稳定的时期,按键开关在闭合时不会马上就稳定的接通,在断开时也不....

  机控制系统通常要用到A/D转换。根据输出的信号格式,比较常用的A/D转换方式可分为并行A/D和串行A....

  SPCE061A单片机通过串行口与指纹识别模块OM—20通信。SPCE061A单片机内部有一个标准全....

  提到单片机很多人都很觉得不陌生,大街小巷上面电子产品都用到。近几年随着嵌入式的发展,做单片机的一帮家....

  嵌入式开发的门槛相对较高,对程序员的要求一般都是对底层感兴趣,学习能力、动手能力要强,对问题能够从全....

  软件世界中有各种各样的编程语言,每年还会有新的语言出现,最近发布的编程语言就有Scala、Kotli....

  单片机:通常具备片内flash存储器,固件程序通常存储在该区域,若固件较大则需要通过外部电路设计外部....

  这是一个周期是10ms,即频率是 100Hz的波形,但是每个周期内,高低电平脉冲宽度各不相同,这就是....

  死机是指CPU的程序指针进入一个死循环,无法执行正常的程序流程。其外在表现常常是:正常功能丧失,按键....

  单片机(Microcontroller)一般都有内部ROM/EEPROM/FLASH供用户存放程序。....

  以上程序使用PIC12C508 单片机 ,内部4MHz时钟,4脚输入50HZ脉冲信号,7,6,3脚(....

  1 工作方式0 定时器/计数器T0工作在方式0时,16位计数器只用了13位,即TH0的高8位和....

  单片机进入空闲模式的时候,除了cpu处于休眠状态外,其余的硬件全部处于活动状态,芯片中未涉及的数据存....

  1、4个工作寄存器组共有32个通用寄存器,但在指令中只能使用当前寄存器组(工作寄存器组的选择在前面专....

  写寄存器的时候,如果我们要把01写到一个地址是0000的寄存器地址里,点一下“写入”,就会出现发送指....

  若同时按下两个以上的按钮,则对应的发光二极管发亮。例如按下SB1和SB3,则对应的输出端口P1.4和....

  时间片轮询法,在很多书籍中有提到,而且有很多时候都是与操作系统一起出现,也就是说很多时候是操作系统中....

  CPU,它的名字没有改,还是叫CPU(Central Processing Unit)。它是单片机的....

  各种逻辑芯片的晶振引脚可以等效为电容三点式振荡器。晶振引脚的内部通常是一个反相器,或者是奇数个反相器....

  单片机系统硬件抗干扰常用方法实践影响单片机系统可靠安全运行的主要因素主要来自系统内部和外部的各种电气....

  AD精度指的是AD实际转换的结果和理想的计算结果之间的误差,也叫做积分非线性误差,符号是(INL) ....

  1.1读状态:输入:RS = L,RW =H,E = H输出D0~D7 1.2写指令:输入:R....

  常用来保存单片机或其他处理器的目标程序代码。它保 存物理程序存储区中的目标代码映象。一般的编程器都支....

  本文主要介绍了晶振电路的电容的作用。晶振的负载电容是一个晶振的一个重要参数。负载就是晶振起振的电容,....

  单片机运用体系中,常有用单片机的IO口来完毕自关机(完全关机)的功用。通常用单片机的一个IO口操控一....

  AD精度指的是AD实际转换的结果和理想的计算结果之间的误差,也叫做积分非线性误差,符号是(INL) ....

  单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可....

  C 语言是一种结构化的高级语言。其优点是可读性好,移植容易,是普遍使 用的一种计算机语言。缺点是占用....

  虽然Java是物联网开发中使用最多的语言,但是Java和Python在物联网开发的不同子域中紧随其后....

  物联网时代的到来,不管是从行业应用,还是智能硬件的爆发,亦或是大数据等等嵌入式技术都得到了史无前例的....

  本系统由单片机STC89C54RD 控制,将被测电阻通过测量电路,将电阻的变化转变为电压和电流的变化....

  TMR1为16位宽,附带一个可编程的预分频器和一个可选的低频时基振荡器,适合与CPP模块配合使用来实....

  在单片机嵌入式的编程过程中程序的好坏往往是由细节决定的,一个程序写的是否详细、灵活,是与日积月累的知....

  随着单片机技术的不断发展,以单片机C语言为主流的高级语言也不断被更多的单片机爱好者和工程师所喜爱。使....

  8259A是一种中断控制芯片,在单片机系统中一般用来扩展单片机的中断,pc机中也有这个芯片,

  单片机系统里常用的8255芯片是一个典型的可编程通用并行接口芯片,用来扩展单片机的端口,它具有3个8....

  8253是在单片机系统常用的定时/计数器接口芯片,他能扩展几个定时/计数器,而不占用单片机的cpu时....

  max232是一种把电脑的串行口rs232信号电平(-10 ,+10v)转换为单片机所用到的TTL信....

  当你有了学习单片机的愿望,接下来的问题就是从何学起,如何学? 对于在校学生有老师指导,开始时的迷茫会....

  51系列单片机8031、8051及89c51/89s51均采用40Pin封装的双列直接DIP结构。上....

  我们可能听过C语言中的传值和传指针,在其他语言中,也有传引用一说,那么他们到底有什么区别呢?如果你还....

  如果你想学单片机,请在学习单片机之前,请做好如下准备工作: 一、硬件准备: 本人推荐给大家的学习....

  在使用单片机中,unsigned int 占2个字节,unsigned char 占一个字节。而单片....

  目前使用单片机微控制器作为核心的电子产品数不胜数,只要是能够给大家带来便利,或者乐趣,或者解决问题的....

  我认为单片机产品在现在和可预见的未来其市场潜力还是很巨大的,就以目前的情况看基本上所见到的家电产品都....

  一般计算机进行工作时,首先要通过外部设备把程序和数据通过输入接口电路和数据总线送入到存储器,然后逐条....