本小节目录:
5.1,键盘的分类
5.2,键盘消抖问题
5.3,按键连接单片机原理图
5,4,独立和矩阵按键的程序
键盘是单片机系统中常见的信息输入部件,也是人机对话中不可缺少的输入设备,同时键盘有编码键盘和非编码键盘之分。
编码键盘:键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值,如计算机键盘;
非编码键盘:靠软件编程来识的键盘,如单片机上的按键,就是非编码键盘。
按键是一种机械弹性器件,在按下或者松开按键的瞬间,都会有抖动现象。例如一个胖子,突然坐在一张有弹性的椅子,会有抖动现象一样咯,嘿嘿,,,,,,比喻不是很合适,但是多少可以理解和感觉按键抖动的现象了吧!
图1 按键按下电压变化图(左)和硬件消抖示意图(图)
消抖方法有:硬件消抖和软件消抖。
1、硬件消抖:在键数较少时可采用硬件方法消抖,如图1右图所示,用RS触发器来消抖。图中两个“与非”门构成一个RS触发器,当按键未按下时,输出1;反之,输出为0。
具体过程,有兴趣的读者可以去探究吧!
2、软件消抖:如果按键较多,常用软件方法来消抖,即检测到有按键按下时,执行一段延时程序,具体延时时间依机械性能而定,一般延时为:5MS ~ 20MS,即按键抖动的这段时间不进行检测,等到按键稳定时再读取状态,若仍然为闭合状态电平,则有按键按下。而平时所用的单片机开发实验板,绝大多数为软件消抖即可很容易解决抖动的问题。
图 2 独立按键原理图(左)和矩阵按键原理图(右)
a)独立按键原理图分析:
4个独立按键WR,RS,SCL,SDA分别连接单片机的WR,RS,SCL,SDA口,即P3^4--P3^7口,按键公共端连接GND,
从原理图中很容易看出,只需单片机检测按键是否有低电平,则证明那个按键是否按下。
优缺点:程序编写较简单,但是占用I/O口多。
b)矩阵按键原理图分析:
按键的行一脚共同连接,列另一脚也共同连接,然后分别连接单片机8个I/O口,从而达到用8个端口控制16个按键;
从原理图也很容易看出,若想知道其中哪个按键按下,则要单片机检测按键的两端连接的两个I/O口电平是否都为低电平,比如,若是S2按键按下,则RXD为“0”,RS也必须为“0”,S2按键才是按下了。再例如,若TXD为“0”,SCL也为“0”,则证明S7按键按下了。同理可检测别的按键是否按下。
优缺点:程序编写较复杂,但是占用I/O口少。
关于单片机I/O口资源往往比较宝贵,当使用按键较多的时候,就必须引入矩阵按键!
当然,或许对于初学者来说,矩阵按键这里并不是很好理解,当初本人也是纠结了很久,但是多去看看程序,多分析分析,看看如何检测按键的,或许会理解的更快吧!
独立按键程序:
按下K1按键LED亮,按下K2按键,LED灭。
#include
#define Uint16 unsigned int
sbit Led = P2^7;
sbit K1 = P3^4;
sbit K2 = P3^5;
void Delayms(Uint16 Xms)
{
Uint16 i, j;
for(i=Xms; i>0; i--)
for(j=121; j>0; j--);
}
void main(void)
{
while(1)
{
if(K1==0) // 检测按键,若K1为0则按键按下
{
Delayms(10); //延时10ms去抖
if(K1==0) // 再次检测按键
{ Led = 0}; // Led 亮}
if(K2==0) // 同上
{
Delayms(10);
if(K2==0)
{ Led = 1; }
}
}
}
说实话,像独立按键这么简单的程序若还有初学者看不懂,那直接无语了,对吧?
矩阵按键程序:
由于程序太长,为了更好编辑,本人已将程序上传,菜鸟可以下载看看,同时在程序下方已经写下几点程序总结以及个人感受,当然,非菜鸟就不必看了吧!
说明:所用开发板为:麦光电子单片机开发板
本系列《MCU之心路分享》博文,本人将尽自己所能,以菜鸟的身份,写下初学者最详细,最具体的入门博客,同时分享DIY的乐趣,如有误之处,欢迎拍砖,本人也很乐意接受各位大神的批评和指点,在此谢谢啦!
于2013年11月14日 夜
644398774_263592779 2014-4-7 21:17
用户567054 2014-4-4 16:13
用户425366 2013-11-25 21:41
DiracFatCat 2013-11-24 15:44
644398774_263592779 2013-11-24 15:14
DiracFatCat 2013-11-23 14:18
644398774_263592779 2013-11-23 00:09
用户1616399 2013-11-21 01:23