Многокнопочная клавиатура

Views: 387


Самый недорогой и простой вариант ввода данных в устройство на микроконтроллерах, это считывание состояния тактовых кнопок. Для подключения к порту микроконтроллера достаточно одного резистора. А если порт позволяет подключать встроенные подтягивающие резисторы, то подключение имеет элементарно простой вид:

catcatcat_tact_01.png

Самый эффективный вариант опроса кнопок и формирования управляющих флагов, это когда обработка выполняется через прерывания. Для семейства PIC24 (MPLAB® XC16) это легко реализовать через прерывания по изменению состояния на входе порта B.

Для примера возьмём простую клавиатуру из 3 тактовых кнопок, из схемы на рисунке, с аналогичным подключением.

Первое что необходимо это для себя определить, какие флаги состояния нам необходимо получит при выполнении события по нажатию тактовой кнопки. При нажатии на кнопку PB1 – должен установиться флаг MINUS, для  PB2 – PLUS, для PB3 – FUNC. Дополнительно опишем флаги предыдущего состояния кнопок, они нам понадобиться, что-бы программа могла формировать только типа один импульс при нажатии кнопки, а не последовательность.

/* описываем флаги */
struct {
    unsigned RB3p : 1;  // флаг прошлого состояния
    unsigned RB4p : 1;  // флаг прошлого состояния
    unsigned RB5p : 1;  // флаг прошлого состояния
    unsigned FUNC : 1;  // флаг функция
    unsigned PLUS : 1;  // флаг увеличение
    unsigned MINUS : 1;  // флаг уменьшение

} Flagw; // Flagw.NAG название переменной (компилятор самостоятельно отводит количество байт)

Следующее – выполним настройку портов, выполнить настройку выводов порта – это делается при инициализации в начале программы.

/* настройка входов для клавиатуры*/
/* разрешение прерываний*/
CNEN1 = 0b0000000011100000;
CNEN2 = 0b0000000000000000;
/* включение подтягивающих резисторов*/
CNPU1 = 0b0000000011100000;
CNPU2 = 0b0000000000000000;
_CNIF = 0;/*сбросить прерывание*/
_CNIE = 1;/*включить прерывание*/

После этого надо создать саму функцию прерывания, а именно в этой функции будут описываться реакция на нажатия кнопок, у нас самое простое, при нажатии программа должно получить 1 импульс независимо от того как долго нажата кнопка.

/* прерывание от клавиатуры*/
void __attribute__((interrupt, auto_psv)) _CNInterrupt (void)
{
     __delay_us(100);
     if(!_RB5 && Flagw.RB5p) // если кнопка нажата и в предыдущем состоянии, она была отжата, то установить флаг MINUS
     {
         Flagw.MINUS=1;
     }
     else if(!_RB4 && Flagw.RB4p)
     {
         Flagw.PLUS=1;
     }
     else if(!_RB3 && Flagw.RB3p)
     {
         Flagw.FUNC=1;
     }
// запоминание предыдущего состояния кнопок клавиатуры
     Flagw.RB5p=_RB5;
     Flagw.RB4p=_RB4;
     Flagw.RB3p=_RB3;

     _CNIF = 0; // сброс прерывания
}

Из программы прерывания мы получаем флаги состояния кнопок, эти флаги легко обработать в основном цикле программы например так:

if(Flagw.PLUS)
{
   chettt++;
   Flagw.PLUS=0;
}

if(Flagw.MINUS)
{
   chettt--;
   Flagw.MINUS=0;
}

if(Flagw.FUNC)
{
   OledString ("тест",1,0,0,0,-1,70);
   Flagw.FUNC=0;
}

Т.е. как видно, все очень просто!



Это может быть интересно


  • Часы + Календарь + Термометр + …Часы + Календарь + Термометр + …
    Views: 2823 Часы + Календарь + Термометр + Индикатор влажности + Секундомер + Дистанционное управление на ИК лучах (пульты на RC-5 протоколе) + Автоматическая регулировка яркости + Возможность вывода данных через USB, …
  • ch-4050 – дифференциальный терморегуляторch-4050 – дифференциальный терморегулятор
    Views: 2080 ch-4050 – это не новая модель, это расширенная версия универсального терморегулятора ch-4000. Различия коснулись в появлении новой функции дифференциального регулирования. Это вид регулирования по разности температур измеренного двумя …
  • NS108-5050-16bit от NewstarNS108-5050-16bit от Newstar
    Views: 699 Кто уже использует в своих проектах адресуемые светодиоды хорошо знакомы с такими как WS2812 и им подобные. Эти светодиоды для управления используют однопроводную шину. Из-за этого пропускная способность …
  • Проект с использованием MCC часть 12-1Проект с использованием MCC часть 12-1
    Views: 1106 В настоящее время без визуализации информации уже не интересно. Поэтому научимся выводить информацию на дисплей. Для это возьмет простенький OLED RET012864E/REX012864J я такой приобретал в фирме “Гамма-Украина”, описание можно …
  • Moving average – скользящее среднееMoving average – скользящее среднее
    Views: 2446 Скользящая средняя, скользящее среднее (англ. moving average, MA) — общее название для семейства функций, значения которых в каждой точке определения равны среднему значению исходной функции за предыдущий период. Скользящие средние обычно используются с данными временных рядов для сглаживания …
  • Kitchen timer with contactless gesture controlKitchen timer with contactless gesture control
    Views: 794    Кухонний таймер з безконтактним керуванням жестами дозволяє встановити необхідний період часу для приготування страв, не торкаючись пристрою. Дуже зручно під час приготування їжі, коли руки забрудниться. Усі …
  • Acquaintance with audio-bluetooth modules F-6888 (BK3254).Acquaintance with audio-bluetooth modules F-6888 (BK3254).
    Views: 2400 Для проектов появилось необходимость познакомиться с недорогими модулями китайского производства, которые можно приобрести у нас в Украине и у китацев, на алиэкспрессе. Так как меня интересует не просто, …
  • Часы-кухонный таймерЧасы-кухонный таймер
    Views: 2904 Каждая кухня должна иметь кухонный таймер, который позволяет напоминать хозяйке когда проходить определенный промежуток времени. Например, печем пирог, варим яйца… , чтобы не смотреть постоянно на часы, установим таймер и …
  • Сенсорный выключатель светаСенсорный выключатель света
    Views: 16535 Хотя в настоящий момент актуальны системы управления освещением с передачей данных по электросети, но я думаю, что проекты такого рода тоже имеют право на жизнь. Анонс Три вида …
  • Проект с использованием MCC часть 10Проект с использованием MCC часть 10
    Views: 1066 Алгоритм управления освещением от нажатия кнопки. Обработка удержания кнопки: Мы должны проверить кнопка в настоящий момент нажата и флаг удержания установлен, если да Проверить таймер удержания “отработал” – …



Поделись этим!