一、按键的形式
按键的状态只有按下和按下两种,而刚好电平也只有高电平和低电平两种。
所以对应的GPIO口的状态也有两种
一种是未按下为高电平,按下为低电平(需要将IO设置为上拉输入)
|
|
一种是未按下为低电平,按下为高电平(需要将IO设置为下拉输入)
|
|
二、分析代码对应的实际效果
int main(void)
{
LED_Init(); //LED端口初始化
KEY_Init(); //初始化与按键连接的硬件接口
LED0=1; //LED熄灭
while(1)
{
if(KEY0==0) //按键按下
{
delay_ms(10);//消抖
if(KEY0==0) //按键按下
LED0=0;//LED点亮
}
}
}
上面代码实现的效果是,开机LED0熄灭,KEY0按下,则LED0点亮。代码结束,那么KEY0松开之后,对不起,代码没写,所以KEY0松开之后LED0还是点亮的。
于是有了升级版,增加一个松开的判断语句
int main(void)
{
LED_Init(); //LED端口初始化
KEY_Init(); //初始化与按键连接的硬件接口
LED0=1; //LED熄灭
while(1)
{
if(KEY0==0) //按键按下
{
delay_ms(10);//消抖
if(KEY0==0) //按键按下
LED0=0;//LED点亮
}
else
{
LED0=1;//LED熄灭
}
}
}
上面代码实现的效果是,开机LED0熄灭,KEY0按下,则LED0点亮。当KEY0松开之后,LED0熄灭。看上去好像没问题,但实际使用起来就会发现不协调的地方,如果我想让LED0常亮,我岂不是要用手一直按着,这也太反人类了吧。
好吧,再升级一下。
int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //LED端口初始化
KEY_Init(); //初始化与按键连接的硬件接口
LED0=1;
while(1)
{
if(KEY0==0) //按键按下
{
delay_ms(10);//消抖
if(KEY0==0) //按键按下
LED0=~LED0;//电平翻转
while(KEY0==0);//按键按下,则一直进入死循环;除非松开
}
}
}
上面代码实现的效果是,
开机LED0熄灭,
KEY0按下,则LED0点亮。
当KEY0保持按下状态,LED0处于点亮状态;
当KEY0松开之后,LED0处于点亮状态;
当KEY0按下,则LED0熄灭;
当KEY0保持按下状态,LED0处于熄灭状态;
当KEY0松开之后,LED0处于熄灭状态;
KEY0按下则LED0点亮,重复上述状态……
然后将while(KEY0==0);
位置提前,代码改为
int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //LED端口初始化
KEY_Init(); //初始化与按键连接的硬件接口
LED0=1;
while(1)
{
if(KEY0==0) //按键按下
{
delay_ms(10);//消抖
if(KEY0==0) //按键按下
while(KEY0==0);//按键按下,则一直进入死循环;除非松开
LED0=~LED0;//电平翻转
}
}
}
开机LED0熄灭,
KEY0按下,则LED0熄灭。
当KEY0保持按下状态,LED0处于熄灭状态;
当KEY0松开之后,LED0处于点亮状态;
当KEY0按下,则LED0处于点亮状态;
当KEY0保持按下状态,LED0处于点亮状态;
当KEY0松开之后,LED0处于熄灭状态;
KEY0按下则LED0熄灭,重复上述状态……
上面两个程序的区别为,一个为先执行动作,再进入死循环;一个为先进入死循环,再执行动作。
通过下面的的按键松开标志位也可以实现上面的效果,按键的瞬间进行led翻转
int main(void)
{
int a=1;//按键松开标志位,0是按键按下,1是按键松开
delay_init(); //延时函数初始化
LED_Init(); //LED端口初始化
KEY_Init(); //初始化与按键连接的硬件接口
LED0=1;
while(1)
{
if(KEY0==0) //按键按下
{
delay_ms(10);//消抖
if(KEY0==0&&a==1) //按键按下瞬间
LED0=~LED0;
a=0;
}
else
{a=1;}
}
}
刚开机, KEY0=1,a=1,LED处于熄灭状态
按键按下,KEY0=0, a=1,LED翻转,即LED点亮
按键保持按下状态,KEY0=0 a=0,无动作,LED处于点亮状态
按键松开,KEY0=1 a=1,无动作,LED处于点亮状态
按键按下,KEY0=0 a=1 LED翻转,即LED熄灭
按键保持按下状态,KEY0=0 a=0,无动作,LED处于熄灭状态
按键松开,KEY0=1 a=1,无动作,LED处于熄灭状态
按键按下,KEY0=0, a=1,LED翻转,即LED点亮
按键保持按下状态,KEY0=0 a=0,无动作,LED处于点亮状态
按键松开,KEY0=1 a=1,无动作,LED处于点亮状态
…………………………