實在是不好意思各位,我看了下,這個系統從第一篇到這一篇,快兩年時間了,反正
我也不指望這個系列能寫完,各位看客沒有指望這個系列去入門,我就隨心所欲的寫,
你們就隨心所欲的看,喜歡就留個言交流下,不喜歡就飛過吧。
按鍵我已經把它作為乙個功能模組,用到我的專案當中了,很是方便,最近我又遇
重寫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 板三 實驗內容 步驟和結果分析 編寫時鐘程式,...