一个GPIO同时控制两枚LED灯,扫描两个按键。

文章讲述了如何利用单片机控制LED灯的点亮与熄灭,通过扫描和防抖机制处理按键输入,以及利用上拉和下拉电阻实现按键识别。
摘要由CSDN通过智能技术生成

电路如图,程序如图。

#点亮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);   //拉高电平点亮下灯
    }             




  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值