【物联网技能竞赛】【ZigBee】CC2530按键检测入门笔记

电路图 

首先,要想通过按钮点亮LED灯,那就必须了解开发板上led灯和按钮所对应的引脚,最直接的方法就是看电路图(这边所使用的是物联网技能大赛对应的ZigBee开发板,若用其它板子得对引脚和代码进行更替):

 

 如图可以看出led灯的引脚分别对应到:

D3P1_0
D4P1_1
D5P1_3
D6P1_4

按钮的引脚对应到:

SW2P0_1
SW1P1_2

寄存器设置

上一篇了解了2个重要的寄存器在这次案例中也会涉及得到,现在再来看看两个对于输入模式下重要的寄存器

P0INP 端口输入配置寄存器 

位 位名称 复位值操作 描述
7:0MDP0[7:0]  0x00  R/W 

设置 P0_7 到 P0_0 端口的输入模式。

0:上拉/下拉(需要结合 P2INP 联合配置)。

1:三态。

P1INP 端口输入配置寄存器 

位 位名称 复位值操作 描述
7:2  MDP1[7:2]0x00R/W

设置 P1_7 到 P1_2 端口的输入模式。

0:上拉/下拉(需要结合 P2INP 联合配置)。

1:三态。

1:0-00R0不使用

P2INP 端口输入配置寄存器

位 位名称 复位值操作 描述
7PDUP2 0R/W 

P2 端口所有引脚选择上拉或下拉。

0:上拉。                            1:下拉。

6PDUP10R/W 

P1 端口所有引脚选择上拉或下拉。

0:上拉。                            1:下拉。

5PDUP0 0R/W 

P0 端口所有引脚选择上拉或下拉。

0:上拉。                            1:下拉。

4:0MDP2_[4:0] 0x00R/W 

设置 P2_4 到 P2_0 端口的输入模式。

0:上拉/下拉。                   1:三态。

        我们若想检测引脚的高低电平,需将其PxSEL端口功能寄存器设置成通用 I/O 功能,和将PxDIR 端口方向寄存器设置成输入,以及将对应的引脚设置成上下拉模式,最后根据电路图将其设置为上拉或者下拉

当电路为IO接GND时候,则为设置为上拉输入,提供默认电平为高电平。下降沿触发。

当电路为IO接VCC时候,则为设置为下拉输入,提供默认电平为低电平。上升沿触发。

  P0SEL &= ~0x02;//将 P0_1 设置成通用I/O
  P0DIR &= ~0x02;//将 P0_1 设置成输入方向
  P0INP &= ~0x02;//将 P0_1 设置成上拉/下拉
  P2INP &= ~0x20;//将 P0端口 设置成上拉
  
  P1SEL &= ~0x04;//将 P1_2 设置成通用I/O
  P1DIR &= ~0x04;//将 P1_2 设置成输入方向
  P1INP &= ~0x04;//将 P1_2 设置成上拉/下拉
  P2INP &= ~0x40;//将 P2端口 设置成上拉

按钮抖动原理及处理方法 

        机械按钮的触点闭合断开时,都会产生抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理。按键的抖动对于人类来说是感觉不到的,但对单片机来说,则是完全可以感应到的,而且还是一个很“漫长”的过程,因为单片机处理的速度在“微秒”级,而按键抖动的时间至少在“毫秒”级。

        如果在触点抖动期间检测按键的通断状态,则可能导致判断出错,即按键一次按下或释放被错误地认为是多次操作,从而引起误处理。因此,为了确保单片机对一次按键动作只作一次响应,就必须考虑如何消除按键抖动的影响。

        在处理按键抖动的程序中,必须同时考虑消除闭合和断开两种情况下的抖动。所以,对于按键消抖的处理,必须按最差的情况来考虑。机械式按键的抖动次数、抖动时间、抖动波形都是随机的。不同类型的按键其最长抖动时间也有差别,抖动时间的长短和按键的机械特性有关,按键输出的信号的跳变时间(上升沿和下降沿)最大是在20ms左右。按键一次闭合最短的时间大概是120ms。按键消抖的关键是提取稳定的低电平(或高电平)状态,滤除按键稳定前后的抖动脉冲。 

