前面回忆了按键输出的相关内容,现在可以继续弄按键输入的内容,本节来弄一个独立按键的相关内容来回忆按键输入的相关内容,通过一个独立的按键的判断来使一个led灯亮灭。
1.关于按键
键盘分为编码键盘和非编码键盘,键盘上编码键的识别由专用的硬件编码器实现,并产生编码号或键值的称为编码键盘,如计算机键盘。而靠软件编程来识别的键盘称为非编码键盘。非编码键盘又分为独立键盘和行列式键盘。单片机上的键盘一般都是非编码键盘,而这节我主要说的就是独立键盘。
2.硬件
关于案件的检测其实也比较简单,我们这个按键的检测原理非常简单,我们首先通过gpio口与按键相连和地相连,如下图所示:
我们的gpio作为输入的时候默认是高电平,这个时候我们同时检测四个按键的状态,如果gpio检测到低电平,那么这个按键就是被按下。但是在实际应用中我们按下的时候,他并不是立刻从高电平转化为低电平,而是有一段时间的抖动,就是一段时间的高低电平,我们可以通过硬件消抖和软件消抖两种方式来完成消抖工作,但是硬件消抖一般使用硬件电路进行消抖,这个是比较复杂而且成本比较高的,所以我们基本都是选择软件消抖的方式,如果一个按键已经被按下,我们延时大概10ms左右,再次去检测,如果还是低电平,就证明按键被按下了。
3. 软件
按下按键之后就让对应的led灯亮主要程序如下:
#include "key.h"
void delay(int xms){
int i,j;
for(i = 0;i < xms;i++){
for(j = 0;j < 100;j++);
}
}
int key_scan(){
if(k0==0){
delay(10);
if(k0==0){
led0 = !led0;
}
while(!k0);
}
else if(k1==0){
delay(10);
if(k1==0){
led1 = !led1;
}
while(!k1);
}
else if(k2==0){
delay(10);
if(k2==0){
led2 = !led2;
}
while(!k2);
}
if(k3==0){
delay(10);
if(k3==0){
led3 = ~led3;
}
while(!k3);
}
else {
}
return 0;
}
关于其中的原理前面已经说的比较清楚了,顺便也把调用函数和头文件一起放上,头文件代码如下:
#ifndef _KEY_H_
#define _KEY_H_
#include "reg52.h"
sbit k1 = P3^1;
sbit k0 = P3^0;
sbit k2 = P3^2;
sbit k3 = P3^3;
sbit led0 = P2^0;
sbit led1 = P2^1;
sbit led2 = P2^2;
sbit led3 = P2^3;
int key_scan();
void delay();
#endif
主函数调用函数如下:
#include "reg52.h"
#include "key.h"
void main(){
while(1){
key_scan();
}
}
到此,我们的独立按键就算是完成了