视频实例实用软件按键机制_第1页
视频实例实用软件按键机制_第2页
视频实例实用软件按键机制_第3页
视频实例实用软件按键机制_第4页
视频实例实用软件按键机制_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Zstack 的按键机制这一节看按键机制,后续会陆续看 UART 机制和绑定机制,通过这三大机制深入学习 Zstack 消息的传递机制,掌握 Zstack 开发流程。1、 了解 TI 的 EB 板按键TI 的 EB 板按键资源有一个独立按键和一个摇杆。独立按键连接到 P0_1,摇杆四个方向串联电阻连接到 P0_6,摇杆的确认按钮(中心按键)连接到 P0_5,类似与独立按键。TI 的 EB 板按键部分原理图:A) 独立按键原理图:图 1:EB 板独立按键原理图由原理图可以看出按键为低电平有效。B)摇杆按键原理图图 1:EB 板摇杆按键原理图(这个图想横着占一页)由原理图可以看出摇杆的确认按钮(中

2、心按键)是2、 轮询与中断有效。Zstack 中提供了两种方式轮询方式:中断方式:3、 按键的初始化A)、相关宏定义按键数据:轮询方式和中断方式。在 key.c 文件中定义了关于按键的宏。注意按键初始化配置属于底层驱动的配置,在涉及到底层时会遇到大量的 CC2430 寄存器,要养成查看 datasheet 的好。、按键 6(SW6)对应原理图的独立按键 S1,按键 6(SW6)相关的宏定义:#define HAL_KEY_BIT0 #define HAL_KEY_BIT1 #define HAL_KEY_BIT2 #define HAL_KEY_BIT3 #define HAL_KEY_BIT

3、4 #define HAL_KEY_BIT5 #define HAL_KEY_BIT6#define HAL_KEY_BIT70 x010 x020 x040 x080 x100 x200 x400 x80#if defined (HAL_BOARD_CC2430EB) | defined (HAL_BOARD_CC2430BB)#define HAL_KEY_SW_6_ENABLE#define HAL_KEY_SW_6_PORT #define HAL_KEY_SW_6_BIT #define HAL_KEY_SW_6_SEL #define HAL_KEY_SW_6_DIR #defin

4、e HAL_KEY_SW_6_IEN #define HAL_KEY_SW_6_IENBIT #define HAL_KEY_SW_6_EDGE #define HAL_KEY_SW_6_EDGEBIT #define HAL_KEY_SW_6_ICTL #define HAL_KEY_SW_6_ICTLBIT#define HAL_KEY_SW_6_PXIFGP0 HAL_KEY_BIT1 P0SELP0DIR IEN1HAL_KEY_BIT5 HAL_KEY_RISING_EDGE HAL_KEY_BIT0PICTL HAL_KEY_BIT3 P0IFGHAL_KEY_SW_6_BIT#d

5、efine HAL_KEY_P0#endif_LOW_USED、按键 5(SW5)对应原理图的摇杆的确认按钮(中心按键),摇杆相关宏定义: #if defined (HAL_BOARD_CC2430EB)#define HAL_KEY_JOYSTICK_ENABLE#define HAL_KEY_JOY_CHNHAL_ADC_CHANNEL_6#define HAL_KEY_SW_5_ENABLE #define HAL_KEY_SW_5_PORT #define HAL_KEY_SW_5_BIT #define HAL_KEY_SW_5_SEL #define HAL_KEY_SW_5_DI

6、R #define HAL_KEY_SW_5_INP #define HAL_KEY_SW_5_IEN #define HAL_KEY_SW_5_IENBIT #define HAL_KEY_SW_5_EDGE #define HAL_KEY_SW_5_EDGEBIT#define HAL_KEY_SW_5_ICTLP0 HAL_KEY_BIT5 P0SELP0DIR P0INP IEN1HAL_KEY_BIT5 HAL_KEY_RISING_EDGE HAL_KEY_BIT2PICTL#define HAL_KEY_SW_5_ICTLBIT#define HAL_KEY_SW_5_PXIFG

