標(biāo)題:
把一個(gè)按鍵設(shè)置為長按和短按執(zhí)行不同的功能單片機(jī)程序 求助
[打印本頁]
作者:
空著
時(shí)間:
2018-9-4 16:12
標(biāo)題:
把一個(gè)按鍵設(shè)置為長按和短按執(zhí)行不同的功能單片機(jī)程序 求助
求助下,我想把一個(gè)按鍵設(shè)置為長按和短按執(zhí)行不同的程序
按鍵.png
(26.34 KB, 下載次數(shù): 46)
下載附件
2018-9-4 16:11 上傳
我想把按鍵設(shè)置成長按和短按具體要怎么改
作者:
空著
時(shí)間:
2018-9-4 16:13
由沒有誰幫忙指導(dǎo)下,用狀態(tài)機(jī)會不會比較方便
作者:
xshx
時(shí)間:
2018-9-4 17:10
延時(shí)太長,用定時(shí)器吧,計(jì)數(shù)。
作者:
wulin
時(shí)間:
2018-9-4 17:24
看我給壇友的回復(fù)
http://www.torrancerestoration.com/bbs/dpj-133502-1.html
作者:
HC6800-ES-V2.0
時(shí)間:
2018-9-5 08:13
這是我的一個(gè)程序:四鍵八功能,即一鍵雙功能的按鍵程序。
你可以參考一下:
if (Agoto==1)
{
n=0;
while(Agoto)
{
n++;
Delay10ms(1);
if (n>200)
{
break;
}
}
if (n>30)
{
PWMD();
}
else
{
PU();
}
}
作者:
woshige
時(shí)間:
2018-9-5 09:27
狀態(tài)機(jī)親測好用
作者:
GdSzYi123
時(shí)間:
2018-9-5 10:21
建議使用switch語句,雖然占用空間,但是邏輯會很清晰
作者:
GdSzYi123
時(shí)間:
2018-9-5 10:23
建議使用switch,這樣邏輯很清晰
作者:
人中狼
時(shí)間:
2018-9-5 10:48
用定時(shí)器判斷按鍵時(shí)間的長短,如果用延時(shí)的方法的話,只能用短延時(shí),并且不停的檢測按鍵是否釋放,同時(shí)記錄短延時(shí)的次數(shù),通過計(jì)算短延時(shí)的次數(shù)來區(qū)分短按鍵和長按鍵
作者:
ft3939574
時(shí)間:
2018-9-5 15:25
用狀態(tài)機(jī)寫比較方便,而且不會阻塞CPU/***************************************************************************
* 名 稱:Key_ScanIO();
* 功 能:掃描IO口并判斷按鍵事件(前臺程序)
* 入口參數(shù):無
* 出口參數(shù):無,鍵值壓入緩沖隊(duì)列
* 說 明:該函數(shù)需要每隔1/16~1/128S調(diào)用一次。最好放在定時(shí)中斷中執(zhí)行
***************************************************************************/
void Key_ScanIO()
{
P_KEY1=N_KEY1; //將當(dāng)前KEY1狀態(tài)保存到前一次狀態(tài)變量中
N_KEY1=KEY1_IN; //將KEY1狀態(tài)保存到當(dāng)前變量中
P_KEY2=N_KEY2;
N_KEY2=KEY2_IN;
P_KEY3=N_KEY3;
N_KEY3=KEY3_IN;
if((P_KEY1!=0)&&(N_KEY1==0)) KEY1_State=PUSH_KEY; //如果兩次狀態(tài)不一樣,說明K1被按下了
if((P_KEY2!=0)&&(N_KEY2==0)) Key_InBuff(0x02);
if((P_KEY3!=0)&&(N_KEY3==0)) Key_InBuff(0x04);
}
/***************************************************************************
* 名 稱:Key1_Judge();
* 功 能:判斷KEY1 長按、短按
* 入口參數(shù):無
* 出口參數(shù):無,鍵值壓入緩沖隊(duì)列
* 說 明:該函數(shù)需要每隔1/16~1/128S調(diào)用一次。最好放在定時(shí)中斷中執(zhí)行
***************************************************************************/
void Key1_Judge()
{
if(KEY1_State==PUSH_KEY) Key1TimeS++;
else Key1TimeS=0;
switch(KEY1_State)
{
case NOKEY:
{
if(KEY1_IN==0) KEY1_State=PUSH_KEY;
break;
}
case PUSH_KEY:
{
if(KEY1_IN!=0)
{
Key_InBuff(0x01);
KEY1_State=NOKEY;
}
else if(Key1TimeS>32*2)
{
Key_InBuff(LONG_KEY1);
KEY1_State=LONG_PUSH;
}
}
case LONG_PUSH:
{
if(KEY1_IN!=0)
{
KEY1_State=NOKEY;
Key1TimeS=0;
}
break;
}
}
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1