一、项目简介
通过一个按键控制LED的亮灭,实现按键按一下LED点亮,再按一下LED熄灭,交替循环。
二、控制原理
1. 按键检测原理:
- 将Arduino的监测端口设置为输入上拉模式(INPUT_PULLUP),用于连接按键。
- 当按键未按下时,由于上拉电阻的作用,监测端口输入为高电平。
- 当按键按下时,由于按键引脚接地,此时检测端口输入为低电平。
2. 按键去抖原理:
当按下按键时,会产生大约20ms左右的抖动,如果在此期间去检测Arduino监测端口的电平,会检测出错误信号。因此在首次检测到按键按下时需要延时20ms,再次检测时可以起到软件去抖动的作用。
3. 按键松开检测原理:
程序一直循环等待按键松开,即程序不停地检测IO口状态,直到检测到高电平为止。
4. 输入上拉模式
- Arduino引脚的三种模式:INPUT:输入模式,OUTPUT:输出模式,INPUT_PULLUP:输入上拉模式。
- Arduino UNO板自带上拉电阻:如果需要使用上拉电阻,则需要在代码配置阶段使用pinMode,通过上拉电阻可以将输入端口处的电压拉高到高电平,如果外部组件启用,它将取消上拉电阻所设置的高电平。通过这样,上拉电阻可以使引脚即使在未连接外部组件的时候也能保持确定的逻辑电平。
- pinMode(n,INPUT_PULLUP),设置n端口为上拉模式。
三、按键控制LED亮灭源码
#define LED 4
#define KEY 2
bool status = 0;
void setup() {
// put your setup code here, to run once:
pinMode(LED, OUTPUT);
pinMode(KEY,INPUT_PULLUP);//上拉输入引脚
}
void loop() {
// put your main code here, to run repeatedly:
if(scanKey())
{
digitalWrite(LED,status);
status = !status;//每按一次,更改端口赋值
}
}
bool scanKey()
{
//有按键按下
if(digitalRead(KEY) == LOW)
{
//延时20ms去抖
delay(20);
//有按键按下
if(digitalRead(KEY) == LOW)
{
while(1)
{
//等待按键恢复
if(digitalRead(KEY) == HIGH)
{
return true;
}
}
}
}
return false;
}
四、实现效果
程序开始时,LED灯亮。
按键按下后,LED灯熄灭。之后每按一次按键,LED灯明暗交替变化。