7、HAL_KEY_BIT4P0IFG HAL_KEY_SW_5_BIT#define HAL_KEY_PO#endif_HIGH_USEDB)、代码分析:按键的初始化属于硬件的初始化,在 Zstack 中硬件驱动在 HalDriverInit()集中处理。在主函数 Main 中调用了函数 HalDriverInit()进行硬件驱动的初始化,该函数根据编译选项对硬件逐个进行了初始化。HalDriverInit()代码如下:程序代码:void HalDriverInit (void)/* 定时器 */ HalTimerInit();/* ADC */#if (defined HAL_ADC) & (

8、HAL_ADC = TRUE) HalAdcInit();#endif/* LED 灯*/#if (defined HAL_LED) & (HAL_LED = TRUE) HalLedInit();#endif/* 串口 */#if (defined HAL_UART) & (HAL_UART = TRUE) HalUARTInit();#endif/* 按键 */#if (defined HAL_KEY) & (HAL_KEY = TRUE) HalKeyInit();#endif由上述代码可以看出除定时器以外其它初始化都是根据条件进行初始化的,这里满足按键初始化条件。注:硬件驱动初始化没有

9、完全列举,可以参见具体协议栈。程序代码:/*Set to TRUE enable KEY usage, FALSE disable itNotes: On 2430EB/DBog joystick is used to simulatekeys. Keys wont work unless HAL_ADC is also setto TRUE*/#ifndef HAL_KEY #define HAL_KEY TRUE #endif上述代码摘自 hal_board_cfg.h 文件,从上述代码可以看出:TI 的 Zstack 协议栈默认是使用独立按键的。使用摇杆的时候还要确保 HAL_ADC 为

10、真,即 Zstack 协议栈使用 AD HAL_ADC 代码如下:程序代码:/* Set to TRUE enable ADC usage, FALSE disable it */ #ifndef HAL_ADC#define HAL_ADC TRUE #endif上述代码同样摘自hal_board_cfg.h 文件,可以看出 Zstack 协议栈默认使用AD 转换器。由上述#define HAL_KEY TRUE 和#define HAL_ADC TRUE 可以知道在 TI 的Zstack 协议栈默认情况既可以使用普通的独立按键也可以使用模拟的摇杆。void HalKeyInit( void

11、 )#if (HAL_KEY = TRUE)halKeySavedKeys = 0;#if defined (HAL_KEY_SW_6_ENABLE)。关于HAL_KEY_SW_6_SEL &= (HAL_KEY_SW_6_BIT); HAL_KEY_SW_6_DIR &= (HAL_KEY_SW_6_BIT);#endif#if defined (HAL_KEY_SW_5_ENABLE) HAL_KEY_SW_5_SEL &= (HAL_KEY_SW_5_BIT); HAL_KEY_SW_5_DIR &= (HAL_KEY_SW_5_BIT); HAL_KEY_SW_5_INP |= HAL

12、_KEY_SW_5_BIT;#endif/设定为通用 I/O 口/设置为输入模式/设定为通用 I/O 口/设置为输入模式/设置为三态模式pHalKeyProsFunction= NULL;HalKeyConfigured = FALSE;#endif /* HAL_KEY */按键驱动初始化函数 HalKeyInit()说明:、配置了三个全局变量。全局变量 halKeySavedKeys 是用来保存按键值的,初始化时将其初始化为 0;pHalKeyProsFunction 为指向按键处理函数的指针,当有按键按下时调用按键处理函数对按键进行处理,初始化时将其初始化为 NULL,在按键的配置函数中

