标题:
请问单片机怎么用延时做按键长按延时?
[打印本页]
作者:
新手青岛小胡
时间:
2019-11-21 22:35
标题:
请问单片机怎么用延时做按键长按延时?
大神们你们好,本人单片机新手,在做万年历的时候为了节省一个按键,想把加的那个按键,做成功能是:单次按下只加一次,长按开始快速递增,但是只能做出来前半部分功能,关于这个功能的代码如下:
if(i==333)
{ if(KEY2==1)
{
i=0;
}
goto j;
}
else
{
while(!KEY2)
{
delay(5);
i++; }
}
j :{;}
求解答,问题比较白痴,希望不要笑话哈哈,感谢大家
作者:
pcbboy
时间:
2019-11-22 08:06
检测时给个时间比如超过300mS算长按,小于300算短按。操作时再调整.
作者:
笨笨兔
时间:
2019-11-22 08:33
按键是怎么扫描,怎么消小抖的呢?
如果是用定时器方式,很好办的;确认按键位置后,时间长短根据进中断次数即可区分长按键和短按键。
作者:
zhy111
时间:
2019-11-22 09:05
用状态机进行扫描
作者:
moluxiyan
时间:
2019-11-22 09:11
你这按键问题比较大呀
作者:
黄youhui
时间:
2019-11-22 09:12
if(i== 300)然 厚if(KEY2 ==1)i=0
else whlle(!KEY2){ i++}
你的定义的变量 i 是什么?是按键时间还是计数器
作者:
wulin
时间:
2019-11-22 10:31
给你一个长、短按键示例参考。
#include <REG51.H>
#define uint unsigned int //宏定义数据类型uint
#define uchar unsigned char //宏定义数据类型uchar
#define key_S 500 //宏定义短按(约20ms)
#define key_L 16000 //宏定义长按(约2/3s)
#define key_M 11000 //宏定义长按间隔(约1/3s)
sbit key1=P3^6; //加键
sbit key2=P3^7; //减键
uchar num=1;
void keyscan() //按键扫描
{
static uint count1=0,count2=0; //计数变量
if(!key1)
{
count1++;
if(count1>=key_L) //长按
{
if(num<255)
num++;
count1=key_M;
}
}
else //按键抬起
{
if(count1>key_S && count1<key_L)//短按
{
if(num<255)
num++;
}
count1=0; //count清0
}
if(!key2)
{
count2++;
if(count2>=key_L) //长按
{
if(num>0)
num--;
count2=key_M;
}
}
else //按键抬起
{
if(count2>key_S && count2<key_L)//短按
{
if(num>0)
num--;
}
count2=0; //count清0
}
}
void main()
{
while(1) //12MHz晶振主循环周期33~41us
{
keyscan(); //按键扫描
P1=~num; //LED低电平显示
}
}
复制代码
作者:
yzwzfyz
时间:
2019-11-23 10:59
1、别人的按键动作,你是无法延时的,因为你不能控制别人的手。
2、按键后是否响应却是你可以控制的。
3、检测到按键后,你就起动一个定时器,定时器动作后,你再响应按键的“动作需求”,这就OK了。当然你还要考虑中途取消等等问题,这是你需要做的。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1