標(biāo)題:
單片機(jī)狀態(tài)機(jī)方式按鍵處理程序,可實(shí)現(xiàn)長(zhǎng)按,無(wú)法實(shí)現(xiàn)短按
[打印本頁(yè)]
作者:
Tobby
時(shí)間:
2022-7-12 17:07
標(biāo)題:
單片機(jī)狀態(tài)機(jī)方式按鍵處理程序,可實(shí)現(xiàn)長(zhǎng)按,無(wú)法實(shí)現(xiàn)短按
/******************************************************************************************/
//函數(shù):Key_add
//功能:狀態(tài)機(jī)方式
//輸出參數(shù):
//輸入?yún)?shù):
/****************************************************************************************/
u16 key_AddCnt;
u8 Key_add(void)
{
static u8 key_state=0;
u8 key_return=0;
switch(key_state)
{
case Key_state_0:
{
if(KEY_UP==0)
{
key_state=Key_state_1;
}
key_AddCnt=0;
}break;
case Key_state_1:
{
if(KEY_UP==0)
{
key_state=Key_state_2;
}
else
{
key_state=Key_state_0;
}
}break;
case Key_state_2:
{
key_AddCnt++;
if(KEY_UP)//按鍵松開(kāi)
{
key_state=Key_state_0;
if(key_AddCnt<=key_short_time)//按鍵時(shí)間小于短按時(shí)間30ms
{
// key_AddCnt=0;
key_return=Key_upPress;
}
}
else
{
if(key_AddCnt>=key_long_time)
{
key_AddCnt=0;
key_return=Key_uplongprss;
key_state=Key_state_3;
}
}
}break;
case Key_state_3:
{
if(KEY_UP)//按鍵松開(kāi)
{
key_state=Key_state_0;
}
}
}
return key_return;
}
作者:
lkc8210
時(shí)間:
2022-7-12 22:05
Key_add()在哪里運(yùn)行?
key_short_time的值是多少?
key_long_time的值是多少?
作者:
Tobby
時(shí)間:
2022-7-26 09:43
lkc8210 發(fā)表于 2022-7-12 22:05
Key_add()在哪里運(yùn)行?
key_short_time的值是多少?
key_long_time的值是多少?
放在定時(shí)器中運(yùn)行,10ms運(yùn)行一次,問(wèn)題已解決,是key_short_time設(shè)置時(shí)間過(guò)短,設(shè)置是3,也就是30ms短按時(shí)間,數(shù)值改為20,也是就200ms,問(wèn)題解決,感謝
作者:
bbxyliyang
時(shí)間:
2022-7-26 22:37
// 按鍵
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
#define key_state_3 3
#define key_no 0
#define key_click 1
#define key_double 2
#define key_long 3
sbit KEY = P0^4;
sbit key1=P5^0;// 紅光
sbit key2=P3^0;//綠光開(kāi)關(guān)
sbit key3=P0^2; //藍(lán)
sbit key4=P4^0; //白
sbit key5=P0^3; //加濕度
sbit key6=P5^2;//自動(dòng)
static unsigned char key_read(void)
{
static unsigned char key_state_buffer1 = key_state_0;
static unsigned char key_timer_cnt1 = 0;
static unsigned char temp=0;
unsigned char key_return = key_no;
// unsigned char key;
//key = KEY; //read the I/O states
switch(key_state_buffer1)
{
case key_state_0:
if((KEY == 0)||(key1 == 0)||(key2==0)||(key3==0)||(key4==0)||(key5==0)||(key6==0))
{ key_state_buffer1 = key_state_1; temp=0;
return 0;
}
//按鍵被按下,狀態(tài)轉(zhuǎn)換到按鍵消抖和確認(rèn)狀態(tài)//
break;
case key_state_1:
if(KEY== 0)
{
temp=1;
key_timer_cnt1 = 0;
key_state_buffer1 = key_state_2;
//按鍵仍然處于按下?tīng)顟B(tài)
//消抖完成,key_timer開(kāi)始準(zhǔn)備計(jì)時(shí)
//狀態(tài)切換到按下時(shí)間計(jì)時(shí)狀態(tài)
}
else if(key1==0)
{
temp=2;
// key_timer_cnt1 = 0;
key_state_buffer1 = key_state_2;
}
else if(key2==0)
{
temp=4;
// key_timer_cnt1 = 0;
key_state_buffer1 = key_state_2;
}
else if(key3==0)
{
temp=5;
// key_timer_cnt1 = 0;
key_state_buffer1 = key_state_2;
}
else if(key4==0)
{
temp=6;
// key_timer_cnt1 = 0;
key_state_buffer1 = key_state_2;
}
else if(key5==0)
{
temp=7;
// key_timer_cnt1 = 0;
key_state_buffer1 = key_state_2;
}
else if(key6==0)
{
temp=8;
// key_timer_cnt1 = 0;
key_state_buffer1 = key_state_2;
}
else
{
key_state_buffer1 = key_state_0; temp=0;
}
//按鍵已經(jīng)抬起,回到按鍵初始狀態(tài)
break; //完成軟件消抖
case key_state_2:
if((KEY == 0)||(key1 == 0)||(key2==0)||(key3==0)||(key4==0)||(key5==0)||(key6==0))
{
key_state_buffer1 = key_state_2;
if(temp==1)
{
if(++key_timer_cnt1 >= 100) //按鍵繼續(xù)按下,計(jì)時(shí)超過(guò)1000ms
{
key_return = key_long; //送回長(zhǎng)按事件
key_state_buffer1 = key_state_3; //轉(zhuǎn)換到等待按鍵釋放狀態(tài)
}
}
}
else
{
key_return = temp; //按鍵抬起,產(chǎn)生一次click操作
key_state_buffer1 = key_state_0; //轉(zhuǎn)換到按鍵初始狀態(tài)
}
/* if(KEY == 1)
{
key_return = key_click; //按鍵抬起,產(chǎn)生一次click操作
key_state_buffer1 = key_state_0; //轉(zhuǎn)換到按鍵初始狀態(tài)
}
else if(++key_timer_cnt1 >= 100) //按鍵繼續(xù)按下,計(jì)時(shí)超過(guò)1000ms
{
key_return = key_long; //送回長(zhǎng)按事件
key_state_buffer1 = key_state_3; //轉(zhuǎn)換到等待按鍵釋放狀態(tài)
} */
break;
case key_state_3: //等待按鍵釋放
if((KEY == 0)||(key1 == 0)||(key2==0)||(key3==0)||(key4==0)||(key5==0)||(key6==0)) //按鍵釋放
key_state_buffer1 = key_state_3; //切回按鍵初始狀態(tài)
else //按鍵釋放
key_state_buffer1 = key_state_0; //切回按鍵初始狀態(tài)
break;
}
return key_return;
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1