13、对其进行配置;全局变量 HalKeyConfigured 用来标示按键是否被配置,初始化时没有配置按键,所以此时该变量被初始化为 FALSE。、配置了两个按键的 I/O 口。函数中用条件语句判定是否使能了 SW5 和 SW6,由前面的宏定义可以看出,如果使用的是 TI 的 EB 板,则 SW5 和 SW6 都将被使能。有上述代码可以看出按键驱动初始化函数 HalKeyInit()将与 SW5 和 SW6 相连接的 I/O 设定通用 I/O口,并都设置为输入模式。而且将 SW5 的输入模式设定为三态。4、按键的配置按键的初始化只是简单的对按键进行了初始化与 I/O 的配置,如果要使用 Zstac

14、k 的按键仍需要进一步对按键进行配置,下面着重按键的配置。Zstack 对按键处理提供了两种方询法和中断法。在配置按键时也是分为两种情况与之对应。这里对两种配置模式逐一说明。Zstack 默认使用轮询的方式处理,A)、配置轮询方式的按键先以轮询入手。TI 的 Zstack 为什么会默认使用轮询方式对按键进行处理?其实最重要的一点是因为 TI 的 EB 和 ED 板都有摇杆。因为摇杆的四个方向是以电压的大小区分的,是不能产生中断的。如果使用了中断方式对按键进行处理那么摇杆的四个方向键就是摆设了,所以 TI 的 Zstack 采取轮询的方式处理按键。为什么要使用摇杆?其实原因也很简单,为了节省 I

15、/O口资源,CC2430 只有 21 个通用 I/O 口,如果使用一个摇杆就可以就可以节省使用三个独立 I/O 口。代码分析:按键的配置函数在板载初始化函数InitBoard()中被调用,函数InitBoard()负责板载的初始化与配置。HalKeyConfig()决定了将按键的处理方式为轮询方式或者是中断方式。程序代码:#define HAL_KEY_#define HAL_KEY_ERRUPT_DISABLEERRUPT_ENABLE0 x000 x01void InitBoard( byOnboardKeyevel )Enable = HAL_KEY_ERRUPT_DISABLE;/使用

16、轮询方式HalKeyConfig( OnboardKeyEnable, OnBoard_KeyCallback);板载初始化函数 InitBoard()说明:由代码 HAL_KEY_ERRUPT_DISABLE 得知处理方式被设置为轮询方式。如果我们 要 设 置 为 中 断 方 式 , 只 需 要 给 变 量 OnboardKeyEnable赋 值HAL_KEY_ERRUPT_ENABLE 即可。另一个参数 OnBoard_KeyCallback 是按键处理的回调函数的函数名,如果有按键按下时将会调用这个回调函数进行处理。该按键回调函数会在按键处理详细说明。程序代码:void HalKeyCo

17、nfig (boolerruptEnable, halKeyCBack_t cback)#if (HAL_KEY = TRUE)Hal_KeyEnable =erruptEnable;/保存参数决定处理方式是轮询或是中断pHalKeyProsFunction = cback;/保存参数按键处理的回调函数if (Hal_KeyEnable)/如果为真则配置为中断方式else/否则配置为轮询方式#if defined (HAL_KEY_SW_6_ENABLE)HAL_KEY_SW_6_ICTL &= (HAL_KEY_SW_6_ICTLBIT); /清除中断 HAL_KEY_SW_6_IEN &=

18、 (HAL_KEY_SW_6_IENBIT);#endif#if defined (HAL_KEY_SW_5_ENABLE) HAL_KEY_SW_5_ICTL &= (HAL_KEY_SW_5_ICTLBIT); HAL_KEY_SW_5_IEN &= (HAL_KEY_SW_5_IENBIT);#endifosal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, L_KEY_POLLING_VALUE);/定时触发事件 HAL_KEY_EVENT,溢出时间为 HAL_KEY_POLLING_VALUE。HalKeyConfigured = TRUE; #

