TI中文支持网
TI专业的中文技术问题搜集分享网站

CC2538按键长按短按

你好,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. 建议用中断

赞(0)
未经允许不得转载:TI中文支持网 » CC2538按键长按短按
分享到: 更多 (0)