本篇博文最后改动时间:2017年01月06日,11:06。



一、简单介绍

本文以SimpleBLEPeripheral为例。介绍怎样将普通IO口(P12)自己定义为按键。

注:本文加入按键方法不与协议栈的按键相冲突,协议栈自带的按键仍可正常使用。

二、实验平台

协议栈版本号:BLE-CC254x-1.4.0

编译软件:IAR 8.20.2

硬件平台:Smart RF(主芯片CC2541)



、版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

原文地址:http://blog.csdn.NET/feilusia

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

四、实验前提
1、在进行本文步骤前,请先阅读下面博文:
暂无

2、在进行本文步骤前,请先实现下面博文:
暂无

五、基础知识

暂无

六、实验步骤

1、编写并加入自己定义的按键驱动

1)写一个按键驱动Key.C(存放在“……\BLE-CC254x-1.4.0\Projects\ble\SimpleBLEPeripheral\Source\GUA”路径下)

//******************************************************************************
//name: Key.c
//introduce: 按键驱动
//author: 甜甜的大香瓜
//changetime: 2016.04.14
//email: 897503845@qq.com
//******************************************************************************
#include <ioCC2540.h>
#include "Key.h" /*********************宏定义************************/
//注冊时使用的宏
#define NO_TASK_ID 0xFF //没有注冊时的任务id
#define NO_EVEN_ID 0x0000 //没有注冊时的事件id //中断消抖时使用的宏
#define KEY_DEBOUNCE_VALUE 20 //消抖时间20ms #ifndef false
#define false 0
#endif #ifndef true
#define true 1
#endif typedef signed char int8; //!< Signed 8 bit integer
typedef unsigned char uint8; //!< Unsigned 8 bit integer typedef signed short int16; //!< Signed 16 bit integer
typedef unsigned short uint16; //!< Unsigned 16 bit integer typedef signed long int32; //!< Signed 32 bit integer
typedef unsigned long uint32; //!< Unsigned 32 bit integer /*********************内部变量************************/
static U8 registeredKeyTaskID = NO_TASK_ID;
static U16 registeredKeyEvenID = NO_EVEN_ID; /*********************函数声明************************/
extern uint8 osal_start_timerEx( uint8 task_id, uint16 event_id, uint32 timeout_value ); //******************************************************************************
//name: Key_Init
//introduce: 按键初始化
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//changetime: 2016.04.14
//******************************************************************************
void Key_Init(void)
{
P1SEL &= ~(1 << 2); //P12设置为IO口
P1DIR &= ~(1 << 2); //P12设置为输入
P1INP &= ~(1 << 2); //P1上拉下拉模式
P2INP &= ~(1 << 6); //P1上拉
P1_2 = 1; //P12拉高 P1IFG &= ~(1 << 2); //初始化P12中断标志位
PICTL |= (1 << 1); //下降沿触发
P1IEN |= (1 << 2); //使能P12中断
IEN2 |= (1 << 4); //同意P1口中断;
} //******************************************************************************
//name: RegisterForKey
//introduce: 注冊任务号、处理事件号
//parameter: task_id:任务id
// even_id:事件id
//return: true:注冊成功
// flase:注冊不成功
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//changetime: 2016.04.14
//******************************************************************************
U8 RegisterForKey(U8 task_id, U16 even_id)
{
// Allow only the first task
if ( registeredKeyTaskID == NO_TASK_ID )
{
registeredKeyTaskID = task_id;
}
else
return ( false ); // Allow only the first even
if ( registeredKeyEvenID == NO_EVEN_ID )
{
registeredKeyEvenID = even_id;
}
else
return ( false ); return ( true );
} //******************************************************************************
//name: Key_Check_Pin
//introduce: 按键检測高低电平状态
//parameter: none
//return: KEY_LOOSEN:此时无按键按下
// KEY_PRESS:此时按键按下
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//changetime: 2016.04.14
//******************************************************************************
U8 Key_Check_Pin(void)
{
if(P1 & (1 << 2))
{
return KEY_LOOSEN;
}
else
{
return KEY_PRESS;
}
} //******************************************************************************
//name: P1_ISR
//introduce: P1的中断入口
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//changetime: 2016.04.14
//******************************************************************************
#pragma vector = P1INT_VECTOR
__interrupt void P1_ISR(void)
{
if(Key_Check_Pin() == KEY_PRESS)
{
osal_start_timerEx(registeredKeyTaskID, registeredKeyEvenID, KEY_DEBOUNCE_VALUE);
}
P1IFG = 0; //清中断标志
P1IF = 0; //清中断标志
}

