微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > 玩转蓝牙4.0系列教程(第一季)-第五课 CC2540的按键的使用

玩转蓝牙4.0系列教程(第一季)-第五课 CC2540的按键的使用

时间:10-02 整理:3721RD 点击:

第五课 CC2540的按键的使用

  

   下面我们对CC2540按键使用进行介绍,大家都知道按键操作一般都是用延时去抖法进行,读取键值根据所得到的键值去执行不同的任务。为了增加实时性,还可以引脚中断方法去做,但是这个方法虽说可以增强实时性,但是对于引脚上的误动作要求很高,这就得要求我们硬件上去抖。

首先为大家介绍按键第一种方法,当我按下第一个按键时,第一个小灯亮,再按一次时第一个小灯灭,第二个小灯亮,再按一下第三个小灯亮,第二个小灯灭,如此反复进行。

按键电路为:



我们采用上拉输入的方式,其实有的单片机可以寄存器配置成输入上拉,为了增加抗干扰建议还是在外面增加上拉电阻。

首先配置一下P1_2为上拉输入引脚

  P1SEL &= ~0X04;    //设置P1_2为普通IO口  

  P1DIR &= ~0X04;    //按键在P1_2 口,设置为输入模式

  P1INP &= ~0x04;    //配置P1_2为输入模式

  P2INP &= ~0x40;   //p配置P1_2为上拉输入












源程序为:有两种一种为while(!SWITCH1);一直在等待,一种是采用查询状态为操作;自我感觉后一种好不影响其它程序;尤其是任务数多的时候

/**************************************************

** 本程序只供学习使用,未经作者许可,不得用于其它任何用途

** 蓝牙4.0底板开发板

** 作者: shizhe

** 创始时间:2014-05-08

** 修改人:shizhe

** 修改时间:2014-05-08

** 修改人:shizhe

** 修改时间:2014-05-08

** 描述:  

**  按键功能操作查询…

** 版权所有,盗版必究。

** Copyright(C) 联控智能 2014-2020

** All rights reserved

*************************************************/


#include<ioCC2540.h>


#define uint unsigned int

#define uchar unsigned char

#define LED1    P0_5

#define LED2    P1_0

#define LED3    P1_1

#define SWITCH1 P1_2


uchar ch;

uchar sw_back;

/****************************

延时函数

*****************************/

void Delayms(uint xms)   //i=xms

{

  uint i,j;

  for(i=xms;i>0;i--)

    for(j=600;j>0;j--);

}

/****************************

      LED初始化函数

*****************************/

void InitLed(void)

{

  P1SEL &= ~0x03;  //P1_0,P1_1定为普通IO口

  P1DIR |= 0x03;  //P1_0,P1_1定义为输出

  P0SEL &= ~0x20;  //P0_5定为普通IO口

  P0DIR |= 0x20;  //P0_5定义为输出

  LED1 = 0;       //LED1灯熄灭   

  LED2 = 0;       //LED2灯熄灭   

  LED3 = 0;       //LED3灯熄灭

}


/****************************

     按键初始化函数

*****************************/

void InitKey()

{

  P1SEL &= ~0X04;    //设置P1_2为普通IO口  

  P1DIR &= ~0X04;    //按键在P1_2 口,设置为输入模式

  P1INP &= ~0x04;    //配置P1_2为输入模式

  P2INP &= ~0x40;   //p配置P1_2为上拉输入

}


void main()

{

   InitLed();

   InitKey();

   while(1)

   {

     if(sw_back != 0x00){ //状态位判断按键松开操作

     if(SWITCH1 == 0x00){

       Delayms(100);

       if(SWITCH1 == 0x00){

         sw_back =  0x00;

          ch++;

          if(ch > 3) ch = 1;

       }

      // while(!SWITCH1);  //死循环在等待按键松开

      }

     }

     if(SWITCH1) sw_back =  0x01; //状态位判断按键松开操作

     switch(ch)                  //switch 选择语句

     {

     case 0x01:

             LED1 = 1;       //LED1灯熄灭   

             LED2 = 0;       //LED2灯熄灭   

             LED3 = 0;       //LED3灯熄灭

       break;

     case 0x02:

             LED1 = 0;       //LED1灯熄灭   

             LED2 = 1;       //LED2灯熄灭   

             LED3 = 0;       //LED3灯熄灭

       break;

     case 0x03:

             LED1 = 0;       //LED1灯熄灭   

             LED2 = 0;       //LED2灯熄灭   

             LED3 = 1;       //LED3灯熄灭

       break;

     default:

       break;

     }

   }

}


