Урок 36
Часть 1
Модуль LCD 16×2 .Продолжаем работать с кнопками
На прошлом занятии мы научились работать с кнопками модуля дисплея LCD 16×2 и написали некоторую реакцию на кнопки.
Сегодня же мы постараемся улучшить данный алгоритм работы и написать код реакции на события изменения состояния кнопок с тем учётом, чтобы, во-первых, состояние кнопок отслеживалось в процессах, не мешающим выполнению основного кода, а во-вторых, чтобы мы могли в данных процессах отследить не только состояние кнопок, а ещё и изменение состояния кнопок, то есть процесс отжатия или нажатия кнопки. Причём, как правило, мы все наблюдаем, что реакция всегда происходит не на нажатие кнопки, а именно на отжатие. И данный алгоритм не только звучит тяжело, но и собственно код также не обещает быть лёгким. Поэтому данную поставленную задачу мы будем решать поэтапно.
Во-первых, конечно, нам необходим будет проект. Так же, как и в прошлом занятии, мы создадим новый проект, выбрав контроллер Atmega8a, и назовём его LCDBUTTONMODE. Скопируем файлы main.h, lcd.c, lcd.h, adc.c, и adc.h в папку с проектом туда, где лежит файл main.c. Также данные файлы подключим к дереву проекта таким же образом, как и в прошлом занятии. Создадим ещё два новых файла button.c и button.h. Удалим полностью содержимое файла main.c и скопируем туда содержимое одноимённого файла из предыдущего проекта LCDBUTTON.
Подключим файл button.h в main.h и в button.c
#include «button.h»
Попробуем собрать код. Скопируем, переименуем в имя проекта из предыдущего проекта также файл для протеуса и запустим его. Исправим там путь до прошивки и изменим немного настройки в плане использования кварцевого резонатора на 16 МГц
Также добавим в схему собственно сам резонатор
Если всё нормально собралось и запустилось, то пишем код дальше. Соответственно лучшего решения для отвязывания задачи от выполнения основного алгоритма кода, чем использование таймеров, я не нашёл, поэтому мы и воспользуемся таймером. Таймер возьмём самый простой – нулевой, так как вдруг первый потребуется для более серьёзных задач, чем обработка нажатий и отжатий кнопок. Подключим файл main.h в файле button.h
#define BUTTON_H_
#include «main.h»
#endif /* BUTTON_H_ */
Добавим код для таймера в файл button.c
#include «button.h»
//—————————————
void init_button_timer(void)
{
TIMSK |= (1<<TOIE0); //устанавливаем бит разрешения прерывания 0-ого счетчика по переполнению
TCCR0 |= (0<<CS02)|(1<<CS01)|(1<<CS00); // устанавливаем предделитель 64
//тем самым получаем — частота тактирования / предделитель / 256 = 16000000/64/256 = 976,5625 (около милисекунды)
//делим на 256, так как таймер нулевой всегда считает от 0x00 до 0xFF и это не регулируется никак
}
//—————————————
ISR (TIMER0_OVF_vect)
{
}
Для хранения состояния кнопок в файле button.h создадим массив для хранения статусов кнопок
#include «main.h»
//——————————————-
unsigned char button_state[5];
//——————————————-
Там же создадим макросы для кнопок
unsigned char button_state[5];
//——————————————-
#define Button_Right 0x00
#define Button_Up 0x01
#define Button_Down 0x02
#define Button_Left 0x03
#define Button_Select 0x04
//——————————————-
И ещё создадим макросы для состояния кнопок. В макроподстановках используем разные биты.
#define Button_Select 0x04
//——————————————-
#define ST_PRESSED 0b00000001 //кнопка нажата
#define ST_UNPRESSED 0b00000010 //кнопка отжата
#define ST_ERROR 0b00000100 //не удалось считать статус
#define ST_PRESSURE 0b00001000 //процесс нажатия кнопки
#define ST_UNPRESSURE 0b00010000 //процесс отжатия кнопки
#define ST_LOCKED 0b00100000 //кнопка недоступна
//——————————————-
Попробуем собрать код, а также запустить прошивку в протеусе. Всё у нас работает, то есть мы своим кодом ничего не запортилось.
Дальнейший код реализации задуманных режимов мы продолжим писать в следующей части урока.
Предыдущий урок Программирование МК AVR Следующая часть
Приобрести программатор USBASP USBISP с адаптером можно здесь USBASP USBISP 3.3 с адаптером
Смотреть ВИДЕОУРОК
Добавить комментарий