如何检查按钮是否在 500 毫秒内被按下两次(PIC16)?
How to check if a button is pressed twice within 500 ms (PIC16)?
我有一个连接到 RB1 的开关按钮。此按钮用作重置,但需要按两次才能起作用。如果第二次按下发生在 500 毫秒后(相对于第一次按下),它将不执行任何操作。
我想我应该使用计时器或 ccp 模块,但我不确定如何实现它们。你有什么建议?
编辑(我的 ISR):
void interrupt ISR(void){
GIE = 0;
if(INTF){
INTF = 0;
if(reset_press == 0){
TMR1 = 0x0BDC; // counter starts counting at 0x0BDC (3036)
TMR1ON = 1; // Turns on Timer1 (T1CON reg)
}
reset_press++;
}
else if(TMR1IF==1){ // checks Timer1 interrupt flag
TMR1IF = 0; // clears interrupt flag
if(reset_press == 2){
reset_count(); // reset function
}
TMR1ON = 0; // Turns off Timer1 (T1CON reg)
reset_press = 0;
}
GIE = 1;
}
- 在初始化时将定时器或 CCP 设置一次 500 毫秒,但不要触发它。 (根据 osc 频率,您可能必须使用额外的字节来保存对应于 500ms 的值)。
- 进入main的superloop后,检测按键按下;使用标志或计数器来计算按钮按下的次数。一旦检测到第一次按下,启动 500 毫秒计时器。
- 如果500ms的时间又过去了(你可以在中断中检测到),那意味着你什么都不做,所以重新设置一切;按钮按下计数器、发射计时器等
- 同时在500ms没有重复之前,如果检测到二次按下;那就是按下计数器的值必须是 2,然后你执行你想要的,然后为下一次两次按钮按下检测重置所有内容。
我有一个连接到 RB1 的开关按钮。此按钮用作重置,但需要按两次才能起作用。如果第二次按下发生在 500 毫秒后(相对于第一次按下),它将不执行任何操作。
我想我应该使用计时器或 ccp 模块,但我不确定如何实现它们。你有什么建议?
编辑(我的 ISR):
void interrupt ISR(void){
GIE = 0;
if(INTF){
INTF = 0;
if(reset_press == 0){
TMR1 = 0x0BDC; // counter starts counting at 0x0BDC (3036)
TMR1ON = 1; // Turns on Timer1 (T1CON reg)
}
reset_press++;
}
else if(TMR1IF==1){ // checks Timer1 interrupt flag
TMR1IF = 0; // clears interrupt flag
if(reset_press == 2){
reset_count(); // reset function
}
TMR1ON = 0; // Turns off Timer1 (T1CON reg)
reset_press = 0;
}
GIE = 1;
}
- 在初始化时将定时器或 CCP 设置一次 500 毫秒,但不要触发它。 (根据 osc 频率,您可能必须使用额外的字节来保存对应于 500ms 的值)。
- 进入main的superloop后,检测按键按下;使用标志或计数器来计算按钮按下的次数。一旦检测到第一次按下,启动 500 毫秒计时器。
- 如果500ms的时间又过去了(你可以在中断中检测到),那意味着你什么都不做,所以重新设置一切;按钮按下计数器、发射计时器等
- 同时在500ms没有重复之前,如果检测到二次按下;那就是按下计数器的值必须是 2,然后你执行你想要的,然后为下一次两次按钮按下检测重置所有内容。