Views: 386
Самый недорогой и простой вариант ввода данных в устройство на микроконтроллерах, это считывание состояния тактовых кнопок. Для подключения к порту микроконтроллера достаточно одного резистора. А если порт позволяет подключать встроенные подтягивающие резисторы, то подключение имеет элементарно простой вид:
Самый эффективный вариант опроса кнопок и формирования управляющих флагов, это когда обработка выполняется через прерывания. Для семейства 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;
}
Т.е. как видно, все очень просто!
Это может быть интересно
ch-светомузыка и AK4113Views: 1510 Пришло время вернуться к светомузыке. На сегодня использование аналогового входа стало непрактичным, на сегодня необходимо использовать S/PDIF и Toslink. С этим надо было как то разобрать, что это …
Простой цифровой вольтметр ch-c3200Views: 2633 В этой статье рассмотрен пример создания простого вольтметра постоянного тока на основе печатной платы ch-c0030pcb, а при возможности использования внешнего делителя и вольтметр переменного тока. Дан краткий принцип …
I2C MODULE – PIC18F25K42 Device ID Revision = A001Views: 1203 I2C MODULE Обход ошибок в версии I2C MODULE – PIC18F25K42 Device ID Revision = A001 В Серии K42 применен совершенно новый модуль шины I2C, который позволяет поддерживать все …
REFERENCE CLOCK OUTPUT MODULEViews: 595 REFERENCE CLOCK OUTPUT MODULE Модуль формирования опорного тактового сигнала Модуль опорного тактового сигнала обеспечивает возможность посылать сигнал синхронизации на тактовый опорный выходной контакт или контакты (CLKR) в зависимости от …
Altium Designer my Libraries, Project templates, System settings by Catcatcat V24.0 PROViews: 530 Назвемо цей варіант поновлення для професіоналів і не тільки. Що нового? 1. Повністю змінено структуру параметрів бази даних компонента. Це дозволило повноцінної роботи Актив ВОМ. Ви відразу отримуєте …
Самый простой диммер для светодиодного освещенияViews: 3197 Светодиоды все больше входят в нашу жизнь как источники освещения и как само собой разумеющееся, это вопрос регулировки яркости. Существует множество схемных решений, но в нашем варианте мы …
OLED RET012864E/REX012864JViews: 1595 RET012864E/REX012864J ОЛЕД индикатор производитель Raystar-Optronics приобретался в http://www.microchip.ua/ к сожалению никакой информации на сайте поставщика нет. Поэтому решил работу с этой версией индикатора на драйвере SSD1305 предоставить на своем сайте. Так как …
Мультизоновый индикатор-терморегулятор ch-c3010Views: 1341 Часто возникает необходимость получить информацию по температуре с множества точек контроля. Вам необходимо знать температуру в комнате, в коридоре, температуру на улице, а в погребе (или на балконе) …
LCD драйвер – UC1601sViews: 1816 http://svetomuzyka.narod.ru/project/UC1601s.html Читайте обновление на http://catcatcat.d-lan.dp.ua/?page_id=178 В данный момент можно приобрести в ООО “Гамма” несколько типов индикаторов на драйвере UC1601s. RDX0048-GC, RDX0077-GS, RDX0154-GC и RDX0120-GC выполнены по технологии COG.
LED модуль P10 (1R) V706AViews: 7946 Это еще одно чудо от китайского брата. Это монохромные матрицы, называются они P10 (1R) V706A, ну типа R-красные, но не верьте паяют светики и зеленые и синие, в общем …