2)写一个按键头文件Key.h(存放在“……\BLE-CC254x-1.4.0\Projects\ble\SimpleBLEPeripheral\Source\GUA”路径下)

//******************************************************************************
//name: Key.h
//introduce: 按键驱动的头文件
//author: 甜甜的大香瓜
//changetime: 2016.04.14
//email: 897503845@qq.com
//******************************************************************************
#ifndef KEY_H
#define KEY_H /*********************宏定义************************/
#ifndef U8
typedef unsigned char U8;
#endif #ifndef U16
typedef unsigned short U16;
#endif //检測io口状态时使用的宏
#define KEY_LOOSEN 0x01
#define KEY_PRESS 0x00 /*********************函数声明************************/
extern void Key_Init(void);
extern U8 RegisterForKey(U8 task_id, U16 even_id);
extern U8 Key_Check_Pin(void); #endif

3)project中加入Key.c和Key.h

4)在IAR设置中加入按键驱动源文件路径

$PROJ_DIR$\..\..\SimpleBLEPeripheral\Source\GUA

2、定义一个按键事件

1)定义一个按键事件(SimpleBLEPeripheral.c的SimpleBLEPeripheral_ProcessEvent中)

  //按键检測处理事件
if ( events & SBP_KEY_CHECK_PROCESS_EVT )
{
//防止抖动。确定是按键
if(Key_Check_Pin() == KEY_PRESS)
{
//按键处理函数
GUA_Key_Process();
} return (events ^ SBP_KEY_CHECK_PROCESS_EVT);
}

2)定义一个按键事件的宏(SimpleBLEPeripheral.h中)

#define SBP_KEY_CHECK_PROCESS_EVT       0x1000  //按键检測处理事件

3、定义并声明一个按键处理函数(SimpleBLEPeripheral.c中)

1)定义一个按键处理函数(SimpleBLEPeripheral.c中

//******************************************************************************
//name: GUA_Key_Process
//introduce: 按键处理函数
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//changetime: 2016.04.14
//******************************************************************************
static void GUA_Key_Process(void)
{
//test
P1SEL &= ~(1 << 0); //设置为IO口
P1DIR |= (1 << 0); //设置为输出
P1_0 = ~P1_0; //这里測试按一次按键,就取反一次P1_0,方便观察P1_0相应的led
//test
}

2)声明一个按键处理函数(SimpleBLEPeripheral.c中

static void GUA_Key_Process(void);     //按键处理函数

4、在应用层中使用按键

1)按键初始化(SimpleBLEPeripheral.c的SimpleBLEPeripheral_Init中)

  //按键初始化
Key_Init();
RegisterForKey(simpleBLEPeripheral_TaskID, SBP_KEY_CHECK_PROCESS_EVT);

2)应用层代码中加入按键驱动头文件(SimpleBLEPeripheral.c中)

//GUA
#include "Key.h"
//GUA

七、注意事项

暂无



八、实验结果

手头没有按键。因此拿一根跳线,一端接在GND。还有一端不停地触碰P12引脚。则会发现P10相应的LED1会随着触碰不停地亮灭。

因此实验成功,实现P12按键触发P10的led亮灭。

