微控制器模組化二 LED思考

2021-09-16 12:44:54 字數 2608 閱讀 2490

實在是不好意思各位,我看了下,這個系統從第一篇到這一篇,快兩年時間了,反正

我也不指望這個系列能寫完,各位看客沒有指望這個系列去入門,我就隨心所欲的寫,

你們就隨心所欲的看,喜歡就留個言交流下,不喜歡就飛過吧。

按鍵我已經把它作為乙個功能模組,用到我的專案當中了,很是方便,最近我又遇

重寫led邏輯的**,為什麼我不把led也封裝下呢?思路和按鍵封裝一樣,採用完全非

阻塞思路。

我的封裝思路如下:

1、要和硬體驅動分離;

2、一定不能阻塞;

3、可以支援任意多個led;

4、每個led可以任意設定自己的閃爍頻率,即亮滅時間都可以調整;

暫時我的應用邏輯就是這麼多需求,要求明確了,下面就是實現了。

1、驅動層分離,我採用註冊方法;

2、不能阻塞,採用fsm;

3、任意多個,那就只能用鍊錶,並且例項的獲得方式有使用者自己確定;

4、閃爍頻率可任意配置,這個就是兩個變數了;

好了,思路講完了,具體實現如下:

提供的使用者api:

/*@

模組初始化函式

@*/extern void init_led_mode(void);

/*@ led實體初始化函式

ptledparameter led例項

ptledoff 燈滅函式

ptledon 燈亮函式

@*/extern bool init_led_parameter(led_parameter_t* ptledparameter,led_off* ptledoff,led_on* ptledon);

/*@ led啟動函式

ptledparameter led例項

hwcyclenum 燈閃爍次數,如果是0xffff,則一直閃爍

hwcycleon 燈亮的時間

hwcycleoff 燈滅的時間

@*/extern bool led_start(led_parameter_t* ptledparameter,uint16_t hwcyclenum,uint16_t hwcycleon,uint16_t hwcycleoff);

/*@ led停止函式

ptledparameter led例項

@*/extern bool led_stop(led_parameter_t* ptledparameter);

/*@ led服務函式

@*/extern void led_services(void);

用法:

init_led_mode()led服務初始化,沒啥說的,先初始化服務;

init_led_parameter()初始化led例項,主要是註冊燈亮和燈滅函式

led_start()就是啟動某個led例項服務了,led_stop()就是停止某個led例項服務

led_services()led的核心服務,週期的呼叫,呼叫週期為sys_tick_cycle,

我把它放到了心跳定時中,並且sys_tick_cycle設定為10ms

這裡面使用了乙個單鏈表來實現的,效率不高,但是足夠了,沒有那麼多的led;

這裡我只貼出乙個核心服務的實現,其他的,就補貼了,很簡單。

void led_services(void)

pttask->tstate = fsm_led_services_led_on_wait;

//break;

case fsm_led_services_led_on_wait:

pttask->hwcnt++;

if(pttask->hwcnt >= pttask->hwcycleon)

break;

case fsm_led_services_led_off:

if(null !=pttask->ptledoff)

pttask->tstate = fsm_led_services_led_off_wait;

//break;

case fsm_led_services_led_off_wait:

pttask->hwcnt++;

if(pttask->hwcnt >= pttask->hwcycleoff)

break;

case fsm_led_services_is_over:

if(0xffff != pttask->hwcyclenum)

}pttask->tstate = fsm_led_services_start;

break;

default:

*ppttask = pttask->ptnext;

pttask = *ppttask;

pttask->tstate = fsm_led_services_start;

break;

}ppttask = &pttask->ptnext;

pttask = pttask->ptnext;

}else

}//)

}

微控制器模組學習之LED

點led就是高低電平的控制,整理一些用的到的知識吧 一些開發板上可能會把led連到鎖存器上,導致我們可能一開始就一臉蒙蔽,整理 一些鎖存器 數電裡學的38解碼器 簡單來說就是三個輸入,8個輸出 這種暫存器的好處就是節省i o口 真值表可以看出用法 這是個驅動器 輸出端可達500ma 50v.需要注意...

c51微控制器模組化程式設計

在剛接觸微控制器,剛編寫 的時候都只是有乙個.h 和乙個.c檔案。把所有的函式都寫在.c裡面。這樣遇到複雜的系統時,量就很大,一下子就是幾百行。而且把所有函式寫在乙個.c裡不利於移植,對於以後的開發有了很大的限制。為了解決這個缺點就必須學會模組化程式設計。將程式分解成乙個乙個模組。這樣就有了多個.c...

微控制器 LED實驗

實 驗 報 告第頁 專業 軟體工程 班級 4 學號 123012005158 實驗日期 2007年11 月27 告退發 訂正 重做 課程微控制器程式設計 實驗名稱 led實驗 一 實驗目的 掌握 led工作原理和使用方法 二 實驗環境 pc,kc,51 板三 實驗內容 步驟和結果分析 編寫時鐘程式,...