Version 8, last updated by fellong at December 30, 2008 17:53 UTC
實驗(三)飛梭編碼器輸入
(教學教材內容保留所有版權~欲轉載請註明出處~謝謝)
實驗(三) 飛梭編碼(帶開關)輸入單元
實驗目的:
本節在實現飛梭編碼(帶開關)輸入單元模組。
實驗一:
開關ON/OFF+左右旋解碼,開關按一下ON、LED0亮,向右旋轉LED累加,向左旋轉LED遞減
實驗二:
開關ON/OFF+左右旋解碼控制 LED 亮度,開關按一下 ON、LED0 亮,向右旋轉LED 變暗,向左旋轉 LED 變亮。
實驗三:
開關ON/OFF+左右旋解碼控制 LED 亮度,開關按一下 ON、LED0 亮,按住 sw1 或向右旋轉 LED 變暗,按住 sw2 或向左旋轉 LED 變亮。
I/O腳位定義:
編碼訊號ROTARY_A:pd.7
編碼訊號ROTARY_B:pd.6
按鈕ROTARY_SW:pi.6
模組函式規畫:
/// ======== START Public 函式 ========
void Initial_Rotary(); /// 初始化 IO
void Rotary_Control(); /// 飛梭旋鈕控制 LOOP
/// ======== END Public 函式 ========
/// ======== START Rotary Callback 函式 ========
extern void Rotary_Up( void ); /// Callback 函式,當 Rotary 放開時會被持續叫用
extern void Rotary_Down( void ); /// Callback 函式,當 Rotary 按住時會被持續叫用
extern void Rotary_Press(void); /// Callback 函式,當 Rotary 按下時會被叫用一次
extern void Rotary_Release(void); /// Callback 函式,當 Rotary 放開時會被叫用一次
extern void Rotary_CW(void); /// Callback 函式,當 Rotary 順時針轉一格會被叫用一次
extern void Rotary_CCW(void); /// Callback 函式,當 Rotary 逆時針轉一格會被叫用一次
/// ======== END Rotary Callback 函式 ========
模組函式設計:
操作函式設計:
基本上飛梭按鈕模組的設計方式跟實驗二的按鈕模組很類似,都是輸於輸入模組,單看上列模組函式可以發現滿它的按鍵事件跟按鈕模組完全一樣(因為飛梭按鍵其實就是帶有一個獨立的按鈕),多出來的就是旋鈕正反旋轉的事件。這也是在設計模組時要把握的一個原則,就是在函式的命名上要儘量能統一、能一目瞭然、能讓系統設計時一看到函式名稱就知道大概怎麼用。
當然,一般按鈕跟飛梭按鈕在硬體的設計上必定是大不相同的,所以其底層函式底層的實作也必定不相同,程式設計師需要依循硬體規格及其Datasheet去完成實作。
控制函式的實作:
參考Datasheet,略。
實驗實作:
實驗一:
開關ON/OFF+左右旋解碼,開關按一下ON、LED0亮,向右旋轉LED累加,向左旋轉LED遞減。
系統的大致架構如下,你會發現它跟實驗二的系統架構如出一徹,這便是模組低耦合度的一個表現,同樣的系統功能,可以很輕易的用不同的模組來替換(或同時控制),在硬體的觀點來看,便是,同樣的輸出功能需求,可以由不同的輸入方式來作控制,大大增加了軟體、硬體整合的彈性。
void FPPA0 (void)
{
/// 初始化...略
while (1)
{ /// 飛梭旋鈕控制 LOOP
Rotary_Control();
}
}
void Rotary_Press(void) /// Callback 函式,當 Rotary 按下時會被叫用一次
{
/// 略
}
void Rotary_CW(void) /// Callback 函式,當 Rotary 順時針轉一格會被叫用一次
{
if( START_RUN )
LED_SR0();
}
void Rotary_CCW(void) /// Callback 函式,當 Rotary 逆時針轉一格會被叫用一次
{
if( START_RUN )
LED_SL1();
}
實驗二:
開關ON/OFF+左右旋解碼控制 LED 亮度,開關按一下 ON、LED0 亮,向右旋轉LED 變暗,向左旋轉 LED 變亮。
略。
實驗三:
開關ON/OFF+左右旋解碼控制 LED 亮度,開關按一下 ON、LED0 亮,按住 sw1 或向右旋轉 LED 變暗,按住 sw2 或向左旋轉 LED 變亮。
略。