小蜜蜂笔记
嵌入式开发与物联网应用教育践行者

【CC2530应用开发04】单按键控制灯光开关

教学内容与重难点

【内容01】掌握按键的工作原理与去抖动处理。
【内容02】掌握端口输入配置寄存器PxINP的定义与正确应用。
【内容03】按键扫描处理函数的设计。
【内容04】完成实训项目:单按键控制灯光开关。
——–学生实践实操,老师讲解演示。
【内容05】专创融合专题。

【重点】实训项目:单按键控制灯光开关。
【难点】端口输入配置寄存器PxINP的正确设置。

教学单元核心内容与学习资源

按键的工作原理与去抖动处理

【电路连接】按键的两个引脚,一端通过电阻上拉到高电平,另一端接地。
【信号特征】没有按键按下的时候,输入引脚为高电平;当有按键按下的时候,输入引脚为低电平。
【扫描原理】通过反复读取按键输入引脚的信号,然后识别高低电平来判断是否有按键触发。

【为什么要去抖动?】按键的输入引脚有低电平产生,不代表一定是有按键按下,也许是干扰信号,因此,需要通过去抖动处理,将这些干扰信号过滤,从而获得真实的按键触发信号。
【如何实现去抖动?】首次检测到按键输入引脚有低电平后,稍作延时,再次读取该引脚,如还是低电平,则确认为按键触发信号;否则,判断为干扰信号,不予处理。

端口输入配置寄存器P0INP、P1INP、P2INP。
详见:【工作手册】《CC2530微控制器应用开发速查宝典》【8】【9】【10】。

【视频教程】: 按键的工作原理与设计基本思路

实训案例:单按键控制灯光开关

新建工程,编写代码,在XMF09B/XMF09C开发套件上,完成以下任务:
1-设计端口初始化函数,配置4个LED灯,SW1和SW2相关引脚。
2-设计LED灯检测函数,同时点亮4个LED灯,延时,然后同时关闭4个LED灯,模拟对4个LED灯的功能检测。
3-设计按键扫描函数,按键SW1按下松开后,切换D4灯的开关状态;按键SW2按下松开后,切换D6灯的开关状态。
4-在主函数中,反复扫描按键SW1和SW2的触发状态。

#include "ioCC2530.h"

#define D3 P1_0
#define D4 P1_1
#define D5 P1_3
#define D6 P1_4

#define SW1 P1_2
#define SW2 P0_1
/*=======================端口初始化函数========================*/
void Init_Port()
{
  //LED灯引脚初始化
  P1SEL &= ~0x1B;     //将P1_0、P1_1、P1_3和P1_4设为通用I/O端口
  P1DIR |= 0x1B;      //将P1_0、P1_1、P1_3和P1_4设为输出方向
  P1 &= ~0x1B;        //P1_0、P1_1、P1_2和P1_4设输出低电平
  //按键SW1引脚初始化
  P1SEL &= ~0x04;     //将P1_2设为通用I/O端口
  P1DIR &= ~0x04;     //将P1_2设为输入方向
  P1INP &= ~0x04;     //将P1_2配置为:上拉/下拉
  P2INP &= ~0x40;     //将P1_2配置为:上拉
  //按键SW2引脚初始化
  P0SEL &= ~0x02;     //将P0_1设为通用I/O端口
  P0DIR &= ~0x02;     //将P0_1设为输入方向
  P0INP &= ~0x02;     //将P0_1配置为:上拉/下拉
  P2INP &= ~0x20;     //将P0_1配置为:上拉
}
/*========================灯光检测函数=========================*/
void LED_Check()
{
  P1 |= 0x1B;                 //同时点亮4个LED灯
  Delay(60000);               //延时
  Delay(60000);
  P1 &= ~0x1B;                //同时熄灭4个LED灯
  Delay(60000);               //延时
  Delay(60000);
}
/*=======================按键扫描处理函数======================*/
void Scan_Keys()
{
  //按键SW1的扫描处理程序
  if(SW1 == 0)                //扫描是否有低电平产生
  {
    Delay(200);               //延时,去抖动处理
    if(SW1 == 0)              //确认按键触发信号
    {
      while(SW1 == 0);        //等待按键SW1松开
      D4 = ~D4;               //切换D4灯的开关状态
    }
  }
  //按键SW2的扫描处理程序
  if(SW2 == 0)
  {
    Delay(200);
    if(SW2 == 0)            
    {
      while(SW2 == 0);        //等待按键SW2松开
      D6 = ~D6;               //切换D6灯的开关状态
    }
  }
}
/*==========================主函数============================*/
void main()
{
  Init_Port();                //端口初始化
  LED_Check();                //灯光检测
  while(1)
  {
    Scan_Keys();              //循环扫描处理程序
  }
}

【视频教程】: 单按键控制灯光开关

赞(34)
未经允许不得转载:小蜜蜂笔记 » 【CC2530应用开发04】单按键控制灯光开关

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

小蜜蜂笔记 更专业 更方便 更高效

联系我们精品小店