咱們講了數字IO口介紹以及作了流水燈演示(主要用到IO口的輸出功能),這節課咱們講解一下IO口的輸入功能,說到輸入功能,最經典的例子莫過於按鍵實驗。廢話少說,趕忙上車。git
實驗內容:
當按住按鍵時點亮LED,當放開按鍵後熄滅LED;算法
實驗代碼:oop
/** * @Desc 按鍵燈(當按住按鍵時點亮LED,當放開按鍵後熄滅LED) * @author 單片機菜鳥 * @Date 2016/12/3 * 注意:LED的一端接到5V,另一端接到輸出引腳,低電平亮 * 按鍵是高電平有效 */ #define LED 2 #define KEY 10 int buttonState = HIGH;//記錄當前按鍵狀態 void setup() { //配置2號引腳做爲輸出引腳 pinMode(LED,OUTPUT); digitalWrite(LED,HIGH);//滅掉LED //配置10號引腳爲輸入引腳 若是是本身鏈接普通按鍵 pinMode(KEY,INPUT_PULLUP),弱上拉 pinMode(KEY,INPUT); } void loop() { buttonState = digitalRead(KEY);//讀取當前按鍵狀態 if(buttonState == HIGH){ //按鍵按下 digitalWrite(LED,LOW);//點亮LED }else{ //按鍵放開 digitalWrite(LED,HIGH);//熄滅LED } }
實驗內容:
當點擊一次按鍵時點亮LED,當再次點擊一次按鍵時熄滅LED(就跟家裏燈同樣)學習
實驗代碼:code
/** * @Desc 按鍵燈(當點擊一次按鍵時點亮LED,當再次點擊一次按鍵時熄滅LED) * @author 單片機菜鳥 * @Date 2016/12/3 * 注意:LED的一端接到5V,另一端接到輸出引腳,低電平亮 * 按鍵是高電平有效 */ #define LED 2 #define KEY 10 int buttonState = HIGH;//記錄當前按鍵狀態 int flag = HIGH;//默認當前滅燈 void setup() { //配置2號引腳做爲輸出引腳 pinMode(LED,OUTPUT); digitalWrite(LED,flag);//滅掉LED //配置10號引腳爲輸入引腳 若是是本身鏈接普通按鍵 pinMode(KEY,INPUT_PULLUP),弱上拉 pinMode(KEY,INPUT); } void loop() { buttonState = digitalRead(KEY);//讀取當前按鍵狀態 if(buttonState == HIGH){ //按鍵按下 delay(40);//作一個防抖動延時(確保真是按下了按鍵而不是錯誤) buttonState = digitalRead(KEY);//再一次讀取按鍵狀態 if(buttonState==HIGH){ //再次確認是否真的按下了按鍵,是的話就置反當前燈的狀態 flag = !flag; digitalWrite(LED,flag); } } }
個人按鍵模塊的實驗結果是:偶爾能夠,偶爾又不能夠,證實只是簡單防抖動確定是不行的。後面通過查資料用如下防抖動方法:blog
/** * @Desc 按鍵燈(當點擊一次按鍵時點亮LED,當再次點擊一次按鍵時熄滅LED) * @author 單片機菜鳥 * @Date 2016/12/3 * 注意:LED的一端接到5V,另一端接到輸出引腳,低電平亮 * 按鍵是高電平有效 */ #define LED 2 #define KEY 10 int flag = HIGH;//默認當前滅燈 // 定義記錄按鍵當前狀態的變量 int state_btn; // 定義記錄按鍵最近一次狀態變化的變量,並初始化狀態爲LOW。 int lastButtonState = LOW; // 定義記錄最近一次抖動的時間變量,並初始化時間爲0毫秒。 long lastDebounceTime = 0; // 定義延遲抖動的時間變量 long debouncdDelay = 60; void setup() { //配置2號引腳做爲輸出引腳 pinMode(LED,OUTPUT); digitalWrite(LED,flag);//滅掉LED //配置10號引腳爲輸入引腳 若是是本身鏈接普通按鍵 pinMode(KEY,INPUT_PULLUP),弱上拉 pinMode(KEY,INPUT); } void loop() { int buttonState = digitalRead(KEY);//讀取當前按鍵狀態 if(buttonState != lastButtonState){ //若是按鍵發生了變化 則從新設置最近一次抖動的時間 //方法millis()能夠獲取當前時間,單位統一爲毫秒。 lastDebounceTime = millis(); } // 判斷按鍵按下狀態時間間隔是否大於延遲抖動的時間長度。 if(millis()-lastDebounceTime>debouncdDelay){ // 判斷當前的按鍵狀態是否和以前有所變化 if(buttonState != state_btn){ // 若是發生了變化, // 則更新按鍵狀態變量。 state_btn = buttonState; if(state_btn == HIGH){ //再次確認是否真的按下了按鍵,是的話就置反當前燈的狀態 flag = !flag; digitalWrite(LED,flag); } } } // 更新按鍵最近一次狀態變化的變量 lastButtonState = buttonState; }
這裏的防抖算法的思路是:
須要記錄一個最近狀態 lastButtonState (每讀一次引腳狀態就記錄一次),而後在抖動間隔內(60ms)判斷最新狀態,只要間隔內狀態改變,就不斷更新抖動時間的起始點(也就是 lastDebounceTime = millis(); ),直到防抖動知足 millis()-lastDebounceTime>debouncdDelay。以後再判斷一下當前狀態和以前狀態是否改變 buttonState != state_btn (以防用戶按過久了)。it
這節課咱們主要學習數字IO口的輸入功能,總體上還算簡單,主要是注意按鍵防抖動。ast