Библиотека HAL. LCD 20×4. 4-битный режим

21.12.2016

Библиотека HAL. LCD 20×4. 4-битный режим

Библиотека HAL. LCD 20×4. 4-битный режим

Предыдущий урок Программирование МК STM32 Следующий урок

Сегодня мы начинаем работать с подключением дисплея. Так как светодиоды — это очень красиво, но нужно ещё как-то и информацию какую-то смотреть.

Мы будем подключать дисплей на контроллере HD44780, хотя в даташите указан S6A0069, который является также аналогом первого. Дисплей отображает символьную информацию размерностью 4 строки по 20 символов. И подключать мы будем данный дисплей 4-битным образом. Так мы можем сэкономить 4 ножки порта. В данном режиме мы передаем данные по половине байта, сначала старшую часть, потом младшую.

Выглядит данный дисплей следующим образом:

Дисплей к микроконтроллеру STM32F407VG мы подключим вот таким образом (нажмите на картинку для увеличения изображения)

На схеме изображен индикаотор 20х2, но смысл тот же, просто в программе не нашлось дисплея 20х4.

По подключению дисплея и работе с ним в 4-битном режиме можно подробно посмотреть в уроке по AVR, в котором мы рассматривали дисплей 16х2.

Но всё равно я должен напомнить, что GND и VCC зачастую могут меняться местами в зависимости от типа дисплея, поэтому смотрите документацию именно на свой дисплей, иначе он неминуемо выйдет из строя.

В принципе тем самым мы разобрали уже назначение 1 и 2 ножек модуля дисплея.

Назначение следующих ножек модуля:

3 — V0 — это ножка, с помощью которой регулируется контрастность дисплея. То есть контрастность дисплея будет зависеть от поданного напряжения на данную ножку. Как правило берётся переменный резистор на 10 килоом, подключенный крайними ножками на общий провод и на питание, а с центральной ножки данного резистора провод идёт как раз на ножку V0 и посредством регулировки движка резистора мы и регулируем контрастность дисплея в модуле.

4 — RS — это такая хитрая ножка, с помощью которой контроллер дисплея будет «знать», какие именно данные нахдятся на шине данных. Если мы подадим на данную ножку логический 0, то значит будет команда, если 1 — то это данные.

5 — RW — данная ножка в зависимости от логического состояния на ней говорит контроллеру дисплея, будем мы с него читать или будем мы в него писать данные. Если будет 0 — то мы в контроллер дисплея будем писать, а если 1 — то будем читать данные из контроллера дисплея. Данная функция используется редко. Как правило мы всегда только пишем данные в дисплей. Чтение обычно требуется для того, чтобы определить, что дисплей принял наши данные, либо чтобы определить состояние. Но существуют определённые тайминги, позволяющие нам на слово «верить» котнроллеру дисплея, что он наши данные принял и обработал. Также читать мы можем из памяти дисплея, что, в принципе, незачем. Поэтому мы обычно соединяем данный контакт с общим проводом.

6 — E — это так называемая стробирующая шина, по спадающему фронту (когда 1 меняется в 0) на которой контроллер дисплея понимает, что именно сейчас наступил момент чтения данных на ножках данных D0 — D7, либо передачи данных из модуля в зависимости также от состояния ножки RW.

Ножки D0 — D7 — это параллельная восьмибитная шина данных, через которую и передаются или принимаются данные. Номера 0 — 7 соответствуют одноименным битам в байте данных. Но также есть ещё 4-битный способ передачи данных в контроллер и из контроллера дисплея, когда используются только ножки данных D4 — D7, а ножки D0 — D3 уже не используются. Как правило такой способ используется в целях экономии ножек порта и именно такой способ мы и будем сегодня использовать, так как мы теряем скорость вдвое, но у нас дисплей символьный и спешить нам некуда. В 4-битном режиме мы передаём или принимаем байт в 2 приёма по половинке, сначала старшую часть байта, затем младшую.

Ножки A и K — это анод и катод для подачи напряжения для питания светодиодной подсветки дисплея. Как правило можно питать от 5 вольт, и от 3 вольт, но желательно поставить токоограничивающий резистор на 100 ом и скорее всего тогда подсветка дисплея «проживёт» дольше. Всё это обычно указывается в технической документации на дисплей. Мы поставим на 330.

Для данных мы будем использовать порт D, а для урпавления — 8 и 9 ножки порта B.

Чтобы нам получить определённый символ в определённом месте дисплея, нам необходимо код данного символа отправить по определённому адресу в память DDRAM. Для этого в технической документации существует вот такая информация

Здесь мы видим, по какому адресу нам нужно будет отправлять байт с кодом символа.

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

Также условием выполнения команды именно с таким временным интервалом является тактирование контроллера дисплея частотой 270 кГц.

