Ускорьте мигание светодиодов через 2 секунды
В моем ST32L c
Приложение Я хочу ускорить мигание светодиодов. С кодом ниже я могу нажать кнопку, и светодиоды будут мигать быстрее. Когда я отпущу, светодиоды будут нормально мигать.
Как я могу проверить, нажата ли кнопка как минимум на 2 секунды и после этого ускорить светодиоды?
int i = 0;
while (1) {
bool wasSwitchClosedThisPeriod = false;
while (i++ < speed) {
// Poll the switch to see if it is closed.
// The Button is pressed here
if ((*(int*)(0x40020010) & 0x0001) != 0) {
wasSwitchClosedThisPeriod = true;
}
}
// Blinking led
*(int*) (0x40020414) ^= 0xC0;
i = 0;
if (wasSwitchClosedThisPeriod) {
speed = speed * 2;
if (speed > 400000) {
speed = 100000;
}
}
}
2 ответа
Вам необходимо использовать встроенные аппаратные таймеры в микроконтроллере. Самый простой способ - использовать повторяющийся таймер, который увеличивает счетчик каждые x единиц времени. Пусть таймер ISR опрашивает порт кнопки. Если кнопка найдена неактивной, сбросьте счетчик, в противном случае увеличьте его. Пример:
static volatile uint16_t button_count = 0;
void timer_isr (void) // called once per 1ms or so
{
// clear interrupt source here
if((button_port & mask) == 0)
{
button_count = 0;
}
else
{
if(button_count < MAX)
{
button_count++;
}
}
}
...
if(button_count > 2000)
{
change speed
}
Таким образом, вы также получаете сигнал отскока кнопки бесплатно. Вы должны всегда иметь де-прыгуны, и в вашем текущем коде этого, похоже, нет.
Без ISR у вас должно быть что-то в цикле, которое, по крайней мере, гарантирует, что прошло определенное время (сон / ожидание / задержка в течение нескольких миллисекунд) и счетчики.