咱们讲了数字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