标题:
51单片机实现不同按键不同功能源程序 按键延迟
[打印本页]
作者:
xuehai0405
时间:
2019-6-18 11:35
标题:
51单片机实现不同按键不同功能源程序 按键延迟
家里的壁挂管线机的一个程序,有2个抽水泵,一个是水位计控制水箱水泵,水位计是SW,有水位1,无水0。另外一个泵就是排水水泵,按键按下之后排水开始,然后延时关闭。加热也是一样,按下加热,延时关闭。现在的问题是,水位计自动上下水的程序写了之后,按键就会有点延迟,必须要长按才能有反应,这个是与水位计有水位长期触发按键有关。还有就是,按键1按下后,马上再按按键2,是没有反应的,必须要按键1的程序执行完之后再按按键2才有反应。
想知道怎么样才能让按键水位各不干扰,按下执行程序再按别的按键能同时执行别的程序。
单片机源程序如下:
void main()
{
while(1)
{
if(sw==0) //sw水位开关 无水位1秒后抽水
{
delay(1000);
if(sw==0)
{
sb1=1; //泵1运行
}
}
if(sw==1) //有水位1秒后关泵
{
delay(1000);
if(sw==1)
{
sb1=0; //泵1停止
}
}
if(aj1==0) //按键1
{
delay(10);
if(aj1==0)
{
while(!aj1);//等待按键释放
sb2=1; //泵2运行
delay(5000);
sb2=0; //泵2停止
}
}
if(aj2==0) //按键2
{
delay(10);
if(aj2==0)
{
while(!aj2);//等待按键释放
jr=1; //加热运行
delay(15000);
jr=0; //加热停止
}
}
}
}
复制代码
作者:
bhjyqjs
时间:
2019-6-25 08:58
在定时器中断中检测按键,再置位相应标志,再在主程序中执行相应动作即可。
万不可在程序中出现类似delay(1000); 之类的东西!
作者:
egypt
时间:
2019-6-25 10:18
多浪费个变量做按住的计时,main 循环中要加 delay_ms 以划分时间片
按住计时大致写法是:( 假设 按住时 key=0 ,松手时 key=1 。 key_count 是 s8 类型,初值为 0)
有了 key_count 就可以玩不少花样,比方说去抖、判断按下瞬间、判断松开瞬间。而且 main 程序逻辑并未阻塞,只是靠 count 做计数,下述代码对并发性事务毫无阻塞。
if( key==0)
{ if(key_count==0) do_press_key(); if(key_count<100) key_count++; }
else
{ if(key_count>0) do_release_key(); key_count=0; }
(补充:例如去抖需要8毫秒,并且 main 循环每 ms 呼叫上述代码,就需要修改为下述形式
if( key==0)
{ if(key_count==8) do_press_key(); if(key_count<100) key_count++; }
else
{ if(key_count>8) do_release_key(); key_count=0; }
)
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1