目录
原理
在开发板上,按键如果一端连接的是电源,那么按键会持续给单片机对应的接口输入一个高电平,就是输入1,这时候如果按下按键,那么该接口的电平会被拉低,就是输入的是一个0。
如果按键的一端连接的是地线的话,就和接电源的相反,就是一直输入0,按键按下输入1。
关于按键的一端接的什么,可以看自己的开发板的电路分布图。vcc就是电源,gnd就是地线。
通过按键可以让接口的输入产生变化,这样我们就可以利用这个变化去进行按键对单片机的其他部分(led灯之类的)的控制。
实现
按键检测
在主函数里面利用死循环让单片机一直对按键进行检测,如果按下按键就进行特定的功能实现,我这里使用的名为aj的函数就是检测按键函数(我英语不好,所有命名基本上都是拼音QAQ)
while(1)//利用死循环进行检测是否有按键按下
aj();
按键检测函数
通过编写按键检测函数从而在按键按下的时候达到特定功能
void aj(){
if(key_1!=1) //如果按键按下,那么按键连接的接口电压会被拉低
{
delay(5);//消抖
if(key_1!=1)//防止误触,如果是不小心按到了那么就不会触发
{
P1_1=~P1_1;//控制led灯亮灭
while(key_1!=1);//检查是否松开按键,如果没有松开则不会结束
}
}
}
关于消抖
当我们按下按键的时候不是一下子就按到底的,它会有一个按键按下的过程,这时候的电平是不稳定的,所有就需要进行消抖,让电平稳定。
消抖的话,我们可以通过一个延时,让单片机等一会,这样等单片机再检测电平的时候我们已经按到底了,这样就可以产生电平的突变。
检测松开
利用一个死循环,如果该按键没松开,那么对应的接口就一直保持低电平,这样就保证了按键按一次只有效一次,如果没有检测的话,就按一次按键就会有效很多次。
延时
因为需要进行消抖操作所以我们需要编写一个延时函数进行消抖。我们利用软件进行延时。
#define uchar unsigned char
void delay(uchar sj)
{
uchar x,y;
for(x=sj;x>0;x--)
{
for(y=255;y>0;y--)
{
}
}
}
主函数
将各个部分拼接起来就构成主函数了,也可以使用模块化编程。
#include <REGX52.H>
#define uchar unsigned char
sbit key_1=P3^2;//定义key_1的接口
void delay(uchar sj)
{
uchar x,y;
for(x=sj;x>0;x--)
{
for(y=255;y>0;y--)
{
}
}
}
void aj(){
if(key_1!=1) //如果按键按下,那么按键连接的接口电压会被拉低
{
delay(5);//消抖
if(key_1!=1)//防止误触,如果是不小心按到了那么就不会触发
{
P1_1=~P1_1;//控制led灯亮灭
while(key_1!=1);//检查是否松开按键,如果没有松开则不会结束
}
}
}
void main()
{
while(1)
{
aj();
}
}
尾声
关于按键的使用,对于后续对各种功能选择性实现时,需要经常使用到按键。