TI写的按键比较啰嗦关键还没什么功能,所以重写了,阿莫的开发板,

头文件H:

#ifndef HAL_KEY_H
#define HAL_KEY_H #ifdef __cplusplus
extern "C"
{
#endif /**************************************************************************************************
* INCLUDES
**************************************************************************************************/
#include "hal_board.h" /**************************************************************************************************
* MACROS
**************************************************************************************************/ /**************************************************************************************************
* CONSTANTS
**************************************************************************************************/
#define defHalKeyCheckTimePriod 20 /* Key state - shift or nornal */
#define HAL_KEY_STATE_NORMAL 0x00
#define HAL_KEY_STATE_SHIFT 0x01 #define HAL_KEY_SW_1 0x20 // Joystick up
/*
#define HAL_KEY_SW_2 0x02 // Joystick right
#define HAL_KEY_SW_5 0x04 // Joystick center
#define HAL_KEY_SW_4 0x08 // Joystick left
#define HAL_KEY_SW_3 0x10 // Joystick down*/ #define HAL_KEY_UP 0x01 // Joystick up
#define HAL_KEY_RIGHT 0x02 // Joystick right
#define HAL_KEY_CENTER 0x04 // Joystick center
#define HAL_KEY_LEFT 0x08 // Joystick left
#define HAL_KEY_DOWN 0x10 // Joystick down #define HAL_KEY_SHIFT_KEEP 0x01 // Joystick right
#define HAL_KEY_SHIFT_DOWN 0x02 // Joystick down
#define HAL_KEY_SHIFT_UP 0x03 // Joystick up /**************************************************************************************************
* TYPEDEFS
**************************************************************************************************/
typedef void (*halKeyCBack_t) (uint8 keys, uint8 state); /**************************************************************************************************
* GLOBAL VARIABLES
**************************************************************************************************/
extern bool Hal_KeyIntEnable; /**************************************************************************************************
* FUNCTIONS - API
**************************************************************************************************/ /*
* Initialize the Key Service
*/
extern void HalKeyInit( void ); /*
* Configure the Key Service
*/
void HalKeyConfig (halKeyCBack_t cback); /*
* Read the Key status
*/
extern uint8 HalKeyRead( void); /*
* Enter sleep mode, store important values
*/
extern void HalKeyEnterSleep ( void ); /*
* Exit sleep mode, retore values
*/
extern uint8 HalKeyExitSleep ( void ); /*
* This is for internal used by hal_driver
*/
extern void HalKeyPoll ( void ); /*
* This is for internal used by hal_sleep
*/
extern bool HalKeyPressed( void ); extern uint8 hal_key_keys(void); extern uint8 hal_key_int_keys(void); /**************************************************************************************************
**************************************************************************************************/ #ifdef __cplusplus
}
#endif #endif

  以下是C文件