Также чтобы запустить наш дисплей в работу, так как там существует контроллер, нужна будет первоначальная инициализация. В докуентации, правда в другой — на дисплей 1602 есть порядок инициализации. Он ничем не отличается от инициализации дисплея 2004. Для 4-битного способа подключения он такой

Проект MYLCD80 я сделал из TEST002 таким же образом, как и на прошлом занятии.

Открываем MYLCD80 в кубе. Отключаем таймер TIM6

Также за ненадобностью отключим лапки PA1,PD12,PD13,PD14,PD15

Включим на выход лапки PB8, PB9,PD0,PD4,PD5,PD6,PD7

В настройках вообще ничего не трогаем. Генерируем проект, собираем.

Видим ошибки на наш ручной код по таймеру, убираем строку

tim6_counter=0;

а также всё написанное нами из бесконечного цикла.

Из main.h переменную

uint8_t tim6_counter;

Подключаем новые файлы lcd.h и lcd.c с содержимым:

#ifndef LCD_H_

#define LCD_H_

#include «stm32f4xx_hal.h»

#endif /* LCD_H_ */

#include «lcd.h»

Затем подключаем lcd.h к main.h

#include «lcd.h»

Напишем дефайны в файл lcd.h, для удобного управления уровнями на ножках данных

//—————————————-

#define d4_set() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4, GPIO_PIN_SET)

#define d5_set() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_5, GPIO_PIN_SET)

#define d6_set() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, GPIO_PIN_SET)

#define d7_set() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_SET)

#define d4_reset() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4, GPIO_PIN_RESET)

#define d5_reset() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_5, GPIO_PIN_RESET)

#define d6_reset() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, GPIO_PIN_RESET)

#define d7_reset() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_RESET)

#define e1 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET) // установка линии E в 1

#define e0 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET) // установка линии E в 0

#define rs1 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET) // установка линии RS в 1 (данные)

#define rs0 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET) // установка линии RS в 0 (команда)

//—————————————-

Смотрим выше таблицу, как инициализировать 4-битный режим и собственно пишем инициализацию.

Начинаем с задержки

void LCD_ini(void)

HAL_Delay(40);

Пишем на нее прототип в заголовочный файл.

Затем нам нужно написать функцию записи данных в память дисплея

void LCD_WriteData(uint8_t dt)

if(((dt >> 3)&0x01)==1) {d7_set();} else {d7_reset();}

if(((dt >> 2)&0x01)==1) {d6_set();} else {d6_reset();}

if(((dt >> 1)&0x01)==1) {d5_set();} else {d5_reset();}

if((dt&0x01)==1) {d4_set();} else {d4_reset();}

Напишем функцию для небольшой задержки

void delay(void)

uint16_t i;

for(i=0;i<1000;i++)

Теперь напишем функцию для команд

void LCD_Command(uint8_t dt)

rs0;

LCD_WriteData(dt>>4);

e1;

delay();

e0;

LCD_WriteData(dt);

e1;

delay();

e0;

Затем продолжим писать функцию инициализации дисплея, поглядыая время от времени в техническую документацию и в урок по AVR, где было рассказано уже про каждую команду

void LCD_ini(void)

HAL_Delay(40);

rs0;

LCD_WriteData(3);

e1;

delay();

e0;

HAL_Delay(1);

LCD_WriteData(3);

e1;

delay();

e0;

HAL_Delay(1);

LCD_WriteData(3);

e1;

delay();

e0;

HAL_Delay(1);

LCD_Command(0x28);//режим 4 бит, 2 линии (для нашего большого дисплея это 4 линии), шрифт 5х8

HAL_Delay(1);

LCD_Command(0x28);//еще раз для верности

HAL_Delay(1);

LCD_Command(0x0F);//дисплей включаем (D=1), также включаем пока все курсоры

HAL_Delay(1);

LCD_Command(0x01);//уберем мусор

HAL_Delay(2);

LCD_Command(0x06);//пишем влево.

HAL_Delay(1);

LCD_Command(0x02);//возврат курсора в нулевое положение

HAL_Delay(2);

Вызываем инициализацию из главного модуля

/* USER CODE BEGIN 2 */

LCD_ini();

/* USER CODE END 2 */

Прошиваем, смотрим.

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

На следующем занятии мы попытаемся уже вывести какую-то информацию на дисплей, сначала посимвольно, а потом и целыми строками.

Предыдущий урок Программирование МК STM32 Следующий урок

Техническая документация:

Дисплей LCD2004

Дисплей LCD1602

Отладочную плату и дисплей LCD 20×4 можно приобрести здесь:

STM32F4-DISCOVERY

Дисплей LCD 20×4

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

Источник: narodstream.ru

Читайте также:

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

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