Существует несколько возможностей, но простой способ - зафиксировать время события нажатия кнопки и сравнить его с текущим временем.
Аппаратно-интенсивный метод состоит в подключении каждой кнопки ктаймер захвата входа.Время нажатия кнопки будет зафиксировано, и время ее удержания будет текущим значением таймера минус время захвата.Затем ваше приложение может определить для каждой кнопки, которая находится в нерабочем состоянии, как долго это было.
Однако для этого метода требуется по одной единице захвата таймера для каждой кнопки.Менее дорогостоящее решение состоит в том, чтобы подключить каждую кнопку к входу GPIO EXTI и для каждой кнопки зафиксировать время нажатия кнопки на прерывании при нажатии кнопки.
В любом случае обработка захваченного времени идентична.
Псевдокод:
int downTime( int button_id )
{
int down_time = 0 ;
// If the button is down, report how long it has been down
if( buttonDown( button_id ) )
{
down_time = buttonTimerNow( button_id ) - buttonTimerCapture( button_id ) ;
}
return down_time ;
}
bool pressed( int button_id )
{
// The button is pressed, if it has been down for
// longer than the switch bounce time.
return downTime( button_id ) > DEBOUNCE_TIME ;
}
bool combinationPressed()
{
// Test for the required combination of currently
// simultaneously pressed buttons.
return pressed( BUTTON_A ) && pressed( BUTTON_B ) ;
}