19、endif /* HAL_KEY */按键配置函数 HalKeyConfig ()说明: 、配置三个全局变量。 Hal_KeyEnable 保存了按键处理方式, 全局变量pHalKeyProsFunction 保存了按键处理的回调函数,在按键处理工程中将被调用。第三个变量仍是HalKeyConfigured 用来标示按键是否配置,当按键配置完成将其设定为 TRUE。、配置两个按键。由于上述代码使用的是轮询方式对按键事件进行配置,就不允许按键产生中断。在配置按键 SW5 和 SW6 时将其对应的中断使能见按键相关宏定义和 CC2340 的 datasheet 进行理解。具体配置代码需参、事件 H

20、AL_KEY_EVENT,在将按键配置为轮询方式后,Zstack 会定时触发事件HAL_KEY_EVENT 检测是否有按键按下。定时器的溢出时长为 HAL_KEY_POLLING_ VALUE。事件的处理置为中断方式。后续讲解,这里完成了轮询方式的配置,接下来看如何将按键配B)、配置中断方式的按键为了让大家能更加深入了解 Zstack 中机制和数据流的传递。虽然 TI 的 Zstack 默认是以轮询方式处理按键,但其中断方式的代码都给可。下面一起看如何将按键配置为中断方式。 程序代码:代码分析:准备好了,只需稍微改动一点即按键的配置函数在板载初始化函数InitBoard()中被调用,函数Ini

21、tBoard()负责板载的初始化与配置。在函数 InitBoard()调用按键配置函数 HalKeyConfig()根据参数值对按键进行配置,决定了将按键的处理方式为轮询方式或者是中断方式。程序代码:#define HAL_KEY_#define HAL_KEY_ERRUPT_DISABLEERRUPT_ENABLE0 x000 x01void InitBoard( byevel )OnboardKeyEnable = HAL_KEY_ERRUPT_ENABLE;/使用中断方式HalKeyConfig( OnboardKeyEnable, OnBoard_KeyCallback);程序代码:v

22、oid HalKeyConfig (boolerruptEnable, halKeyCBack_t cback)#if (HAL_KEY = TRUE)Hal_KeyEnable =erruptEnable;/保存参数决定处理方式是轮询或是中断pHalKeyProsFunction = cback;/保存参数按键处理的回调函数if (Hal_KeyEnable)#if defined (HAL_KEY_SW_5_ENABLE)PICTL &= (HAL_KEY_SW_5_EDGEBIT);/设定上升沿或者下降沿触发#if (HAL_KEY_SW_5_EDGE = HAL_KEY_FALLING

23、_EDGE) PICTL |= HAL_KEY_SW_5_EDGEBIT;#endifHAL_KEY_SW_5_ICTL |= HAL_KEY_SW_5_ICTLBIT; HAL_KEY_SW_5_IEN |= HAL_KEY_SW_5_IENBIT; HAL_KEY_SW_5_PXIFG = (HAL_KEY_SW_5_BIT);#endif/设定中断使能/清除中断标志#if defined (HAL_KEY_SW_6_ENABLE)PICTL &= (HAL_KEY_SW_6_EDGEBIT);/设定上升沿或者下降沿触发#if (HAL_KEY_SW_6_EDGE = HAL_KEY_FA

24、LLING_EDGE) PICTL |= HAL_KEY_SW_6_EDGEBIT;#endifHAL_KEY_SW_6_ICTL |= HAL_KEY_SW_6_ICTLBIT; HAL_KEY_SW_6_IEN |= HAL_KEY_SW_6_IENBIT; HAL_KEY_SW_6_PXIFG = (HAL_KEY_SW_6_BIT);#endif/设定中断使能/清除中断标志elseHalKeyConfigured = TRUE; #endif /* HAL_KEY */按键配置函数 HalKeyConfig ()说明:、配置三个全局变量。、配置两个按键。这里是要将按键配置为中断方式。需

