Сб янв 13, 2018 06:44:41
Вс янв 14, 2018 02:28:00
Вс янв 14, 2018 06:17:38
Вс янв 14, 2018 06:33:42
Вс янв 14, 2018 07:22:57
{// этот блок вызывается с частотой хх герц и опрашиваетикнопку
if (0xFF!=i) i++;
if (кнопка не нажата) i=0;
if (задержка антидребезга==i) действие;
}
Пн янв 15, 2018 00:23:01
Пн янв 15, 2018 07:24:12
#define button PINB.3
.................................
void butt (void)//процедура опроса кнопки
{
while (0==button) {};//кнопка нажата
действия при нажатии кнопки;
delay_ms(100);
while (1==button) {};//кнопка отпущена
действия при отпускании кнопки;
}
Пн янв 15, 2018 13:48:21
Пн янв 15, 2018 16:44:35
/* Key Accumulator */
static uint16_t KeyAcc = 0; // Глобальная переменная для хранения последовательности состояний кнопки (аккумулятор)
/* Key State */
static uint8_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, то кнопка отпущена
}
//Функцию ReadKey() необходимо вызывать либо из главного цикла, либо по прерыванию таймера. В основном цикле обрабатывать флаг Key.
//Код:
if(Key) { // Кнопка нажата
//делаем что-то;
}
Пн янв 15, 2018 17:24:31
Пн янв 15, 2018 20:20:21
Вт янв 16, 2018 07:56:19
Гефестион писал(а):...
Вт янв 16, 2018 09:46:02
Гефестион писал(а):по прерыванию от таймера
Вт янв 16, 2018 10:25:40
Вт янв 16, 2018 10:48:21
Ivanoff-iv писал(а):по прерыванию от таймера
Гефестион писал(а):...
Вт янв 16, 2018 11:38:55
таймер, то, всеравно задействован (таймерное прерывание) т.е. накладывает некоторые ограничения на таймера применение другим кодом, тут уж делать как удобней, если есть динамическая индикация - то просто грех к ней не присоседиться (и по линиям опроса и по прерываниям).Автомат использует один таймер (KEYB_TIMER).
так ведь конкретно при опросе кнопки (операция чтения регистра порта) тратится столькоже времени, что и при приращении таймера кнопки (эта то операция у тебя тоже в прерывании), да, присутствуют другие расходы, но они тоже не велики. (если конечно делаями антидребезг не замутили )Demiurg писал(а):Никогда не использую прерывания для опроса кнопок. Прерывания должны быть максимально короткими.
Вт янв 16, 2018 11:52:06
Вт янв 16, 2018 12:12:43
есть и другой: самое простое решение оказывается самым правильным. если длинный цикл проще сделать, и при этом "всё пучком" - почему нет? категоричность неубедительна.Demiurg писал(а):Есть такой подход: никаких долгих циклов.
Вт янв 16, 2018 13:01:26
Вт янв 16, 2018 14:37:32
есть и другой: самое простое решение оказывается самым правильным. если длинный цикл проще сделать, и при этом "всё пучком" - почему нет? категоричность неубедительна.Demiurg писал(а):Есть такой подход: никаких долгих циклов.