【蓝牙低功耗BLE】按键的使用

隔了这么久才来写这篇,HW加班太多,没办法。

1、硬件电路图



本节实验很简单,按下S1,让LED1亮起来,再按下S1,让LED1灭掉,是不是很简单啊。

首先要做的是识别按键被按下,可以看到按键弹起来的时候P0.0经过一个R10电阻接到3.3V上,也就是P0.0引脚是高电平,按键按下的时候P0.0直接连到GND上,当然是低电平0了,所以只要当P0.0的电平状态从高跳变到低的时候就是按键被按下了,这个时候只要去改变P1.0来控制LED1亮灭即可,很简单吧。

2、相关寄存器

P0SEL      P0[7:0]功能设置寄存器,默认设置为普通I/O口
P0INP P0[7:0]作为输入口时电路模式寄存器,可以设置为输入上下拉等
P0 P0[7:0]可以位寻址的I/O寄存器
P0DIR P0口输入输出设置寄存器

3、代码实现

定义按键口,然后是LED和按键的初始化,P1.0和P1.1设置为输出,P0.0和P0.1设置输入

#define CODE_KEY1   0x01
#define CODE_KEY2   0x02

void InitLed()
{
  P1DIR |= 0x03;
  LED1 = 0;
  LED2 = 0;
}

void InitKey()
{
  P0SEL &= ~0x03;
  P0DIR &= ~0x03;
  P0INP &= ~0x03;
}

扫描按键,读取键值

uchar KeyScan()
{
  uchar code = 0x00;;
  if(KEY1 == 0) {
    Delayms(10);
    if(KEY1 == 0) {
      while(!KEY1);
      code |= CODE_KEY1;
    }
  } else if(KEY2 == 0) {
    Delayms(10);
    if(KEY2 == 0) {
      while(!KEY2);
      code |= CODE_KEY2;
    }
  }
  
  return code;
}

下面是全部代码,仅供参考。

#include 
#define uint unsigned int
#define uchar unsigned char

#define LED1  P1_0
#define LED2  P1_1
#define KEY1  P0_0
#define KEY2  P0_1

#define CODE_KEY_NONE 0
#define CODE_KEY1   0x01
#define CODE_KEY2   0x02

void Delayms(uint);
void InitLed(void);
void InitKey();
uchar KeyScan();

void Delayms(uint ms)
{
  uint i, j;
  for(i = ms; i > 0; i--)
    for(j = 587; j > 0; j--);
}

void InitLed()
{
  P1DIR |= 0x03;
  LED1 = 0;
  LED2 = 0;
}

void InitKey()
{
  P0SEL &= ~0x03;
  P0DIR &= ~0x03;
  P0INP &= ~0x03;
}

uchar KeyScan()
{
  uchar code = 0x00;;
  if(KEY1 == 0) {
    Delayms(10);
    if(KEY1 == 0) {
      while(!KEY1);
      code |= CODE_KEY1;
    }
  } else if(KEY2 == 0) {
    Delayms(10);
    if(KEY2 == 0) {
      while(!KEY2);
      code |= CODE_KEY2;
    }
  }
  
  return code;
}

void main(void)
{
  uchar code;
  InitLed();
  InitKey();
  while(1) {
    code = KeyScan();
    if(code & CODE_KEY1) {
      LED1 = !LED1;
    } else if(code & CODE_KEY2) {
      LED2 = !LED2;
    }
  }
}


好了,这节就这样,下面继续。

你可能感兴趣的:(BLE,蓝牙,单片机,硬件)