2017-01-11 3 views
0

Я написал код для определения состояния кнопки, который долгое нажатие или нет. Кстати, эта функция вызывает процедуру прерывания таймера в каждые 1 мс.Двойной алгоритм кнопки состояния в C

Если вы нажали более 1 секунды, нажатие активно, короткое нажатие является пассивным. Наоборот.

1- Но кажется, что это действительно фиктивный способ, как я могу сделать его более коротким и более эффективным в соответствии с правилами как для чтения, так и для профессиональных?

BTW Я обновил код, как показано ниже.

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 
{ 
    /*button pressed and count*/ 
    if(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)) 
    { 
     usTick++; 
    } 
    /*not pressed*/ 
    else 
    { 
     if(usTick > 1000){ 
      ButtonState.PressedState = LongPressed; 
      HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);  
      usTick = 0; 
     } 
     else if(usTick >350){ 
      ButtonState.PressedState = ShortPressed; 
      HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);    
      usTick = 0; 
     }    
     usTick = 0; 
    } 
} 

2- Что нужно добавить или изменить, чтобы получить двойное нажатие, нажав информацию в этом обновленном коде?

+4

Возможно, вы захотите переместить это на http://codereview.stackexchange.com/ – mascoj

+0

Возможно, лучше полагаться на прерывания GPIO_PIN_13', а не на прерывания таймера. –

+0

Хорошо, не знал этого. Я переведу его – ree

ответ

0

Почти каждый таймер STM32 имеет функцию «синхронизации внешнего триггера». Вы можете прочитать об этом в описании функций таймера в справочном руководстве. Вы можете использовать «Режим ведомого: режим триггера», чтобы начать считать событие «кнопка вниз». И в прерывании EXTI «события кнопки» вы можете читать счетчик таймеров и делать свой бизнес.

Я не знаю, как реализовать это через HAL, но в стандартной периферийной библиотеке должен быть пример.

+0

Кроме того, таймеры STM32 имеют режим ввода PWM, который может использоваться для измерения продолжительности одного сигнала. Этот способ более сложный в кодировании, но также более красивый. Может быть, есть и другие способы, потому что таймеры STM32 очень умны, чтобы найти их, вы можете прочитать хотя бы справочную оглавление :) – Yuriy

0

1) Ваш код может только обрабатывать 1 кнопку. Сделать его объектно ориентированным читать n кнопок.

1 мс слишком быстро. 20 мс должны работать нормально. Помните: люди медленны.

2) Я как-то потратил некоторое время на создание светодиодного контроллера с двумя кнопочными поворотными энкодерами. Они будут использовать расширенные методы программирования путем их длительного или многократного нажатия. Вы можете использовать результат моего спарринга (он никогда не был завершен) как вдохновение. Код кнопки довольно сложный, он должен соответствовать вашим потребностям. И я помню, что это было функционально.

https://github.com/Jeroen6/LED-Rotary-Dimmer-SW/blob/master/user/button.c https://github.com/Jeroen6/LED-Rotary-Dimmer-SW/blob/master/user/button.h

Прости меня за отсутствие углублений работал правильно.