深圳市航顺芯片技术研发有限公司
直播中

李秀珍

7年用户 950经验值
私信 关注
[问答]

怎样通过按键去控制LED灯的亮与灭呢

按键的工作原理是什么?
按键消抖的方法有哪几种?

回帖(1)

王敏

2021-9-23 15:24:27
  实验套件介绍
  如图所示是我们的CC2530实验套件,从图上可以看出,板子中间有四个LED,分别是:LED3,LED4,LED1,LED2
  板子上有两个按键SW1和SW2分别对应引脚 P1.2和P0.1
  课堂任务
  ①通过按键SW1控制LED3灯的亮与灭
  ②通过按键SW1控制LED灯向下移动
  ③通过按键SW2控制LED灯向上移动
  ④SW1和SW2同时控制LED灯上下移动
  预备知识
  按键工作原理
  
  当按键未被按下时,Key的电压为3.3V,当按键被按下时,Key的电压是0V。
  按键按下与抬起改变的是Key的电压。
  上拉与下拉
  上拉是指单片机的引脚通过一个电阻连接到电源(高电平),当外界没有信号输入到引脚时,引脚被上拉电阻固定在高电平(逻辑值1)。
  下拉是指单片机的引脚通过一个电阻连接到地(低电平),当外界没有信号输入到引脚时,引脚被下拉电阻固定在低电平(逻辑值0)。
  思考:
  上一页PPT的按键是上拉还是下拉?
  请同学们画出一个下拉的按键原理图?
  按键抖动
  
  通常按键所用的都是机械弹性开关,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下就断开,而是在闭合或断开的瞬间均伴随一连串的抖动。
  抖动时间的长短由按键的机械特性决定,一般为5~10 ms,一个按键的时间一般为几百毫秒至数秒。由于单片机的运行速度快,按键的抖动会导致在一次按下过程中,单片机识别出多次按下和抬起。为了避免这种情况,需要想办法消除抖动带来的影响。
  按键消抖的方法有两种:
  硬件消抖和软件消抖硬件消抖是通过电路硬件设计的方法来过滤按键输出信号,将抖动信号过滤成理想信号后再输出给单片机。软件消抖是通过程序过滤的方法,在程序中检测到按键动作后,延时一会儿后再次检测按键状态,如果延时前后按键的状态一致,则说明按键是正常执行动作,否则认为是按键抖动。
  实验套件上按键的原理图
  
  
  通过SW1控制LED3的亮灭
  任务描述:
  ①上电后LED3点亮,其他LED灯熄灭
  ②按下SW1后LED3熄灭,再次按下LED3点亮
  初始化设置:
  ①P1_2设置输入,P1的其他引脚设为输出设置为输出
  P1DIR =0xFB; //(0xFB = 1111 1011)
  ②点亮LED3,熄灭其他LED
  LED3 = 1;
  LED1 = 0;
  LED2 = 0;
  LED4 = 0;
  读取按键的值
  unsigned char KeyScan(void)
  {
  if(SW1 == 0) //按键被按下
  {
  Delay_mS(50); //消除抖动
  if(SW1 == 0) //再次确认按键被按下
  {
  while(!SW1); //直到松开按键
  return(1);
  }
  }
  return(0);
  }
  主循环
  while(1)
  {
  Keyvalue = KeyScan(); //读取按键值
  if(Keyvalue》0)
  {
  LED3 = !LED3;
  Keyvalue = 0;
  };
  }
  通过SW1 控制LED灯向下流动
  任务描述:
  上电后LED3点亮,其他熄灭;
  按下SW1后LED4点亮,其他熄灭;
  再次按下SW1,LED1点亮,其他熄灭;
  再次按下SW1,LED2点亮,其他熄灭:
  
  实现代码
  while(1){ Keyvalue = KeyScan(); //读取按键值 if(Keyvalue》0) { if(LED3 == 1) //如果当前LED3亮 { LED3 = 0; LED4 = 1; } else if(LED4 == 1) { LED4 = 0; LED1 = 1; } else if(LED1 == 1) { LED1 = 0; LED2 = 1; } else if(LED2 == 1) { LED2 = 0; LED3 = 1; } Keyvalue = 0; }; } ** LED灯向上移动**
  
  同学们自己修改代码实现LED灯向上移动的效果!
  按键SW2的使用
  ①初始化SW2,将SW2对应的引脚P01设为输入模式
  P0DIR = 0; //P0所有引脚都设为输入模式 ②按键扫描函数添加如下代码
  if(SW2 == 0) //低电平有效 { Delay(100); //检测到按键 if(SW2 == 0) { while(!SW2); //直到松开按键 return(2); } }
  SW1和SW2同时控制LED灯上下移动
  任务要求:
  上电后LED3点亮,其他熄灭;
  按下SW1按键后,点亮的那颗灯向下移动;
  按下SW2按键后,点亮的那颗灯向上移动;
  完整的源代码
  while(1)
  {
  Keyvalue = KeyScan(); //读取按键值
  if(Keyvalue》0)
  {
  if(LED3 == 1) //如果当前LED3亮
  {
  LED3 = 0;
  LED4 = 1;
  }
  else if(LED4 == 1)
  {
  LED4 = 0;
  LED1 = 1;
  }
  else if(LED1 == 1)
  {
  LED1 = 0;
  LED2 = 1;
  }
  else if(LED2 == 1)
  {
  LED2 = 0;
  LED3 = 1;
  }
  Keyvalue = 0;
  };
  }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分