新手跟着原子的视频做的按键实验(mini版,就是按键控制LED灯的那个),做完之后发现有两个问题:
1、出现了一个警告,
2、把程序下进单片机后发现,第一次按下按键效果是对的,但是再一次按下按键就没反应了。我的程序是刚开始初始化为LED0、LED1都是熄灭,按下KEY0则LED0状态翻转,按下KEY1则KEY1状态翻转,按下WK_UP则LED0、LED1都翻转,但是下了程序之后按下按键发现第一次按下按键KEY0,LED0亮,此时现象正确,再按按键KEY0,LED0就没反应,还是亮,复位后,按下KEY1和WK_UP也是同样现象
(主函数),
(按键初始化和扫描)
希望大神讲解一下,谢谢
这函数里你改错了, 没有按键按下,不会有返回值
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1; //按键松开标志
if(mode) key_up=1; //支持连按
if(key_up&&(KEY1==0||KEY1==0||KEY2==0||WK_UP==0)) //有按键按下
{
delay_ms(10); //按键去抖
key_up=0;
if(KEY2==0) return 1;
else if(KEY1==0) return 2;
// else if(KEY0==0) return 3;
else if(WK_UP==0) return 4;
}else if(KEY1==1&&KEY1==1&&KEY2==1&&WK_UP==1) {
key_up=1;
return 0; //无按键按下
}
}
这样才对的,没有按键按下,会有返回值0
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1; //按键松开标志
if(mode) key_up=1; //支持连按
if(key_up&&(KEY1==0||KEY1==0||KEY2==0||WK_UP==0)) //有按键按下
{
delay_ms(10); //按键去抖
key_up=0;
if(KEY2==0) return 1;
else if(KEY1==0) return 2;
// else if(KEY0==0) return 3;
else if(WK_UP==0) return 4;
}else if(KEY1==1&&KEY1==1&&KEY2==1&&WK_UP==1)key_up=1;
return 0; //无按键按下
}
这函数里你改错了, 没有按键按下,不会有返回值
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1; //按键松开标志
if(mode) key_up=1; //支持连按
if(key_up&&(KEY1==0||KEY1==0||KEY2==0||WK_UP==0)) //有按键按下
{
delay_ms(10); //按键去抖
key_up=0;
if(KEY2==0) return 1;
else if(KEY1==0) return 2;
// else if(KEY0==0) return 3;
else if(WK_UP==0) return 4;
}else if(KEY1==1&&KEY1==1&&KEY2==1&&WK_UP==1) {
key_up=1;
return 0; //无按键按下
}
}
这样才对的,没有按键按下,会有返回值0
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1; //按键松开标志
if(mode) key_up=1; //支持连按
if(key_up&&(KEY1==0||KEY1==0||KEY2==0||WK_UP==0)) //有按键按下
{
delay_ms(10); //按键去抖
key_up=0;
if(KEY2==0) return 1;
else if(KEY1==0) return 2;
// else if(KEY0==0) return 3;
else if(WK_UP==0) return 4;
}else if(KEY1==1&&KEY1==1&&KEY2==1&&WK_UP==1)key_up=1;
return 0; //无按键按下
}
你好,我发现是我的按键扫描的最后,判断按键没有按下时我给他写到按键按下的if语句里面去了,但是我写了下面写还是不行
u8 KEY_Scan(u8 mode)
{
static u8 key_up = 1;//°′¼üû°′ê±key_upÎa1
if(mode)key_up=1; //Ö§3Öᬰ′
if(key_up && (KEY0 == 0 || KEY1 == 0 || WK_UP == 1)) //ÅD¶Ï°′¼üêÇ·ñ°′ÏÂ
{
delay_ms(10);
key_up = 0;//°′¼ü°′ÏÂê±Îa0
if (KEY0 == 0)
{
return KEY0_PRE;
}
else if(KEY1 == 0)
{
return KEY1_PRE;
}
else if(WK_UP == 1)
{
return WK_UP_PRE;
}
}
else if (KEY0 == 1 && KEY1 == 1 && WK_UP == 0)
{
key_up = 1;
return 0;
}
}
但是换成这种写法就可以
u8 KEY_Scan(u8 mode)
{
static u8 key_up = 1;//°′¼üû°′ê±key_upÎa1
if(mode)key_up=1; //Ö§3Öᬰ′
if(key_up && (KEY0 == 0 || KEY1 == 0 || WK_UP == 1)) //ÅD¶Ï°′¼üêÇ·ñ°′ÏÂ
{
delay_ms(10);
key_up = 0;//°′¼ü°′ÏÂê±Îa0
if (KEY0 == 0)
{
return KEY0_PRE;
}
else if(KEY1 == 0)
{
return KEY1_PRE;
}
else if(WK_UP == 1)
{
return WK_UP_PRE;
}
}else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;
return 0;
,这两个有什么区别呢,麻烦讲解一下,谢谢
一周热门 更多>