PS
пытаюсь учиться програмировать на языке си
благодарен за любую оказанную помощ
На каком компиляторе работаешь?vovik15 писал(а):пытаюсь учиться програмировать на языке си
проверяешь состояние кнопки 20-50 раз в секундуvovik15 писал(а):благодарен за любую оказанную помощ
Правильно делать по-другому. В цикле непрерывно читаешь кнопку, если состояние изменилось - счетчик в ноль. Если состояние не меняется N циклов, то считаем его стабильным и обрабатываем. N зависит от частоты опроса, длительность те самые 0.1-0.2с. Величина N - обычно десятки.b612 писал(а):проверяешь состояние кнопки 20-50 раз в секундуvovik15 писал(а):благодарен за любую оказанную помощ
если состояние кнопки изменилось (не важно нажали или отпустили) делаешь то, что нужно при нажатии(отпускании). и перестаёшь опрашивать примерно на 0.1-0.2 секунды
через 0.1-0.2 секунды возобновляешь опрос.
Код: Выделить всё
/* Key Accumulator */
static uint16_t KeyAcc = 0;
/* Key State */
static uint16_t Key = 0;
/*
* Read Key
*/
void ReadKey() {
KeyAcc = KeyAcc << 1;
KeyAcc |= !(KEYPORT & KEYPIN);
if(KeyAcc == 0xFFFF) Key = 1;
if(KeyAcc == 0) Key = 0;
}Нет, ненормально. Вообще желательно сразу забыть про delay_ms(100);neon-f писал(а):Подскажите, вот так нормально опрашивать кнопки и подавлять дребезг. Три кнопки подключены к портам PD3, PD4, PD5.
честно? - много незнакомых букв. я еще совсем зеленый в программировании. У меня опрос кнопок сделан в виде функции, т.е. когда мне нужно прочесть состояние кнопок, я обращаюсь к функции опроса, один раз опрашиваю и возврвщаюсь в основную программу. К тому же если не одна из кнопок не нажата, то задержка вообще не используетсяPavel V. писал(а):Чем не устраивает мой пример?
Я тоже так подумал, поэтому на отпускание кнопки поставил delay_ms(50), а на нажатие delay_ms(100);_noise писал(а):Основной цикл - сам по себе задержка,
а по моему реальный вариант......_noise писал(а):приколоться: основной цикл = делай_мс() и опрос кнопок только, а все полезные действия по прерываниям?
Код: Выделить всё
/* Key Accumulator */
static uint16_t KeyAcc = 0; // Глобальная переменная для хранения последовательности состояний кнопки (аккумулятор)
/* Key State */
static uint16_t Key = 0; // Глобальная переменная состояния кнопки (после подавления дребезга)
/*
* Функция опроса состояния кнопки
*/
void ReadKey() {
KeyAcc = KeyAcc << 1; // Сдвигаем аккумулятор влево на 1 бит
KeyAcc |= !(KEYPORT & KEYPIN); // читаем состояние ножки KEYPIN на порту KEYPORT и добавляем новое значение к аккумулятору
if(KeyAcc == 0xFFFF) Key = 1; // если 16 раз подряд на ножке лог. 0, то кнопка нажата
if(KeyAcc == 0) Key = 0; // если 16 раз подряд на ножке лог. 1, то кнопка отпущена
}Код: Выделить всё
if(Key) { // Кнопка нажата
делаем что-то;
}