單片機程序設計中運用事件驅動(dòng)機制
LED顯示的實(shí)現
顯示模塊結構見(jiàn)圖2。以定時(shí)器T0作為L(cháng)ED的動(dòng)態(tài)掃描的定時(shí)基準,T0的定時(shí)時(shí)間最大值 Tseg=20ms/(8×N)(其中N為L(cháng)ED位數),改變 Tseg的值可改變顯示的亮度。T0每隔Tseg時(shí)間向MCU申請中斷,在T0的中斷服務(wù)程序中置位相應的標志位(Message_Flag中的D0 位)。主程序檢測到此標志位被置位后,啟動(dòng)顯示模塊實(shí)現位段的顯示輸出。
鍵盤(pán)輸入的實(shí)現
鍵盤(pán)模塊結構見(jiàn)圖3。在LED動(dòng)態(tài)掃描期間,只有被點(diǎn)亮的LED相應的位選線(xiàn)維持大約3ms的低電平,而在系統工作的絕大部分時(shí)間內LED的位選線(xiàn)(即鍵盤(pán)的列線(xiàn))維持高電平。當有鍵被按下時(shí),將把鍵盤(pán)的行線(xiàn)中某一根拉成高電平,經(jīng)或非門(mén)后,向MCU 申請INT1中斷,在INT1的中斷服務(wù)程序中啟動(dòng)定時(shí)時(shí)間為20ms的定時(shí)器T1。T1的定時(shí)時(shí)間到后向MCU申請T1中斷,在T1的中斷服務(wù)器程序中置位相應的中斷申請標志(Message_Flag中的 D1位)。主程序檢測到此標志位被置位后,啟動(dòng)鍵盤(pán)掃描模塊實(shí)現鍵盤(pán)輸入。鍵盤(pán)輸入完成(用戶(hù)按“確認”鍵),置位鍵盤(pán)輸入確認標志(Message_Flag中的D7位)。
IC卡的讀寫(xiě)
IC 卡的SDA、SCL經(jīng)卡座分別通過(guò)P1.0、P1.1與MCU相連。當IC卡插入卡座時(shí),座上的微動(dòng)開(kāi)關(guān)使INT0變?yōu)榈碗娖?,向MCU申請INT0中斷。在INT0中斷服務(wù)程序中置位相應的中斷申請標志(Message_Flag中的D2位),主程序檢測到此標志位被置位后,啟動(dòng)IC卡的讀模塊,以軟件模塊I2C協(xié)議來(lái)實(shí)現讀卡操作。在數據處理完成后,同樣通過(guò)軟件模塊I2C協(xié)議來(lái)完成寫(xiě)卡的操作。
串口通訊
實(shí)際應用中可把UART轉換成RS232C與PC相連或轉換成RS485等其它協(xié)議組成單片機網(wǎng)。 MCU與外部的通訊采用中斷方式,在串口的中斷服務(wù)程序中置位相應的中斷申請標志(Message_Flag中的D4位)。主程序檢測到此標志位被置位后,啟動(dòng)串口通訊模塊,實(shí)現與外部的數據通訊。
主程序的設計
綜上所述,主程序首先完成系統的初始化,然后循環(huán)檢測各中斷的中斷申請標志,如有某標志被置位,則啟動(dòng)相應的處理模塊完成相應的任務(wù)。程序結構如下(用C51編寫(xiě)):
vnsigned bdata message_flag;
sbit t0_int=message_flag^0;
sbit t1_int=message_flag^1;
sbit int0_int=message_flag^2;
sbit uart_int=message_flag^4;
sbit kb_enter=message_flag^7;
unsigned char kb_buf[8];
unsigned char led_buf[8];
unsigned char ic_buf[8];
評論