消抖是为了避免在按键按下或是抬起时电平剧烈抖动带来的影响。按键的消抖,可用硬件软件两种方法。

硬件消抖

在键数较少时可用硬件方法消除键抖动。硬件消抖的典型做法是:采用R-S触发器或RC积分电路。

1. 双稳态消抖

双稳态消抖即在按键输出端加R-S触发器或单稳态触发器构成消抖电路,如图所示,触发器一旦翻转,触点抖动对其不会产生任何影响。

2. 滤波消抖

如图所示,利用RC积分电路可以吸收振荡脉冲的特点,正确选取适当的时间常数,便可消除按键抖动的影响。

软件消抖

        当按键较多时,硬件方法将导致系统硬件电路设计复杂化,硬件消抖将无法胜任,这时常采用软件方法进行消抖。常用软件方法去抖,即检测出引脚触发沿后执行一个延时程序,5ms~10ms的延时,让前沿抖动消失后再一次检测引脚的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。

软件消抖的基本原理是:在检测到有按键按下时,不是立即认定此键已被按下,而是执行一个10ms左右(具体时间应视所使用的按键进行调整)的延时程序后,再确认该键电平是否仍然保持闭合状态电平,若仍然保持,则确认该键真正被按下。

对于我们而言,当单片机的电路已经确定切不具备有硬件消抖的情况下,我们都采用软件消抖。

    if(判断按钮是否是被按下的电平状态)
    {
      延时10ms
      if(判断按钮是否是被按下的电平状态)
      {
        while(判断按钮是否还保持被按下的电平状态);
        延时10ms
        /*
          按钮触发处理事件
        */
      }
    }

看到这我想您已经掌握了基本的去抖思想,接下来让我们编写代码来实现通过按钮来逐渐点亮或者熄灭led灯。

完整代码(注释在下方,我就不过多的赘述了):

#include <iocc2530.h>

void led_init()
{
  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_3、P1_4 置0
}

void Delay(int t)//延时函数
{
  for(int i=0;i<t;i++)
  {
    for(int j=0;j<521;j++);
  }
}

#define SW1 P1_2//SW1引脚映射
#define SW2 P0_1//SW2引脚映射
int led = 0;//标志位
char led_gpio[] = {0x01,0x02,0x08,0x10};
/*
0x01:P1_0灯
0x02:P1_1灯
0x80:P1_3灯
0x10:P1_4灯
*/

void key_init()
{
  P0SEL &= ~0x02;//将 P0_1 设置成通用I/O
  P0DIR &= ~0x02;//将 P0_1 设置成输入方向
  P0INP &= ~0x02;//将 P0_1 设置成上拉/下拉
  P2INP &= ~0x20;//将 P0端口 设置成上拉
  
  P1SEL &= ~0x04;//将 P1_2 设置成通用I/O
  P1DIR &= ~0x04;//将 P1_2 设置成输入方向
  P1INP &= ~0x04;//将 P1_2 设置成上拉/下拉
  P2INP &= ~0x40;//将 P2端口 设置成上拉
}

int main()
{
  led_init();//LED灯引脚初始化
  key_init();//按键引脚初始化
  while(1)
  {
    if(SW1==0)//判断按钮是否是被按下的电平状态
    {
      Delay(10);//延时一段时间
      if(SW1==0)//判断按钮是否是被按下的电平状态
      {
        while(SW1==0);//等待按钮松开
        Delay(10);//延时一段时间
        if(led<4)
        {
          led++;
          P1 |= led_gpio[led-1];//将对应的引脚置1
        }
      }
    }
    
    if(SW2==0)//判断按钮是否是被按下的电平状态
    {
      Delay(10);//延时一段时间
      if(SW2==0)//判断按钮是否是被按下的电平状态
      {
        while(SW2==0);//等待按钮松开
        Delay(10);//延时一段时间
        if(led>0)
        {
          led--;
          P1 &= ~led_gpio[led];//将对应的引脚置0
        }
      }
    }
  }
}

效果视频:

按钮控制led

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曦&渊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值