Перейти к содержанию
    

?Реакция на продолжительное нажатие кнопки

Прошу помощи. Написал такой текст. По сценарию, при удержании кнопки в течении времени декременирования "Count",по истечении этого времени, если кнопка еще нажата, загорается СИД.При отпускании кнопки, сид гаснет. Соответственно на короткие нажатия СИД не должен реагировать. НО он реагирует. Произвожу короткие последовательние нажатия и он начинает помаргивать... Подскажите, пожалуйста, в чем ошибка, чего я не учел?

 

int main()

{
  ConfigureButton();

  //Main Loop   
 while(1) 
 {   
       if((AT91C_BASE_PIOA->PIO_PDSR & 0x00100000) == 0)//Если кнопка нажата.

       {
          long int Count = Delay_3sec;//Запись в Count числа
          while (((AT91C_BASE_PIOA->PIO_PDSR & 0x00100000) == 0)&&(Count > 0))//Если кнопка нажата и Count не пуст.
                 {
                  Count = Count -1; //Декременируем Count.
                 }  
         AT91C_BASE_PIOA->PIO_CODR = 0x00000001;   //0 on PA0, LED on/ Count пуст и кнопка еще ножата, тогда зажигаем LED. 
       }  

     else //Если кнопка не нажималась (или ее отпустили). 
       {
         AT91C_BASE_PIOA->PIO_SODR = 0x00000001;   //1 on PA0, LED off  //Гасим LED.
       }

 }


}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не понимаю, почему. Если не слишком часто производить кратковременные нажатия, СИД не загорается...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот на что люди расходуют мощность АРМов - на декремент каунта в течение 3 секунд...

Охренеть-не встать!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

long int Count = Delay_3sec;//Запись в Count числа
while (((AT91C_BASE_PIOA->PIO_PDSR & 0x00100000) == 0)&&(Count > 0))//Если кнопка нажата и Count не пуст.
{
  Count = Count -1; //Декременируем Count.
}  
AT91C_BASE_PIOA->PIO_CODR = 0x00000001;   // ЗДЕСЬ БЕДА
}
}

 

Беда в том, что включение СИДа у Вас происходит в любом случае, независимо от того почему закончился цикл - то ли кнопку отпустили, то ли время уже прошло. Вам не хватает if для проверки причины завершения цикла.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот на что люди расходуют мощность АРМов - на декремент каунта в течение 3 секунд...

Охренеть-не встать!

Извините, но на моем этапе это не важно...

 

 

 

 

 

 

 

shasik, спасибо большое, все заработало!!!

Изменено пользователем Markfly

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 long int Count = Delay_3sec;//Запись в Count числа
 while (((AT91C_BASE_PIOA->PIO_PDSR & 0x00100000) == 0)&&(Count > 0))//Если кнопка нажата и Count не пуст.
                  {
   Count = Count -1; //Декременируем Count.
 }  
if (!Count) AT91C_BASE_PIOA->PIO_CODR = 0x00000001;   //0 on PA0, LED on/ Count пуст и кнопка еще ножата, тогда зажигаем LED. 
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...