【蓝牙低功耗BLE】按键的使用
隔了这么久才来写这篇,HW加班太多。没办法。
1、硬件电路图
本节实验非常easy,按下S1,让LED1亮起来,再按下S1,让LED1灭掉,是不是非常easy啊。
首先要做的是识别按键被按下,能够看到按键弹起来的时候P0.0经过一个R10电阻接到3.3V上,也就是P0.0引脚是高电平,按键按下的时候P0.0直接连到GND上。当然是低电平0了,所以仅仅要当P0.0的电平状态从高跳变到低的时候就是按键被按下了,这个时候仅仅要去改变P1.0来控制LED1亮灭就可以,非常easy吧。
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 <ioCC2540.h> #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; } } }