25、要将按键配置为上升沿或是下降沿触发,同时需要将按键的对应 I/O 口配置为允许中断,即中断使能。在配置触发沿时首先默认配置为上升沿,然后检测按键相关宏定义决定是否需要配置为下降沿。在配置完中断使能后清除中断标志位允许按键中断。具体配置代码需参见按键相关宏定义和 CC2340 的 datasheet 进行理解。、将按键配置为中断方式,在程序中没有触发类似 HAL_KEY_EVENT 的事件,而是交由中断函数进行处理,当有按键按下时中断函数就会捕获中断,从而调用按键的处理函数进一步进行相关处理。关于中断方式的按键处理将在后面的进行梳理。5、按键的处理 A)、轮询方式处理轮询方式是 TI 的 Zst

26、ack 对按键默认的处理方式,Zstack 会每隔 100ms 对按键检测一次, 如果有按键按 下就执行相关 的处理。 Zstack 是以每隔 100ms 触发一次 HAL_KEY_EVENT 事件实现的轮询的,定时器溢出时间 HAL_KEY_POLLING_VALUE即为轮询的的间隔。Zstack 每次轮询按键都会与保存的按键值(halKeySavedKeys)进行对比,保存按键值在按键初始化函数被初始化为 0。如果没有按下即与先前保存的按键值相等,Zstack 不进行处理。如果有按键按下,那么按键值与保存的按键值(halKeySavedKeys)不同,将会调用按键处理回调处理函数进行处理,

27、并将此时得到的按键值保存以便下次比较。在轮询方式配置完成后,Zstack 便触发了事件 HAL_KEY_EVENT,其任务 ID 为Hal_TaskID,则对应的处理函数即为 HAL 层的事件处理函数 Hal_ProsEvent()。触发了HAL 层的 HAL_KEY_EVENT 标志着开始了按键的轮询。详细代码如下:程序代码:u16 Hal_ProsEvent( u8 task_id, u16 events )if (events & HAL_KEY_EVENT)#if (defined HAL_KEY) & (HAL_KEY = TRUE) HalKeyPoll();if (!Hal_Ke

28、yEnable)osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100);#endif / HAL_KEYreturn events HAL_KEY_EVENT;HAL_KEY_EVENT 事件处理说明:、在处理 HAL_KEY_EVENT 事件时调用了函数 HalKeyPoll(),函数 HalKeyPoll()负责检测是否有按键按下,如果有按键按下会触发相应的回调函数。、在调用函数 HalKeyPoll()检测完按键过后,用 if 条件判断语句检测按键是否是轮询方式处理,这里是以轮询方式处理按键,所以满足 if 条件判断语句的条件,即执行函数

29、osal_start_timerEx()定时再次触发事件 HAL_KEY_EVENT,定时长度为 100ms,由此可以看出如此的循环的触发事件 HAL_KEY_EVENT 即完成了对按键的定时轮询。处理 HAL_KEY_EVENT 事件时调用了函数 HalKeyPoll(),HalKeyPoll()函数进一步来去检测是否有按键按下,其详细代码如下:程序代码:#define HAL_KEY_S#define HAL_KEY_SE_NORMALE_SHIFT0 x000 x01void HalKeyPoll (void)u8 keys = 0;/初始键值为 0#if defined (HAL_KE

