写的一个按键长短按的程序,但却实现不了,大家帮我看下
这样写有问题吗?我实在不知道哪的问题,就是运行不了sbit KEY_SET = P1^3;
sbit KEY_UP = P1^2;
sbit KEY_DOWN = P1^0;
/*********************************************
;文件名:keyscan();
;功能:按键扫描函数
;输入:无
;输出:;调用:无
;*********************************************/
uchar keyscan(void)
{
if(KEY_SET==0||KEY_UP==0||KEY_DOWN==0) //有任一键按下,进入按键检测
{
keystar=1; //进入计时器,开始计时
if((KEY_SET==0)&&keytemp>=20) set_down=1;//设置键按下20ms
if((KEY_UP==0)&&keytemp>=20) up_down=1;
if((KEY_DOWN==0)&&keytemp>=20) down_down=1;
if((KEY_SET==0)&&keytemp>=2000) //2S 设置键被长按
{
set_down=0;
set_down_long=1;
}
if((KEY_UP==0)&&keytemp>=2000)
{
up_down=0;
up_down_long=1;
}
if((KEY_SET==0)&&keytemp>=2000) //2S
{
down_down=0;
down_down_long=1;
}
}
else //松手等待按键抬起
{
if((KEY_SET==1)&&(set_down==1))
{
set_down=0;
set_shot_flag=1; //一个完整的按键操作完成
}
if((KEY_SET==1)&&(set_down_long==1))
{
set_down_long=0;
set_long_flag=1; //一个完整的长按键操作完成
}
if((KEY_UP==1)&&(up_down==1))
{
up_down=0;
up_shot_flag=1;
}
if((KEY_UP==1)&&(up_down_long==1))
{
up_down_long=0;
up_long_flag=1;
}
if((KEY_DOWN==1)&&(down_down==1))
{
down_down=0;
down_shot_flag=1;
}
if((KEY_DOWN==1)&&(down_down_long==1))
{
down_down_long=0;
down_long_flag=1;
}
keystar=0;
}
//return key_flag;
}
定时时器10sm扫一次
if (keystar)
{
keytemp++;
if (keytemp>=30000) keytemp=30000; //3S
}
else
{
keytemp=0;
} 你写的这个程序,有很多看不明白的地方,比如:
定时时器10sm扫一次
if (keystar)
{
keytemp++;
if (keytemp>=30000) keytemp=30000; //3S
}
else
{
keytemp=0;
}
可以把全部的程序发上来看看才能了解你所写的是什么????? 长短按的程序的检测原理 不就是按的时间 长点和 短点
m=100
for(n=0;m<n;n++)
{
if(key==0)
{
m++
de(10)//10ms
}
}
if(m>102)
{
if(m>700)//按的时间大于2秒
{
长按处理
}
e~~~~~
{
知按处理
}
} 小声说一句,不会是keytemp变量设置成char了吧 对了,刚刚看到一个问题,好像第一楼的写法,程序怎么都会先进入短按键的处理子程序,应该判断,在满足短按键处理条件的时候,增加两个条件就是 1 那个时候按键已经被松开了 2 按键时长小于某个值比如200ms,否则就应该继续等待.建议楼主贴出全部代码,否则真的不好判断 唉,不用状态机了,用其它方法做好了。 上面程序没错,可以实现长按,短按
呵,我大意了,调完后忘清标志位了 顶一个,最近在研究这个 楼主能把你的程序完整的贴出来吗?让大家学习一下嘛 我也写过这个代码,主要是用定时器中断检测一下按键是否还按下,其实很简单的。2楼用延时的方法会影响其他中断的响应。 我也在学习这个 没回复成功? MARK 最近也在学习这个呢!!思路很有用的。谢谢了。 uchar keyscan(void)
{
if(KEY_SET==0||KEY_UP==0||KEY_DOWN==0) //有任一键按下,进入按键检测
你這段程式碼,你這樣寫當三個條件要滿足,才會當成有按鍵被按
這段就有問題了,請修改參考如下
if(KEY_SET==0)
{ //這理放你要執行動作 }
else
if(KEY_UP==0)
{ //這理放你要執行動作 }
else
if(KEY_DOWN==0)
{ //這理放你要執行動作 }
else
{ //這理放你要執行動作
}
}
学习了
…………………………………………………………………………………… 我测试了下你的代码 能实现长按 但不能实现短按
页:
[1]