电路如图,程序如图。
#点亮LED:
一般LED灯点亮需要2v-3v电压。利用3.3v不足以同时点亮两枚LED的特性可以使平时两枚LED灯截止熄灭。
只要使用推广输出拉高或者拉低,电瓶就可以点亮某一颗的。
如果需要同时点亮的话,只需要不断扫描点亮即可。
程序设计中,即使只需点亮一枚也是扫描显示的。
#扫描按键
利用单片机内置的上拉或下拉电阻。
如果有按键按下则会被短路到地或者接通vcc。
根据每种单片机的上下拉电阻不同,配置的外接上下拉电阻可以根据单片机的上下的电阻不同,从而实现同时识别上下按键。
const int testPin = 4; //测试引脚
bool upLED, downLED; //上下灯标志位
int32_t upKey, downKey; //上下按键防抖
int32_t second; //毫秒累加器
void setup() { //
pinMode(testPin, OUTPUT); //
}; //
void loop() { //
pinMode(testPin, INPUT_PULLUP); //接通上拉电阻
if (0 == digitalRead(testPin)) //判断是否被拉低
downKey++; //按键被按下,变量加一
else { //按键木有被按下
if (downKey > 50) //超过防抖值将标志位翻转
downLED = !downLED; //bool不能按位取反,超级大坑.新手一定都要去踩一脚。
downKey = 0; //默认清零也许按键在抖动也许一直都没有按键
} //
pinMode(testPin, INPUT_PULLDOWN); //接通下拉电阻
if (1 == digitalRead(testPin)) //判断是否被拉高
upKey++; //按键被按下,变量加一
else { //按键木有被按下
if (upKey > 50) //超过防抖值将标志位翻转
upLED = !upLED; //bool不能按位取反,超级大坑.新手一定都要去踩一脚。
upKey = 0; //默认清零也许按键在抖动也许一直都没有按键
} //
pinMode(testPin, INPUT); //关断上下拉电阻防LED微亮
if (upKey) { //如果上按键按下
pinMode(testPin, OUTPUT); //设置成输出模式
digitalWrite(testPin, LOW); //拉低引脚
} //
if (downKey) { //如果下按键按下
pinMode(testPin, OUTPUT); //设置成输出模式
digitalWrite(testPin, HIGH); //拉高电平点亮下灯
} //
if ((second % 2) == 1) { //单数纪元点上灯
if (upLED) { //如果上灯需要点亮
pinMode(testPin, OUTPUT); //设置成输出模式
digitalWrite(testPin, LOW); //拉低电平点亮上灯
} //
} //
if ((second % 2) == 0) { //双数纪元点下灯
if (downLED) { //如果下灯需要点亮
pinMode(testPin, OUTPUT); //设置成输出模式
digitalWrite(testPin, HIGH); //拉高电平点亮下灯
}