30、Y_SW_6_ENABLE)if (!(HAL_KEY_SW_6_PORT & HAL_KEY_SW_6_BIT)keys |= HAL_KEY_SW_6;#endif#if defined (HAL_KEY_SW_5_ENABLE)if (HAL_KEY_SW_5_PORT & HAL_KEY_SW_5_BIT)keys |= HAL_KEY_SW_5;#endif/SW6 低电平有效/SW5有效if (!Hal_KeyEnable)/轮询方式if (keys = halKeySavedKeys)return;halKeySavedKeys = keys;/保存按键值下次比较if (keys

31、 & (pHalKeyProsFunction)/调用按键回调函数对按键进一步处理(pHalKeyProsFunction) (keys, HAL_KEY_SE_NORMAL);HalKeyPoll()函数说明:、HalKeyPoll()函数对所有的按键进行检测,这里只是列举了 SW5 和 SW6 两个按键,摇杆的四个方向是利用 AD里不一一列举了。的数值不同决定的,具体可以参见协议栈代码,这。首先函数定义了一个 u8 的局部变量 keys 用来、按键值按键的值,并将其值初始化为 0。通过 if 条件语句判定是否有 SW5 或者 SW6 被按下。注意程序中的代码在检测 SW5 时是检测对应位是

32、否为,而检测 SW6 时检测对应位是否为低电平。这里的高低电平与最初分析原理图时一致。如果有按键按下则将其对应的数值赋给局部变量 keys。、轮询处理。如果是轮询方式首先要对上次的按键值直接返回不进行处理。如果的按键进行判别,如果的按键值为的按键值和上次的按键值不同,则将的按键值保存到全局变量 halKeySavedKeys 以便下一次比较。并调用函数进行处理。、回调函数处理按键。当有按键按下后则 keys 值不为 0,并且在按键配置函数HalKeyConfig ()的时候 (keys & (pHalKeyPro进行处理。为按键配置了回调函数 OnBoard_KeyCallback ()。所以

33、 ifsFunction)中的两个判断条件都为真,即可以用回调函数对按键当有按键按下,Zstack 的底层获取了按键的按键值会触发按键的回调函数 OnBoard_KeyCallback ()进一步处理,将按键信息传到上层(应用层)。按键回调函数代码如下:程序代码:void OnBoard_KeyCallback ( u8 keys, u8 se )/调用 OnBoard_SendKeys 将到上层if ( OnBoard_SendKeys( keys, shift ) != ZSucs )OnBoard_KeyCallback ()函数说明:OnBoard_KeyCallback ()函数中调

34、用了函数 OnBoard_SendKeys()进一步处理,但是 Zstack 并没有给出 OnBoard_SendKeys()处理失败的代码,用户可以根据实际需要自行添加。在函数 OnBoard_SendKeys()将会将按键的值和按键的状态进行“打包”发送到按键的那一层。具体代码如下:程序代码:byte OnBoard_SendKeys( byte keys, byte se )keyChange_t *msgPtr;if ( registeredKeysTaskID != NO_TASK_ID )/这里必须要被/分配内存空间msgPtr = (keyChange_t *)osal_msg_

35、allocate( sizeof(keyChange_t) ); if ( msgPtr )/内存分配成功msgPtr-hdr.event = KEY_CHANGE; msgPtr-se = se;msgPtr-keys = keys;过osal_msg_send( registeredKeysTaskID, (u8 *)msgPtr );return ( ZSucs );elsereturn ( ZFailure );OnBoard_SendKeys ()函数说明、按键的。if ( registeredKeysTaskID != NO_TASK_ID )用来判断按键是否被注册。在 Zstac

36、k 中,如果要使用按键必须要。类似于端点 endpo的。但按键的注册只能在 S行按键给一个层。这里以 SleApp 实例进行说明。leApp 实例的应用层初始化代码中调用了按键函数 RegisterForKeys ()进函数代码如下:,其传递的任务 ID 为 SleApp_TaskID。按键程序代码:byte RegisterForKeys( byte task_id )/ 仅允许一次if ( registeredKeysTaskID = NO_TASK_ID ) /判断条件,确定没有被registeredKeysTaskID = task_id;/将传来的 ID 赋给了 registered

37、KeysTaskID return ( true );elsereturn ( false );按键函数仅允许一次,即只能有一个层按键。在按键时首先检测了全局变量 registeredKeysTaskID(初始化为 NO_TASK_ID)是否等于 NO_TASK_ID,如果等于则证明按键没有被赋给,可以被。按键的实际上就是将函数传递来的任务 ID全局变量 registeredKeysTaskID 的过程。、数据的发送。在确定按键已经被的前提下,Zstack 对按键信息进行打包处理,封装到信息包 msgPtr 中,将将要触发的事件 KEY_CHANGE,按键的状态 se 和按键的键值 keys

38、一并封装。然后调用 osal_msg_send()将按键到按键的对应层。这里以 SleApp 工程为例,Zstack 最终触发了 SleApp 应用层的处理函数中的 KEY_CHANGE 事件。代码如下:程序代码:u16 SleApp_ProsEvent( u8 task_id, u16 events )case KEY_CHANGE:SleApp_HandleKeys( (keyChange_t *)MSGpkt)-se, (keyChange_t*)MSGpkt)-keys );break;SleApp_ProsEvent()在处理 HAL_KEY_EVENT 事件时调用了应用层的按键处理

