欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
狀態機思想在單片機中的應用 附程序和大量資料
[打印本頁]
作者:
saiyqx
時間:
2017-2-28 10:54
標題:
狀態機思想在單片機中的應用 附程序和大量資料
FSM,有限狀態機。在一個高效的程序中,一般都能看到狀態機的身影。最近自己在試著將自己寫的程序用狀態機的思想重新整一遍,找了一些資料,分享下。如有侵權,望告知,馬上刪除。。
0.png
(77.1 KB, 下載次數: 78)
下載附件
2017-2-28 15:51 上傳
單片機狀態機的全部資料下載:
狀態機.rar
(12.5 MB, 下載次數: 135)
2017-2-28 10:54 上傳
點擊文件名下載附件
狀態機的一些資料
下載積分: 黑幣 -5
我自己參考別人更改的狀態機按鍵掃描程序:
enum FSM_key_status
{
_Idle = 0,
_Key1_Down,
_Key1_Press,
_Key1_Up,
_Key2_Down,
_Key2_Press,
_Key2_Up,
};
uchar event_key_scan(void)
{
static volatile uchar key_status = 0; //按鍵狀態累計
static volatile uchar key_restate = 0; //按鍵狀態累計
static volatile uint key_count = 0; //按鍵保持時間累計
volatile uchar key_return = 0; //按鍵返回值
static uchar key_type=0;
uchar num = 0;
uchar new_key=0;
new_key = _pa & 0x06;
// num = Judge_key(new_key); //存在多個按鍵連按時
if(num == 1)
LED_G_ON;
switch(key_status)
{
case _Idle: //空閑狀態時判斷按鍵是否按下,判定為按下時按鍵狀態累計加1
{
switch(num)
{
case 1:
{
key_restate = new_key;
key_status = _Key1_Down;
} break;
case 2:
{
key_restate = new_key;
key_status = _Key2_Down;
} break;
default: break;
}
key_status = 0;
key_count = 0;
key_return = 0; //未按下時清除相應的變量
key_type = 0;
} break;
case _Key1_Down:
{
switch(num)
{
case 1:
{
if(key_restate == new_key)
key_status++;
else
key_status = _Idle;
} break;
case 2:
{
key_restate = new_key;
key_status = _Key2_Down;
} break;
default: key_status = _Idle; break;
}
} break;
case _Key1_Press: //按鍵為按下狀態時,累計按下的時間
{
switch(num)
{
case 1:
{
if(key_restate == new_key)
key_count++;
else
key_status++;
if(key_restate == K_LED)
key_type = 1;
else
key_type = 2;
} break;
case 2:
{
key_restate = new_key;
key_status = _Key2_Down;
key_type = 0;
key_count = 0;
} break;
default:
{
key_status = _Idle;
key_type = 0;
key_count = 0;
} break;
}
} break;
case _Key1_Up: //按鍵放開后,根據保持時間來判斷是長按還是短按
{
if(key_count < 100)
{
if(key_type == 1)
key_return = _LED_Short_Press;
else
key_return = _MIST_Short_Press;
}
else
if(key_type == 1)
key_return = _LED_Long_Press;
else
key_return = _MIST_Long_Press;
key_count = 0;
key_type = 0;
key_status = _Idle;
key_restate = new_key;
} break;
case _Key2_Down:
{
if(key_restate == new_key)
key_status++;
else
key_status = _Idle;
} break;
case _Key2_Press:
{
if(key_restate == new_key)
key_count++;
else
key_status++;
} break;
case _Key2_Up:
{
if(key_count > 100)
key_return = _Double_Press;
key_count = 0;
key_type = 0;
key_status = _Idle;
key_restate = new_key;
} break;
default: break;
}
return key_return;
}
復制代碼
作者:
神出沒
時間:
2020-1-14 13:06
好帖子,學習一下
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1