Markfly 0 10 июля, 2009 Опубликовано 10 июля, 2009 · Жалоба Прошу помощи. Написал такой текст. По сценарию, при удержании кнопки в течении времени декременирования "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. } } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pepl 0 10 июля, 2009 Опубликовано 10 июля, 2009 · Жалоба Так и будет в вашем случае СИД зажгется в любом случае при нажатии кнопки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Markfly 0 10 июля, 2009 Опубликовано 10 июля, 2009 · Жалоба Не понимаю, почему. Если не слишком часто производить кратковременные нажатия, СИД не загорается... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 10 июля, 2009 Опубликовано 10 июля, 2009 · Жалоба Вот на что люди расходуют мощность АРМов - на декремент каунта в течение 3 секунд... Охренеть-не встать! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shasik 0 10 июля, 2009 Опубликовано 10 июля, 2009 · Жалоба 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 для проверки причины завершения цикла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Markfly 0 10 июля, 2009 Опубликовано 10 июля, 2009 (изменено) · Жалоба Вот на что люди расходуют мощность АРМов - на декремент каунта в течение 3 секунд... Охренеть-не встать! Извините, но на моем этапе это не важно... shasik, спасибо большое, все заработало!!! Изменено 10 июля, 2009 пользователем Markfly Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 10 июля, 2009 Опубликовано 10 июля, 2009 · Жалоба 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. } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться