實驗(十五)PS2鍵盤滑鼠輸入

/// ===============================================
/// PS2 模組
/// -----------------------------------------------
/// 功能 : PS2 介面讀寫控制模組
/// -----------------------------------------------
/// Input Pins :
/// PS2DATA equ pf.7 // data line
/// Output Pins :
/// PS2CLK equ pf.6 // clock line
/// ===============================================

PS2_NOACK equ 0x00 /// PS2 無回應
PS2_ACK equ 0xFA /// PS2 有回應

/// ======== START Public 函式 ========
/// *注意,除了 Initial_PS2() 外,其餘函式都有使用到 wait io 的指令,意即有可能會 hold 住系統,需謹慎使用。
void Initial_PS2( void ); /// 初始化 IO
void PS2_Reset( void ); /// 重設 PS2,成功傳回 1,失敗傳回 0
void PS2_ReadID( void ); /// 讀取裝置 ID,成功傳回 ID,失敗傳回 0
void PS2_SendByte( void ); /// 傳入 a 將 a 傳送到 PS2 介面,return 1:ACK 0:NOACK
void PS2_RecvByte( void ); /// 等待 PS2 介面傳送一個 BYTE 的資料, a = 資料
/// ======== END Public 函式 ========


PS2 界面看它的 DATASHEET 底層的時序圖看起來非常容易實現,但是問題會卡在 MCU 是扮演 HOST 的角色,而 CLOCK 又是由 DEVICE 來產生,而且其傳輸速率也不慢,HOST 是在被動的狀態下接收 DEVICE 傳來的資料,而 HOST 也不能保證系統執行期間 DEVICE 是 OK 的,除去偵測 DEVICE 硬體錯誤的問題,光要被動來處理 DEVICE 傳來的資料(甚至還要寫資料到DEVICE),又不影響主程序的運行,在傳統的 MCU 就是一大挑戰了吧? (除了內建PS2硬體界面或者有更優的寫法?),寫的出來但要處理的問題有可能會變很複雜,FPPA wait io 的能力在此就表露無遣,我想大部份工程師都寧願犧牲個核心來專責處理 PS2 界面的工作,而不會多花時間來撰寫複雜的 IO interrupt 以及跟 device 資料傳來傳去的工作吧。

/// ===============================================
/// PC Keyboard 模組
/// -----------------------------------------------
/// 功能 : 封裝 PS2 模組功能,接收 PC Keyboard 傳來的鍵盤資料
/// -----------------------------------------------
/// Input Pins :
/// see ps2.h for detail
/// Output Pins :
/// see ps2.h for detail
/// ===============================================

 

/// ======== START Public 函式 ========
void Initial_KB( void ); /// 初始化 IO、重置 PS2 裝置,並檢查是否為 Keyboard
/// 若無誤,傳回 1,否則傳回 0
void KB_SetLED( void ); /// 將鍵盤上 NUM 燈亮起,成功傳回 1,失敗傳回 0
void KB_RecvByte( void ); /// 接收鍵盤一個 BYTE 的 SCAN CODE 資料。
/// ======== END Public 函式 ========

 


/// ===============================================
/// MS MOUSE 模組
/// -----------------------------------------------
/// 功能 : 封裝 PS2 模組功能,支援 MS MOUSE 傳來的鍵盤資料
/// -----------------------------------------------
/// Input Pins :
/// see ps2.h for detail
/// Output Pins :
/// see ps2.h for detail
/// ===============================================

 

/// ======== START Public 函式 ========
void Initial_Mouse( void ); /// 初始化 IO、重置 PS2 裝置,並檢查是否為 MS MOUSE
/// 若無誤,傳回 1,否則傳回 0
void Mouse_RecvByte( void ); /// 接收 MS MOUSE 傳來的資料 a
/// ======== END Public 函式 ========


PS2 KEYBOARD/MOUSE 也同樣只是封裝了 PS2 界面的函式而己,其實現只是依循 PS2 KEYBOARD/MOUSE 的 PROTOCOL 即可,無需關心底層的 I2C 界面是如何處理的,這也是模組設計上要去考量的,OOP的概念,物件的歸物件、界面的歸界面。