下面我为大家介绍另一种控制按键的方法,引脚边沿中断方法;首先得配置引脚中断寄存器;

看下面配置:


  P1IEN |= 0X04;  //P1_2 设置为中断方式

  PICTL &=~ 0X02; // 下降沿触发   

  IEN2 |= 0X10;   // 允许P1_2口中断;

  P1IFG = 0x00;   // 初始化中断标志位

  EA = 1;












源程序如下:

/**************************************************

** 本程序只供学习使用,未经作者许可,不得用于其它任何用途

** 蓝牙4.0底板开发板

** 作者: shizhe

** 创始时间:2014-05-08

** 修改人:shizhe

** 修改时间:2014-05-08

** 修改人:shizhe

** 修改时间:2014-05-08

** 描述:  

**  按键功能操作引脚中断…

** 版权所有,盗版必究。

** Copyright(C) 联控智能 2014-2020

** All rights reserved

*************************************************/


#include<ioCC2540.h>


#define uint unsigned int

#define uchar unsigned char

#define LED1    P0_5

#define LED2    P1_0

#define LED3    P1_1

#define SWITCH1 P1_2


uchar ch;

void delay(unsigned int i)

{

   unsigned int j;

   for(j=0;j<i;j++){

   }

}

/****************************

      LED初始化函数

*****************************/

void InitLed(void)

{

  P1SEL &= ~0x03;  //P1_0,P1_1定为普通IO口

  P1DIR |= 0x03;  //P1_0,P1_1定义为输出

  P0SEL &= ~0x20;  //P0_5定为普通IO口

  P0DIR |= 0x20;  //P0_5定义为输出

  LED1 = 0;       //LED1灯熄灭   

  LED2 = 0;       //LED2灯熄灭   

  LED3 = 0;       //LED3灯熄灭

}


/****************************

     按键初始化函数

*****************************/

void InitKey()

{

  P1IEN |= 0X04;  //P1_2 设置为中断方式

  PICTL &=~ 0X02; // 下降沿触发   

  IEN2 |= 0X10;   // 允许P1_2口中断;

  P1IFG = 0x00;   // 初始化中断标志位

  EA = 1;

}


void main()

{

   InitLed();

   InitKey();

   while(1)

   {

     switch(ch)

     {

     case 0x01:

             LED1 = 1;       //LED1灯熄灭   

             LED2 = 0;       //LED2灯熄灭   

             LED3 = 0;       //LED3灯熄灭

       break;

     case 0x02:

             LED1 = 0;       //LED1灯熄灭   

             LED2 = 1;       //LED2灯熄灭   

             LED3 = 0;       //LED3灯熄灭

       break;

     case 0x03:

             LED1 = 0;       //LED1灯熄灭   

             LED2 = 0;       //LED2灯熄灭   

             LED3 = 1;       //LED3灯熄灭

       break;

     default:

       break;

     }

   }

}

/****************************

      中断处理函数

*****************************/

#pragma vector = P1INT_VECTOR    //格式:#pragma vector = 中断向量,紧接着是中断处理程序

  __interrupt void P1_ISR(void)

{


    ch++;

    if(ch > 3) ch = 1;


    P1IFG = 0;             //清中断标志

    P1IF = 0;             //清中断标志

}


按键就介绍到这里,在一个项目,甚至一个小产品中,按键是很重要的角色;如何把按键做的很稳定,实时性高是一门学问,其实还有一种方法,利用定时器中断时间去去抖,既不影响系统实时性,也能起到抗干扰作用,一举两得,这就作为课后练习了。至于组合按键和4*4键盘,程序我会在后面项目中体现,谢谢!



Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top