在TMOS系统中添加按键检测功能
TMOS系统中自带有按键检测轮询功能,默认100ms检测一次,在debug时很有帮助。不过在需要低功耗休眠的前提下,检测按键需要频繁唤醒,影响功耗,故多数BLE的工程都没有用到这个功能。代码贴在了最后。
启用按键查询,先要在工程配置中添加HAL_KEY,以及确保KEY.c添加进编译。
然后添加按键处理函数,函数名自拟,但是形参须为(uint8_t keys),调用HalKeyConfig函数注册一下。
这样默认代码中配置好了PB22和PB4两个按键,如上图添加,评估板上用PB4作为按键,就已经可以跑起来。如果需要更多按键,可以如下图添加处理,下图中添加到了总计5个按键,可以添加B组引脚,也可以添加A组引脚。
在KEY.c中需要做如下修改。
在KEY.h中需要做如下修改。
打印如下,支持同时检测多个按键按下。
/*KEY.c中的修改后代码*/ /**************************************************************************************************
* @fn HAL_KeyInit
*
* @brief Initilize Key Service
*
* @param none
*
* @return None
**************************************************************************************************/
void HAL_KeyInit(void)
{
/* Initialize previous key to 0 */
halKeySavedKeys = 0;
/* Initialize callback function */
pHalKeyProcessFunction = NULL;
KEY1_DIR;
KEY1_PU;
KEY2_DIR;
KEY2_PU;
KEY3_DIR; //JW
KEY3_PU;
KEY4_DIR; //JW
KEY4_PU;
KEY5_DIR; //JW
KEY5_PU;
} /**************************************************************************************************
* @fn HalKeyConfig
*
* @brief Configure the Key serivce
*
* @param cback - pointer to the CallBack function
*
* @return None
**************************************************************************************************/
void HalKeyConfig(halKeyCBack_t cback)
{
/* Register the callback fucntion */
pHalKeyProcessFunction = cback;
tmos_start_task(halTaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE); /* Kick off polling */
} /**************************************************************************************************
* @fn HalKeyRead
*
* @brief Read the current value of a key
*
* @param None
*
* @return keys - current keys status
**************************************************************************************************/
uint8_t HalKeyRead(void)
{
uint8_t keys = 0; if(HAL_PUSH_BUTTON1())
{ //读按键1
keys |= HAL_KEY_SW_1;
}
if(HAL_PUSH_BUTTON2())
{ //读按键2
keys |= HAL_KEY_SW_2;
}
if(HAL_PUSH_BUTTON3())
{ //读按键3
keys |= HAL_KEY_SW_3;
}
if(HAL_PUSH_BUTTON4())
{ //读按键4
keys |= HAL_KEY_SW_4;
}
if(HAL_PUSH_BUTTON5()) //JW
{ //读按键5
keys |= HAL_KEY_SW_5;
}
return keys;
} /**************************************************************************************************
* @fn HAL_KeyPoll
*
* @brief Called by hal_driver to poll the keys
*
* @param None
*
* @return None
**************************************************************************************************/
void HAL_KeyPoll(void)
{
uint8_t keys = 0;
if(HAL_PUSH_BUTTON1())
{
keys |= HAL_KEY_SW_1;
}
if(HAL_PUSH_BUTTON2())
{
keys |= HAL_KEY_SW_2;
}
if(HAL_PUSH_BUTTON3())
{
keys |= HAL_KEY_SW_3;
}
if(HAL_PUSH_BUTTON4())
{
keys |= HAL_KEY_SW_4;
}
if(HAL_PUSH_BUTTON5()) //JW
{
keys |= HAL_KEY_SW_5;
}
if(keys == halKeySavedKeys)
{ /* Exit - since no keys have changed */
return;
}
halKeySavedKeys = keys; /* Store the current keys for comparation next time */
/* Invoke Callback if new keys were depressed */
if(keys && (pHalKeyProcessFunction))
{
(pHalKeyProcessFunction)(keys);
}
}
/*KEY.h中的修改后代码*/ /**************************************************************************************************
* MACROS
**************************************************************************************************/
#define HAL_KEY_POLLING_VALUE 100 /* Switches (keys) */
#define HAL_KEY_SW_1 0x01 // key1
#define HAL_KEY_SW_2 0x02 // key2
#define HAL_KEY_SW_3 0x04 // key3
#define HAL_KEY_SW_4 0x08 // key4
#define HAL_KEY_SW_5 0x10 // key5 //JW /* 按键定义 */ /* 1 - KEY */
#define KEY1_BV BV(22)
#define KEY2_BV BV(4)
#define KEY3_BV BV(8) //JW
#define KEY4_AV (1 << 10) //JW
#define KEY5_AV (1 << 15) //JW #define KEY1_PU (R32_PB_PU |= KEY1_BV)
#define KEY2_PU (R32_PB_PU |= KEY2_BV)
#define KEY3_PU (R32_PB_PU |= KEY3_BV) //JW
#define KEY4_PU (R32_PA_PU |= KEY4_AV) //JW
#define KEY5_PU (R32_PA_PU |= KEY5_AV) //JW #define KEY1_DIR (R32_PB_DIR &= ~KEY1_BV)
#define KEY2_DIR (R32_PB_DIR &= ~KEY2_BV)
#define KEY3_DIR (R32_PB_DIR &= ~KEY3_BV) //JW
#define KEY4_DIR (R32_PA_DIR &= ~KEY4_AV) //JW
#define KEY5_DIR (R32_PA_DIR &= ~KEY5_AV) //JW #define KEY1_IN (ACTIVE_LOW(R32_PB_PIN & KEY1_BV))
#define KEY2_IN (ACTIVE_LOW(R32_PB_PIN & KEY2_BV))
#define KEY3_IN (ACTIVE_LOW(R32_PB_PIN & KEY3_BV)) //JW
#define KEY4_IN (ACTIVE_LOW(R32_PA_PIN & KEY4_AV)) //JW
#define KEY5_IN (ACTIVE_LOW(R32_PA_PIN & KEY5_AV)) //JW #define HAL_PUSH_BUTTON1() (KEY1_IN) //添加自定义按键
#define HAL_PUSH_BUTTON2() (KEY2_IN)
#define HAL_PUSH_BUTTON3() (KEY3_IN) //JW
#define HAL_PUSH_BUTTON4() (KEY4_IN) //JW
#define HAL_PUSH_BUTTON5() (KEY5_IN) //JW
在TMOS系统中添加按键检测功能的更多相关文章
- Android系统中自定义按键的短按、双击、长按事件
在项目中碰到这样的问题: 由于系统中的按键在底层做了重新定义或者新增了按键,此时需要在APP层对按键事件(keyevent)做分解处理,模拟Android系统做法,把keyevent分解成: 1.单击 ...
- 在WordPress后台菜单系统中添加Home链接
在wordpress后台如果想打开前台的话,要想先把鼠标移动到左上角菜单,然后在下拉菜单中点击“查看站点”,很是麻烦,能不能在 WordPress 后台菜单系统中添加 Home 链接呢? 将下面代码复 ...
- Web开发从零单排之二:在自制电子请帖中添加留言板功能,SAE+PHP+MySql
在上一篇博客中介绍怎样在SAE平台搭建一个html5的电子请帖网站,收到很多反馈,也有很多人送上婚礼的祝福,十分感谢! web开发从零学起,记录自己学习过程,各种前端大神们可以绕道不要围观啦 大婚将至 ...
- 自己动手在win2003系统中添加虚拟网卡
运用虚拟网卡我们可以更好地使用我们的网络,那么在win2003中该怎么操作呢?下面就为大家介绍下具体的步骤 虚拟网卡是用软件来实现虚拟的网卡,通过运用虚拟网卡我们可以更好地使用我们的网络.但是虚拟 ...
- OAF在打开的新页面中添加按钮,功能是关闭当前页面
OAF在打开的新页面中添加按钮,功能是关闭当前页面 javascript:close()
- 一个新人如何学习在大型系统中添加新功能和Debug
文章背景: 今年七月份正式入职,公司主营ERP软件,楼主所在的组主要负责二次开发,使用的语言是Java. 什么叫二次开发呢?ERP软件的客户都是企业.而这些企业之间的情况都有所不同,一套标准版本的企业 ...
- 用crontab、crond在嵌入式系统中添加定时任务
在嵌入式系统中,定时任务通过crond和cronttab两个系统命令来联合执行. 其中crond是定时任务的守护进程,系统开始时是没有开启的.crontab主要作用是管理用户的crontab file ...
- 怎样在Qsys系统中添加第三方IP核
1.新建Quartus II工程 2.新建Qsys系统 3.如果没有我们需要添加的IP,需要自己额外添加 4在我们新建的Quartus工程里面新建一个文件夹,命名为ip; 5.将我们已经下载好的IP文 ...
- ubuntu系统中添加DNS服务器地址后诡异消失的解决办法
今天查看了一下自己电脑里的ubuntu14.04系统,发现无法上网,于是ping了一下百度,出现unknown host,查了一下/etc/resolv.conf中的DNS地址,却发现我之前的修改被清 ...
- 在Android系统中添加宏控制代码【原创】
关键词:Android 宏控制 Androd.mk 平台信息:内核:linux3.4.39 系统:android/android5.1平台:S5P4418 作者:庄泽彬(欢迎转载,请注明作者) 邮 ...
随机推荐
- 在Mac OS上将Node.js连接到XAMPP MySQL服务器一直报错error connecting: Error: connect ECONNREFUSED
以下為通過node.js連線本機mysql資料庫的方法: var mysql = require('mysql'); var connection = mysql.createConnection({ ...
- drf-day5——反序列化类校验部分源码分析、断言、drf请求、drf响应、视图组件及两个视图基类、基于GenericAPIView+5个视图扩展类
目录 一.反序列化类校验部分源码解析(了解) 二.断言 三.drf之请求 3.1 Request能够解析的前端传入的编码格式 3.2 Request类有哪些属性和方法(学过) 常用参数 Respons ...
- JSP第十次作业
1.实现 删除 回复邮件2.实现阅读邮件功能:在main.jsp中点击任意邮件的标题,进入到detail.jsp显示邮件详情,包括发件人,主题,内容,时间.同时需要把邮件状态修改为已读. com.gd ...
- Nacos配置中心 (介绍与配置)
Nacos配置中心 当微服务部署的实例越来越多,达到数十.数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错.我们需要一种统一配置管理方案,可以集中管理所有实例的配置. Nacos一方面可以将配置 ...
- SQL优化的七个方面
SQL优化的七个方面 1. 创建索引 禁止给表中每一列都建立单独索引 每个Innodb表都必须有一个主键 要注意组合索引的字段顺序 优先考虑覆盖索引 避免使用外键约束 2. 避免索引失效 失效场景: ...
- 亲测有效! Wondershare UniConverterV14.1.7 Wondershare PDFelement Professional V9.3.3 含(win/mac版)
亲测有效! Wondershare UniConverterV14.1.7 Wondershare PDFelement Professional V9.3.3 含(win/mac版) Wonde ...
- SRS视频服务器CallBack的Demo
1.安装环境(很麻烦,可以选择编译启动) 官方文档快速开始docker配置: docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 -d ...
- 如何在不额外读流的情况下计算md5值
设想这样一个场景:从网络流中读取文件到硬盘中并计算文件的md5值.通常的做法是先将文件保存下来,再计算文件的md5,但这样会一共会出现三次I/O,一次网络I/O,两次磁盘I/O. 导致额外磁盘I/O的 ...
- LG P5244 [USACO19FEB] Mowing Mischief P
\(\text{Code}\) #include <bits/stdc++.h> #define IN inline #define eb emplace_back using names ...
- JZOJ 排列统计
排列统计 \(Description\) 对于给定的一个长度为n的序列{B[n]},问有多少个序列{A[n]}对于所有的i满足:A[1]-A[i]这i个数字中有恰好B[i]个数字小等于i.其中{A[n ...