/**************************************************************************************************
* INCLUDES
**************************************************************************************************/
#include "hal_mcu.h"
#include "hal_defs.h"
#include "hal_types.h"
#include "hal_drivers.h"
#include "hal_adc.h"
#include "hal_key.h"
#include "osal.h" /* SW_1 is at P0.0 */
#define HAL_KEY_SW_1_PORT P0
#define HAL_KEY_SW_1_BIT BV(1)
#define HAL_KEY_SW_1_SEL P0SEL
#define HAL_KEY_SW_1_DIR P0DIR
#define HAL_KEY_SW_1_EDGEBIT BV(0) #define HAL_KEY_SW_1_IEN IEN1 /* CPU interrupt mask register */
#define HAL_KEY_SW_1_ICTL P0IEN /* Port Interrupt Control register */
#define HAL_KEY_SW_1_ICTLBIT BV(0) /* P0IEN - P0.0 enable/disable bit */
#define HAL_KEY_SW_1_IENBIT BV(5) /* Mask bit for all of Port_0 */ #define HAL_KEY_SW_1_PXIFG P0IFG /* Interrupt flag at source */ /* Joy stick move at P2.0 */
#define HAL_KEY_JOY_MOVE_PORT P2
#define HAL_KEY_JOY_MOVE_BIT BV(0)
#define HAL_KEY_JOY_MOVE_SEL P2SEL
#define HAL_KEY_JOY_MOVE_DIR P2DIR
#define HAL_KEY_SW_2_IENBIT BV(5) /* Mask bit for all of Port_0 */ /* edge interrupt */
#define HAL_KEY_JOY_MOVE_EDGEBIT BV(3)
#define HAL_KEY_JOY_MOVE_EDGE HAL_KEY_FALLING_EDGE /* Joy move interrupts */
#define HAL_KEY_JOY_MOVE_IEN IEN2 /* CPU interrupt mask register */
#define HAL_KEY_JOY_MOVE_IENBIT BV(1) /* Mask bit for all of Port_2 */
#define HAL_KEY_JOY_MOVE_ICTL P2IEN /* Port Interrupt Control register */
#define HAL_KEY_JOY_MOVE_ICTLBIT BV(0) /* P2IENL - P2.0<->P2.3 enable/disable bit */
#define HAL_KEY_JOY_MOVE_PXIFG P2IFG /* Interrupt flag at source */ #define HAL_KEY_JOY_CHN HAL_ADC_CHANNEL_6 uint8 halGetJoyKeyInput(void); struct Key_State_t {
uint8 key;
uint8 keep;
uint8 shift;
uint32 runtime;
halKeyCBack_t pHalKeyProcessFunction;
};
struct Key_State_t hal_key_state;
/**************************************************************************************************
* @fn HalKeyInit
*
* @brief Initilize Key Service
*
* @param none
*
* @return None
**************************************************************************************************/
void HalKeyInit( void )
{
osal_memset(&hal_key_state,0,sizeof(hal_key_state)); HAL_KEY_SW_1_SEL &= ~(HAL_KEY_SW_1_BIT); /* Set pin function to GPIO */
HAL_KEY_SW_1_DIR &= ~(HAL_KEY_SW_1_BIT); /* Set pin direction to Input */ HAL_KEY_JOY_MOVE_SEL &= ~(HAL_KEY_JOY_MOVE_BIT); /* Set pin function to GPIO */
HAL_KEY_JOY_MOVE_DIR &= ~(HAL_KEY_JOY_MOVE_BIT); /* Set pin direction to Input */
/* Initialize callback function */
hal_key_state.pHalKeyProcessFunction = NULL;
} /**************************************************************************************************
* @fn HalKeyConfig
*
* @brief Configure the Key serivce
*
* @param interruptEnable - TRUE/FALSE, enable/disable interrupt
* cback - pointer to the CallBack function
*
* @return None
**************************************************************************************************/
void HalKeyConfig (halKeyCBack_t cback)
{
hal_key_state.pHalKeyProcessFunction = cback;
osal_start_reload_timer( Hal_TaskID, HAL_KEY_EVENT, 20);
}
/**************************************************************************************************
* @fn HalKeyRead
*
* @brief Read the current value of a key
*
* @param None
*
* @return keys - current keys status
**************************************************************************************************/
uint8 HalKeyRead ( void )
{
uint8 keys = 0;
if (!(HAL_KEY_SW_1_PORT & HAL_KEY_SW_1_BIT)) /* Key is active low */
{
keys |= HAL_KEY_SW_1;
}
if ((HAL_KEY_JOY_MOVE_PORT & HAL_KEY_JOY_MOVE_BIT)) /* Key is active low */
{
keys |= halGetJoyKeyInput();
}
return keys;
}
/**************************************************************************************************
* @fn HalKeyPoll
*
* @brief Called by hal_driver to poll the keys
*
* @param None
*
* @return None
**************************************************************************************************/
void HalKeyPoll (void)
{
uint8 keys = 0;
if (!(HAL_KEY_SW_1_PORT & HAL_KEY_SW_1_BIT)) /* Key is active low */
{
keys |= HAL_KEY_SW_1;
}
if ((HAL_KEY_JOY_MOVE_PORT & HAL_KEY_JOY_MOVE_BIT)) /* Key is active HIGH */
{
keys = halGetJoyKeyInput();
}
if(keys)
{
hal_key_state.key = keys;
if(hal_key_state.keep==0x00)
{
hal_key_state.keep = 0x01;
hal_key_state.shift = HAL_KEY_SHIFT_DOWN;
hal_key_state.runtime = 0;
}
else
{
hal_key_state.shift = HAL_KEY_SHIFT_KEEP;
hal_key_state.runtime+=defHalKeyCheckTimePriod;
}
}
else if(hal_key_state.keep)
{
hal_key_state.keep = 0x00;
hal_key_state.shift = HAL_KEY_SHIFT_UP;
}
/* Invoke Callback if new keys were depressed */
if (hal_key_state.shift && (hal_key_state.pHalKeyProcessFunction))
{
hal_key_state.pHalKeyProcessFunction(keys, hal_key_state.shift);
hal_key_state.shift = 0;
}
}
/**************************************************************************************************
* @fn halGetJoyKeyInput
*
* @brief Map the ADC value to its corresponding key.
*
* @param None
*
* @return keys - current joy key status
**************************************************************************************************/
uint8 halGetJoyKeyInput(void)
{
/* The joystick control is encoded as an analog voltage.
* Read the JOY_LEVEL analog value and map it to joy movement.
*/
uint8 adc;
uint8 ksave0 = 0;
uint8 ksave1; /* Keep on reading the ADC until two consecutive key decisions are the same. */
do
{
ksave1 = ksave0; /* save previouse key reading */ adc = HalAdcRead (HAL_KEY_JOY_CHN, HAL_ADC_RESOLUTION_8); if ((adc >= 2) && (adc <= 38))
{
ksave0 |= HAL_KEY_UP;
}
else if ((adc >= 74) && (adc <= 88))
{
ksave0 |= HAL_KEY_RIGHT;
}
else if ((adc >= 60) && (adc <= 73))
{
ksave0 |= HAL_KEY_LEFT;
}
else if ((adc >= 39) && (adc <= 59))
{
ksave0 |= HAL_KEY_DOWN;
}
else if ((adc >= 89) && (adc <= 100))
{
ksave0 |= HAL_KEY_CENTER;
}
} while (ksave0 != ksave1); return ksave0;
}
/**************************************************************************************************
* @fn HalKeyEnterSleep
*
* @brief - Get called to enter sleep mode
*
* @param
*
* @return
**************************************************************************************************/
void HalKeyEnterSleep ( void )
{
} /**************************************************************************************************
* @fn HalKeyExitSleep
*
* @brief - Get called when sleep is over
*
* @param
*
* @return - return saved keys
**************************************************************************************************/
uint8 HalKeyExitSleep ( void )
{
/* Wake up and read keys */
return ( HalKeyRead () );
} /**************************************************************************************************
**************************************************************************************************/

  hal_driver.c要修改成下面的:

  if (events & HAL_KEY_EVENT)
{
#if (defined HAL_KEY) && (HAL_KEY == TRUE)
/* Check for keys */
HalKeyPoll();
#endif
return events ^ HAL_KEY_EVENT;
}

  onBoard.c要修改:

