AVR УРОК 36. Модуль LCD 16×2. Продолжаем работать с кнопками. Часть 1



Урок 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.

image00

 

 

Подключим файл button.h в main.h и в button.c

#include «button.h»

Попробуем собрать код. Скопируем, переименуем в имя проекта из предыдущего проекта также файл для протеуса и запустим его. Исправим там путь до прошивки и изменим немного настройки в плане использования кварцевого резонатора на 16 МГц

image02

Также добавим в схему собственно сам резонатор

image01

 

 

Если всё нормально собралось и запустилось, то пишем код дальше. Соответственно лучшего решения для отвязывания задачи от выполнения основного алгоритма кода, чем использование таймеров, я не нашёл, поэтому мы и воспользуемся таймером. Таймер возьмём самый простой – нулевой, так как вдруг первый потребуется для более серьёзных задач, чем обработка нажатий и отжатий кнопок. Подключим файл 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 с адаптером

 

 

Смотреть ВИДЕОУРОК

 

AVR Модуль LCD 16x2. Продолжаем работать с кнопками

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*