參考資料來自用戶手冊P.328
一、設計任務:
用中斷法識別按鍵的狀態,按鍵一次LED亮;再按一次,LED熄滅,如此往復。並消除按鍵抖動。
二、基本原理:
按鍵查詢一般可以通過掃描和中斷來實現。中斷實現可以免除頻繁掃描的麻煩,在按鍵按下時,中斷當前的程序執行中斷處理函數,效率較高。中斷發生時有一個硬件裝置將信號輸入單片機,該硬件部件叫中斷控制器,它負責把引起中斷的信號編號,並按照事先約定的優先級排隊,並發信號給單片機的cpu。cpu檢測到中斷控制器的信號后,獲得當前中斷發生信號的編號,由中斷向量表找到中斷向量,轉而去執行這個編號對應的中斷處理程序。設置好P1端口低四位的中斷觸發方式為下降沿;打開相應的中斷控制位和打開總中斷,然后在中斷服務程序中改變輸出。按鍵的抖動一般是機械性抖動,當開關斷開或閉合時接觸點處不會一下子接通也不會一下子斷開,而是會產生輕微的抖動導致電路的多次接通和斷開,這個過程大致會持續5ms-10ms。按鍵消抖一般可用定時器和延時來實現。當按鍵按下中斷標志位會改變,延時10ms后再檢測中斷標志位,若此時中斷標志位與延時前狀態不一致則代表按鍵已經按下,就改變輸出;若狀態一致則代表按鍵未按下,繼續等待下一個中斷觸發。
三、流程圖
四、代碼
#include <msp430g2553.h> int main(void) { WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer P1DIR |= BIT0; //將P1.0設為輸出(LED) P1REN |= BIT3; //啟用P1.3內部上下拉電阻 P1OUT |= BIT3; //將內部電阻設為上拉 P1DIR &= ~(BIT3); //將P1.3設為輸入(按鍵) P1IE |= BIT3; //打開P1.3中斷 P1IES |= BIT3; //設置P1.3為下降沿中斷 P1IFG &= ~ BIT3; //清除中斷標志位 _EINT(); //打開總中斷 return 0; } /*------中斷服務程序---------*/ # pragma vector = PORT1_VECTOR __interrupt void keypress(void) { if(P1IFG & BIT3)//檢測中斷標志位 { __delay_cycles(10000);//延時10ms while(!(P1IFG & BIT3));//再次檢測 P1IFG &= ~BIT3; //清除中斷標志位 P1OUT ^= BIT0; //改變輸出 }
}