void InitBoard( uint8 level )
{
if ( level == OB_COLD )
{
// Interrupts off
osal_int_disable( INTS_ALL );
// Turn all LEDs off
HalLedSet( HAL_LED_ALL, HAL_LED_MODE_OFF );
// Check for Brown-Out reset
// ChkReset();
}
else // !OB_COLD
{
/* Initialize Key stuff */
HalKeyConfig( OnBoard_KeyCallback);
}
}
void OnBoard_KeyCallback ( uint8 keys, uint8 shift )
{
// shift key (S1) is used to generate key interrupt
// applications should not use S1 when key interrupt is enabled
//shift = (OnboardKeyIntEnable == HAL_KEY_INTERRUPT_ENABLE) ? false : ((keys & HAL_KEY_SW_6) ? true : false); if ( OnBoard_SendKeys( keys, shift ) != SUCCESS )
{
// Process SW1 here
//把不需要的全删
}
}

  good luck!

CC2540重写按键的更多相关文章

  1. 【凯子哥带你学Framework】Activity界面显示全解析

    前几天凯子哥写的Framework层的解析文章<Activity启动过程全解析>,反响还不错,这说明“写让大家都能看懂的Framework解析文章”的思想是基本正确的. 我个人觉得,深入分 ...

  2. [安卓] 8、VIEW和SURFACEVIEW游戏框架

    这是个简单的游戏框架,上图显示我们实现了屏幕上对象的位置控制.这里要1个简单的layout资源和2个java类:在MainActivity中主要和以往一样,唯一不同的是去除电池图标和标题等操作,然后第 ...

  3. 【读书笔记《Android游戏编程之从零开始》】10.游戏开发基础(View 游戏框架)

    对于玩家来说,游戏是动态的:对于游戏开发人员来说,游戏是静态的,只是不停地播放不通的画面,让玩家看到了动态的效果. 进入Android之前,首先要熟悉三个重要的类:View(视图).Canvas(画布 ...

  4. Java中View游戏开发框架

    java中游戏开发引擎View比较适合被动触发的游戏,不能使用于那种对战的游戏 Game01Activity.java  这里是调用的activity package cn.sun.syspro; i ...

  5. 一步步教你如何源码编译Recovery

    *1 准备Ubuntu作为您的操作系统,笔者的版本是12.04_amd64. *2 准备 Android 源码的编译环境,主要是安装一些编译用到的lib库,以及同步源码的一些工具 ,如GIT,CURL ...

  6. 【凯子哥带你学Framework】Activity界面显示全解析(下)

    咱们接着上篇继续讲,上篇没看的请戳:[凯子哥带你学Framework]Activity界面显示全解析(上) 如何验证上一个问题 首先,说明一下运行条件: //主题 name="AppThem ...

  7. xamarin.android App在后台运行不退出

    /// <summary> /// 重写按键事件 /// </summary> /// <param name="keyCode"></p ...

  8. 【转载】【凯子哥带你学Framework】Activity界面显示全解析(下)

    如何验证上一个问题 首先,说明一下运行条件 //主题 name="AppTheme" parent="@android:style/Theme.Holo.Light.No ...

  9. Android编程 高德地图 中如何重写 定位按键 的触发事件 (com.amap.api.maps2d.LocationSource)点击定位后不仅定位在地图中心点上而且可以设置地图的缩放大小和提示

    在利用高德地图来编写自己的APP的时候,发现了一种对定位按键的重写方法,那就是利用   com.amap.api.maps2d.LocationSource  接口来重写. 什么是定位按键呢,下图中右 ...

随机推荐

  1. tomcat7下对HTTPS的部署配置

    1.申请CA证书,可以在腾讯云或者阿里云申请到免费的CA,不过前提是,你要有太服务器和域名,并且解析过域名. 2.下载申请到的CA证书到本地,在tomcat7上进行相关配置. 3.Tomcat 证书部 ...

  2. js中this关键字测试集锦

    参考:阮一峰<javascript的this用法>及<JS中this关键字详解> this是Javascript语言的一个关键字它代表函数运行时,自动生成的一个内部对象,只能在 ...

  3. Apache报错信息之通常每个套接字地址(协议/网络地址/端口)只允许使用一次(could not bind to address 0.0.0.0:80)

    我们常常在执行 httpd –k restart 重启Apache时报错提示: (OS 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次.  : AH00072: make_soc ...

  4. BZOJ1800 [Ahoi2009]fly 飞行棋

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  5. shell命令find

    概述 find命令的工作方式:沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作. 选项 -print:指明打印出匹配文件的文件名(路径).当使用-print时,'\n'作为用于分隔文件的 ...

  6. ASE周会记录

    本周Sprint Master Atma Hou 一. 本周会议概要 本次会议的主要任务是明确和老师讨论后的数据库设计定稿,同时为我们接下来的连接工作确定包含实现细节的story和接口. 二. 会议内 ...

  7. django进阶

    路由系统 简而言之,django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系.使请求到来之后,根据urls.py里的关系条目,去查找到与请求对应的处理方法,从而返回给客户 ...

  8. okhttp封装时,提示 cannot resolve method OkHttpClient setConnectTimeout() 函数

    如标题所示,okhttp封装时,提示 cannot resolve method  OkHttpClient setConnectTimeout() 函数,有遇到这样现象的朋友吗? 原因:因使用的是 ...

  9. UP Board 串口使用心得

    前言 原创文章,转载引用务必注明链接. 本文使用Markdown写成,为获得更好的阅读体验和正常的图片.链接,请访问我的博客: http://www.cnblogs.com/sjqlwy/p/up_s ...

  10. Spring--多人开发

    在spring中, 可以定义多个配置文件. 例子: ①首先定义一个班级类和一个学生类 1 package com.fuwh.spring;      }                    }    ...