<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          NorthFrame單片機(jī)極簡(jiǎn)信號(hào)/狀態(tài)機(jī)框架

          聯(lián)合創(chuàng)作 · 2023-09-26 16:27

          NorthFrame,單片機(jī)極簡(jiǎn)信號(hào)/狀態(tài)機(jī)框架。

          單片機(jī)開發(fā)中是否被滿天飛的全局變量困擾?
          是否在尋找一種層級(jí)間松耦合的信號(hào)傳遞方式?
          是否希望優(yōu)雅無(wú)負(fù)擔(dān)地使用狀態(tài)機(jī)思路進(jìn)行開發(fā)?

          NF_Signal 和 NF_FSM 來(lái)幫你。

          用法1:代替全局變量,使用方便

          NF_Signal_Set("flag_connect", 1);
          NF_Signal_Set("blink_cnt", 3);
          
          NF_SignalValue flag_connect = NF_Signal_Get("flag_connect");

          用法2:配合狀態(tài)機(jī)使用

          以下例程在VS2012環(huán)境中運(yùn)行一個(gè)判斷QE組合鍵的狀態(tài)機(jī)
          注:未來(lái)會(huì)更新使用狀態(tài)圖繪圖軟件自動(dòng)生成狀態(tài)機(jī)代碼 QandE_FSM

          #include "n_frame.h"
          
          #include "windows.h"
          #include "stdio.h"
          
          #define IS_KEY_PRESS(_key) ((GetKeyState(_key) >= 0) ? NF_Bool_False : NF_Bool_True )
          
          /* 信號(hào)產(chǎn)生者 */
          void Test_Key_Process(void)
          {
          	if ( IS_KEY_PRESS('Q') ){
          		NF_Signal_Set("key_q_press", 1);
          	}
          	else{
          		NF_Signal_Set("key_q_press", 0);
          	}
          
          	if ( IS_KEY_PRESS('E') ){
          		NF_Signal_Set("key_e_press", 1);
          	}
          	else{
          		NF_Signal_Set("key_e_press", 0);
          	}
          }
          
          /* 狀態(tài)機(jī)對(duì)象 */
          NF_FSM Test_FSM_QandE;
          
          /* 狀態(tài)機(jī)的三個(gè)狀態(tài)處理函數(shù) */
          void Test_FSM_QandE_IDLE(NF_FSM* me, NF_SignalName name, NF_SignalValue val);
          void Test_FSM_QandE_QDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val);
          void Test_FSM_QandE_QEDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val);
          
          /* IDLE狀態(tài)處理函數(shù) */
          void Test_FSM_QandE_IDLE(NF_FSM* me, NF_SignalName name, NF_SignalValue val)
          {
          	if ( NF_FSM_NameIs(name, "key_q_press") )
          	{
          		if ( val == 1 )
          		{
          			NF_FSM_TRAN(Test_FSM_QandE_QDOWN);
          			printf("Test_FSM_QandE State Translate : IDLE --> QDOWN\n");
          		}
          	}
          }
          
          /* QDOWN狀態(tài)處理函數(shù) */
          void Test_FSM_QandE_QDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val)
          {
          	if ( NF_FSM_NameIs(name, "key_e_press") )
          	{
          		if ( val == 1 )
          		{
          			NF_FSM_TRAN(Test_FSM_QandE_QEDOWN);
          			printf("Test_FSM_QandE State Translate : QDOWN --> QEDOWN\n");
          		}
          	}
          	else if( NF_FSM_NameIs(name, "key_q_press") )
          	{
          		if ( val == 0 )
          		{
          			NF_FSM_TRAN(Test_FSM_QandE_IDLE);
          			printf("Test_FSM_QandE State Translate : QDOWN --> IDLE\n");
          		}
          	}
          }
          
          /* QEDOWN狀態(tài)處理函數(shù) */
          void Test_FSM_QandE_QEDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val)
          {
          	if ( NF_FSM_NameIs(name, "key_e_press") )
          	{
          		if ( val == 0 )
          		{
          			NF_FSM_TRAN(Test_FSM_QandE_QDOWN);
          			printf("Test_FSM_QandE State Translate : QEDOWN --> QDOWN\n");
          		}
          	}
          	else if( NF_FSM_NameIs(name, "key_q_press") )
          	{
          		if ( val == 0 )
          		{
          			NF_FSM_TRAN(Test_FSM_QandE_IDLE);
          			printf("Test_FSM_QandE State Translate : QEDOWN --> IDLE\n");
          		}
          	}
          }
          
          int main(void)
          {
          	/* 初始化狀態(tài)機(jī) */
          	NF_FSM_Translate(&Test_FSM_QandE, NF_FSM_State(Test_FSM_QandE_IDLE));
          
          	for (;;)
          	{
          		Test_Key_Process();
          		NF_FSM_CheckSignal(&Test_FSM_QandE, "key_q_press");
          		NF_FSM_CheckSignal(&Test_FSM_QandE, "key_e_press");
          	}
          }
          瀏覽 32
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  年轻人在线毛片免费看视频在线 | 国产成人免费在线观看 | 国产成人99精品免费视频明星 | 先锋影音av成人版 | 日韩人妻人操 |