【BLE】CC2541之自己定义按键的更多相关文章

  1. 【BLE】CC2541之自己定义长短按键

    本篇博文最后改动时间:2017年01月06日,11:06. 一.简单介绍 本文以SimpleBLEPeripheral为例,介绍怎样将普通IO口(P12)自己定义为长短按键,实现按键3S以内松开为短按 ...

  2. TI BLE CC2541的I2C主模式

    由于要写TM1680, 写命令跟写数据, 所以需要使用CC2541的I2C, 2541是有硬件I2C的. tm1680.c: #include "tm1680.h" //TM168 ...

  3. BLE CC2541 串口BootLoader 即 SBL BootLoader 资料 收集

    1.[CC254X_Bootloader]SBL(串口Bootloader)使用说明 2.CC2540协议栈高速串口通信解决(UART的DMA方式) 3.[BLE]CC2541之SBL 4.[BLE] ...

  4. TI BLE CC2541的通讯协议.

    包类型: 01命令/02数据/03应答消息 开始标志FF/本数据包长度(注意是16进制)/校验码/包ID/包类型01: 表示是命令/01表示下面要开始传输/03字符串编号/字符串长度/结束位FEFF  ...

  5. TI BLE CC2541的SPI主模式

    SPI就是用4条线来串行传输数据, 2541只能用模拟的方式用GPIO来做. //*********************************************************** ...

  6. 微信蓝牙BLE接入调试指引 硬件篇

    1 平台框架简介 微信蓝牙BLE由三个模块组成,分别是蓝牙设备.微信和第三方服务器,如下图: 蓝牙设备与微信之间的通信是通过蓝牙GATT协议进行. 微信与第三方服器之间的通信是通过网络http 接口进 ...

  7. CC2540开发板学习笔记(二)——按键

    一.实验内容 用按键S1控制LED1的亮和灭 二.实验过程 1.电路原理: 可以看出,当S按下P0.0和P0.1接地,反之则接高电压. 2.寄存器使用: 依旧应该首先进行3个基本寄存器的设定,对LED ...

  8. Android 增加(键盘)按键

    以添加 camera按键为例(红色是需要添加的) 一.kernel键值定义 (1)键扫描码 ScanCode是由linux的Input驱动框架定义的整数类型,可参考input.h头文件,即geteve ...

  9. 基于ARM-contexA9按键驱动开发

    之前我们写过LED和蜂鸣器的驱动,其实那两个都是一个模版的,因为都是将IO口配置成输出模式,然后用高低电平来驱动这些设备.其实linux设备驱动,说白了跟单片机开发的方式是差不多的,只不过内核的开发基 ...

随机推荐

  1. react中对props.children进行操作

    之前写的更多的时候是直接使用简写 {props.children} 这样就可以了,但是当有时候需要对传入的子组件进行一些操作的时候需要用到React.Children方法 {React.Childre ...

  2. hihocoder #1415 : 后缀数组三·重复旋律3

    #1415 : 后缀数组三·重复旋律3 Time Limit:5000ms Case Time Limit:1000ms Memory Limit:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢 ...

  3. [CODEVS1130]数字反转

    题目描述 Description 给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零. 这是一道水题.我必须 ...

  4. C++ 找不到方法标识符

    其实原因是这个CPP并没有面向对象的结构. 所以进行编译时是“顺序编译”的,而main函数的定义又在A的定义之前.自然找不到标识符了.

  5. 洛谷 P1865 A % B Problem[筛素数/前缀和思想/区间质数个数]

    题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m 接下来n行,每行两个整数 l,r 表示区间 输出格式: 对于每次询问输出个数 t,如l或r∉[1,m]输出 Cros ...

  6. centos7.3 开放端口 防火墙端口

    1. 查看已打开的端口 # netstat -anp 2. 查看想开的端口是否已开 # firewall-cmd --query-port=666/tcp 若此提示 FirewallD is not ...

  7. Linux基础学习3

    鸟哥私房菜第十一章   read 用来读取键盘输入的变量,常被用在shell script的交互当中 [root@www ~]# read [-pt] variable 选项不参数: -p :后面可以 ...

  8. 【spring cloud】对接口调用者提供API使用的安全验证微服务【这里仅通过代码展示一种设计思想】【后续可以加入redis限流的功能,某段时间某个IP可以访问API几次】

    场景: 公司的微服务集群,有些API 会对外提供接口,供其他厂商进行调用.这些公开的API接口,由一个OpenAPI微服务统一提供给大家. 那么所有的调用者在调用公开API接口的时候,需要验证是否有权 ...

  9. 【jsp】jsp访问到之后报错如下:Uncaught SyntaxError: Unexpected token <

    jsp访问到之后报错如下: Uncaught SyntaxError: Unexpected token < 问题出在哪里: 发现把这个注销掉,就不会出现这个问题了,那script引用js文件哪 ...

  10. Unity -- 使用easyAR的基础教程

    “三人行,必有我师焉”,抱着共同学习进步的态度,和大家一起交流下EasyAR的用法.有不足的地方,欢迎指出!大家都知道,今年的QQ,支付宝,都用到了AR的技术,扫描一张图片,就会出现虚拟模型,及其想要 ...