8 LED 設計模式

LED 通常用做跑馬燈,用來表示系統正在執行中的燈號。


8.1 LED 標頭檔

LED 標頭檔宣告 LED 驅動程式相關的常數和結構。

宣告 LED_H,避免標頭檔的重複引用。

01 #ifndef LED_H
01 #define LED_H

宣告 LED 控制結構原型,包含狀態機和計時器變數。

01 typedef struct {
01     INT8U State;
01 	INT16U Timer;
01 }LED_CONTROL;

將 LED 驅動程式的控制結構和介面函式引出,其他程式可參考 LED 標頭檔,並引用這些變數與函式。

01 extern LED_CONTROL LedCtrl;
01 extern void LedInit(void);
01 extern void LedSvc(void);
01 #endif


8.2 LED 結構與變數

宣告 LED 燈號控制腳位,P1^0 表示是在 PORT 0 的第一根腳位。
宣告 LED 控制結構 LedCtrl。

01 sbit Led0=P1^0;
01 
01 LED_CONTROL LedCtrl;


8.3 LED 函式庫

LED 函式庫。

函式名稱說明
LedInitLED初始化函式。
LedSvcLED服務函式。


8.3.1 LED 初始化函式

設定初始狀態是顯示第一個 LED。
設定第一次的顯示時間是 2 秒鐘之後。

01 void LedInit(void){ 
01   LedCtrl.State=Led0OnState;
01   LedCtrl.Timer=50; 
01 } 


8.3.2 LED 服務函式

當等待時間未耗盡,離開服務函式。
設定下一次進來的時間。
每次進來時,更改 LED 顯示燈號,並設定下一次顯示的 LED 狀態,這就是跑馬燈的原理。

01 void LedSvc(void){
01   if(LedCtrl.Timer!=0) return;
01   LedCtrl.Timer=50;
01   switch(LedCtrl.State){
01 	case Led0OnState:
01       Led0=LED_ON;
01 	  LedCtrl.State=Led0OffState;
01       break;
01     case Led0OffState:			
01       Led0=LED_OFF;
01       LedCtrl.State=Led0OnState;
01       break;
01     default:
01       break;
01   }    
01 }