39、函数 SleApp_HandleKeys()。按键处理函数 SleApp_HandleKeys()对按键进一步处理,其代码如下:程序代码:void SleApp_HandleKeys( u8 shift, u8 keys )if ( keys & HAL_KEY_SW_1 )/如果按键值 keys&HAL_KEY_SW_1 为 1,执行以下代码SleApp_SendFlashMessage( SLEAPP_FLASH_DURATION );if ( keys & HAL_KEY_SW_2 )/如果按键值 keys&HAL_KEY_SW_2 为 1,执行以下代码在按键处理函数 SleApp_Ha

40、ndleKeys()中根据按键值的不同调用了不同的函数,按键完成了其使命。以上分析就是以轮询方式处理按键。B)、中断方式处理在按键配置函数 HalKeyConfig ()将按键配置为中断方式后,使能了按键相对应的 I/O口。这里以 P0 口为例进行梳理。P0 口中断函数代码如下:程序代码:HAL_ISR_FUNCTION( halKeyPort0Isr, P0_VECTOR )halPro P0IF = 0;sKeyerrupt();P0 口外部中断函数说明在该中断函数调用了按键中断处理函数 halProsKeyerrupt()对中断进行处理,且将 P0 口中断标志位清零。中断处理函数 hal

41、Pro程序代码:sKeyerrupt()代码如下:void halProsKeyerrupt (void)boolvalid=FALSE;#if defined (HAL_KEY_SW_6_ENABLE)if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT)HAL_KEY_SW_6_PXIFG = (HAL_KEY_SW_6_BIT);valid = TRUE;#endif#if defined (HAL_KEY_SW_5_ENABLE)if (HAL_KEY_SW_5_PXIFG & HAL_KEY_SW_5_BIT)HAL_KEY_SW_5_PXIFG = (

42、HAL_KEY_SW_5_BIT);valid = TRUE;#endifif (valid)osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT,HAL_KEY_DEBOUNCE_VALUE);按键中断处理 halProsKeyerrupt ()说明:、局部变量 valid 说明。函数中的局部变量 valid 标示了是否有按键按下,如果有按键按下则定时触发 HAL_KEY_EVENT 事件。这里说明一点,P0 口外部中断不只是里的两个按键。、按键的检测。在该函数中通过检测按键对应位的中断标志位是否为 1,判断按键按下。CC2340 的每一个 I/O 都可

43、以产生中断。如果有按键按下则要将对应位的中断标志位置为 0,并将局部变量 valid 设置为 TRUE,从而触发AL_KEY_EVENT 事件对按键处理。、HAL_KEY_EVENT 事件。如果有按键按下则会定时触发 HAL_KEY_EVENT 事件,定时长度为 HAL_KEY_DEBOUNCE_VALUE(25ms)。这里说明一下,在按键中断处这理函数 halProsKeyerrupt () 并 没 有按 键 的 值 , 而 是 定 时 触 发 了HAL_KEY_EVENT 事 件 , 在 处 理 HAL_KEY_EVENT 事 件 时HAL_KEY_DEBOUNCE_VALUE(25ms)是为了按键消抖。 定 时 时 长按键中断处理 halProsKeyerrupt ()所触发的 HAL_KEY_EVENT 事件在 HAL 层事件处理函数 Hal_Pro程序代码:sEvent()被处理,具体代码如下:u16 Hal_ProsEvent( u8 task_id, u16 events )if

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论