你好,CC2538基于3.0HA的协议栈,实现按键的长按短按识别,
代码如下,可是实际上得不到想要的效果,
按键的中断和查询方式在哪里设置?
static void zclSampleDoorLockController_HandleKeys( byte shift, byte keys ) {(void)shift; // Intentionally unreferenced parameterif( keys & HAL_KEY_SW_1 ){keyPressTime = osal_getClock();}else{if ( keyPressTime ){keyPressTime = ( osal_getClock() - keyPressTime );if ( keyPressTime < 3 )//小于3秒,短按{NLME_PermitJoiningRequest(30);//允许加入}else //大于3秒,长按{//恢复出厂设置zgWriteStartupOptions( ZG_STARTUP_SET, (ZCD_STARTOPT_DEFAULT_NETWORK_STATE | ZCD_STARTOPT_DEFAULT_CONFIG_STATE) );SystemResetSoft();}keyPressTime = 0;}} }
Alvin Chen:
YiKai Chen:
在 InitBoard()裡面將"OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;"改成 "OnboardKeyIntEnable = HAL_KEY_INTERRUPT_ENABLE;"
user5367314:
回复 Alvin Chen:
应该配置的为查询方式,但是无法判断是长按还是短按?
是不是还有哪里设置不对?还是处理函数有问题?
// Initialize board I/O InitBoard( OB_COLD );
void InitBoard( uint8 level ){ if ( level == OB_COLD ) { // Interrupts off osal_int_disable( INTS_ALL ); HalKeyConfig( FALSE, NULL); //Config GPIO as input#if (defined OTA_CLIENT) && (OTA_CLIENT == TRUE) HalOTAInit();#endif }
user5367314:
回复 YiKai Chen:
你好,改为ENABLE后也进不去吧,初始化如下:
另外现在的按键是一按下去就进入处理函数,如果想按下去松开后再执行如何设置?
// Initialize board I/O
InitBoard( OB_COLD );void InitBoard( uint8 level )
{
if ( level == OB_COLD )
{
// Interrupts off
osal_int_disable( INTS_ALL );
HalKeyConfig( FALSE, NULL); //Config GPIO as input
#if (defined OTA_CLIENT) && (OTA_CLIENT == TRUE)
HalOTAInit();
#endif
}
user5367314:
回复 user5367314:
现在的现象是这样的,第一次按按键之后keyPressTime 一直在增加,不管按不按按键
松开的时候并不进入长按短按判断程序,只有按下的瞬间(下降沿)进入按键程序,松开的时候并不进入,就无法检测长按和短按了
但是设置的是查询方式,怎么感觉是中断方式
static void zclSampleDoorLockController_HandleKeys( byte shift, byte keys ){ (void)shift; // Intentionally unreferenced parameter if( keys) { keyPressTime = osal_getClock(); } else { if ( keyPressTime ) { keyPressTime = ( osal_getClock() – keyPressTime ); if ( keyPressTime < 3 )//小于3秒,短按 { NLME_PermitJoiningRequest(30);//允许加入 } else //大于3秒,长按 { //恢复出厂设置 zgWriteStartupOptions( ZG_STARTUP_SET, (ZCD_STARTOPT_DEFAULT_NETWORK_STATE | ZCD_STARTOPT_DEFAULT_CONFIG_STATE) ); SystemResetSoft(); } keyPressTime = 0; } }}
YiKai Chen:
回复 user5367314:
要改變上下緣觸發可以到hal_sys_ctrl.c的SysCtrlWakeupSetting()去改
user5367314:
按键按下去,不进去下面的函数,松开的时候才进入,
这样就没法识别是长按还是短按,请问怎么设置按下就开始计时,松开计时结束?
现在按下进入不了函数,没法开始计时
case KEY_CHANGE: zclSampleDoorLockController_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys ); break;
YiKai Chen:
請不要重複發文,對解決問題沒有幫助,已經在你另一個類似的發文回覆
user5367314:
回复 YiKai Chen:
不好意思,下次知道了
1.在CC2538的协议栈里有个osal_getClock函数,可以通过他去检测按键的长按和短按
那么在CC2630的协议栈里面怎么调用类似的函数?
2.按键长按和短按识别,建议用中断的方式还是查询的方式?
YiKai Chen:
回复 user5367314:
1. 可以;CC2630的协议栈里面怎么调用类似的函数是指什麼类似的函数
2. 建议用中断