Игровая консоль на stm32 и lcd nokia 5110

Подключение дисплея Nokia 5110 к Arduino

В данной статье мы научимся работать с графическими LCD дисплеями на примере экрана Nokia 5110. Это довольно популярный дисплей, выделяющийся низкой стоимостью и возможностью выводить в удобном виде не только текстовые, но и графические данные (графики, изображения и т.д.). Разрешение экрана Nokia 5110 – 48×84 точки. Мы узнаем, как подключать дисплей Нокиа к Ардуино и приведем пример скетча для работы с ним.

Подключение дисплея 5110 к Ардуино

Для начала давайте рассмотрим подключение данного дисплея к Arduino и разберемся с интерфейсом передачи данных. На плате дисплея имеются 8 выводов:

  • RST — Reset (сброс);
  • CE — Chip Select (выбор устройства);
  • DC — Data/Command select (выбор режима);
  • DIn — Data In (данные);
  • Clk — Clock (тактирующий сигнал);
  • Vcc — питание 3.3В;
  • BL — Backlight (подсветка) 3.3В;
  • GND — земля.

Соединение

Как вы уже могли заметить, питание дисплея (Vcc) должно осуществляться напряжением не выше 3.3В, то же напряжение является максимальным и для подсветки дисплея (BL). Тем не менее, логические выводы толерантны к 5В логике, используемой Arduino. Но все же рекомендуется подключать логические выводы через резисторы 10 кОм, тем самым вы сможете продлить срок службы дисплея.

Также стоит отметить, что существуют версии дисплеев (как правило с красной платой) с выводом LIGHT вместо BL. В таком случае включение подсветки осуществляется подключением данного вывода к минусу питания (GND).

Пин RST (активный LOW) отвечает за перезагрузку дисплея, а с помощью пина CE (активный LOW) контроллеру дисплея сообщается что обмен данными происходит именно с ним. Вход DC отвечает за режим ввода – ввод данных, либо ввод команд (LOW – данные, HIGH – команды). Вход Clk позволяет контроллеру дисплея определять скорость передачи данных, а через пин DIn происходит непосредственно передача данных в контроллер дисплея.

Скетч и библиотека для работы с дисплеем

Для работы с данным дисплеем существует множество библиотек, мы же будем использовать весьма простую и функциональную библиотеку , доступную по адресу http://www.rinkydinkelectronics.com/library.php? >

ФункцияНазначение
LCD5110(SCK, MOSI, DC, RST, CS)Объявление дисплея с указанием пинов подключения.
InitLCD([contrast])Инициализация дисплея с опциональным указанием контрастности (0-127), по умолчанию используется значение 70.
setContrast(contrast)Изменение контрастности (0-127).
enableSleep()Переводит экран в спящий режим.
disableSleep()Выводит экран из спящего режима.
clrScr()Очищает экран.
clrRow(row, [start], [end])Очищает выбраную строку (номер row), от позиции start до end (опционально).
invert(true), invert(false)Включает и выключает инверсию содержимого LCD экрана.
print(string, x, y)Выводит строку символов (string) с заданными координатами (x, y); вместо x-координаты можно использовать LEFT, CENTER и RIGHT; высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8.
printNumI(num, x, y, [length], [filler])Выводит целое число (num) на экран на заданной позиции (x, y); опционально: length – количество символов, резервируемых для числа; filler – символ для заполнения «пустот», если число меньше желаемой длины length (по умолчанию это пробел ” “).
printNumF(num, dec, x, y, [divider], [length], [filler])Выводит число (num) с плавающей запятой; dec – число знаков после запятой; опционально: divider – знак десятичного разделителя, по умолчанию точка “.”, length и filler – по аналогии с предыдущей функцией.
setFont(name)Выбирает шрифт; встроенные шрифты – SmallFont, MediumNumbers и BigNumbers.
invertText(true), invertText(false)Инвертирует текст, выведенный с помощью функций print, printNumI и printNumF (вкл./выкл.).
drawBitmap(x, y, data, sx, sy)Выводит картинку на экран по необходимым координатам (x, y); data – массив, содержащий картинку; sx и sy – ширина и высота рисунка.

Рассмотрим работу с дисплеем с помощью данной библиотеки на примере простого скетча:

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

Для начала нам понадобится интересующее изображение в формате .bmp.

Далее необходимо скачать программу Image Generate от Alex_EXE по адресу https://alex-exe.ru/programm/image-generate/. В окне программы устанавливаем необходимое разрешение нашего изображения на дисплее (должно быть меньше, чем 84 пикселя по горизонтали и 48 по вертикали), нажимаем «установить новый размер».

Нажимаем «установить новый размер»

После этого нажимаем «Картинка», «Открыть», выбираем наш файл, жмем «преобразовать».

Жмем «преобразовать»

Нажимаем «Применить»

Теперь жмем на кнопку «Массив» и копируем появившийся массив в новый скетч.

Теперь жмем на кнопку «Массив» и копируем появившийся массив в новый скетч

Выводы

Таким образом, мы подробно рассмотрели базовые возможности работы с дисплеем Nokia 5110 с помощью библиотеки LCD5110_Basic, научились быстро и просто выводить собственные изображения на экран и разобрали нюансы, связанные с подключением дисплея к платформе Arduino.

Stm32f4

Playing with Discovery and other low cost boards

Nokia 5110 LCD

This board is a really inexpensive part (less than 4$ on ebay). It’s quite easy to connect to any micro controller with SPI protocol.

The features are limited but unbeatable for that price.

Resolution is 48 rows and 84 columns. The memory is organized in 6 banks. A byte is mapped with 8 vertical pixels. The memory size is 8 * 84 = 672 bytes.

Simple when you write a font with an height of 8 or 16 pixels. A little more complicated for other size or if you want to manage bitmaps.

Wiring

Not much to say. Just follow what’s written on the PCB. It may vary according the vendor. In my case, 8 pins are used :

Pin #NameDescription
1RST (Reset).Keep low and then set high.
2CE (Chip enable).When low the chip is active.
3DC (Data or Command).When Low a command is sent, when high a data is sent
4DIN (Data In).The pin that send serial data.
5CLK (Clock).The SPI clock.
6VCCPower supply. 3.3v
7LIGHTReturn path for the four blue leds used for backlight. Set to ground to allow current to go through. STM32F4 are rated for 25 ma sink. Documentation states that the backlight consumption is around 20 ma. So i tight this pin directly to an IO pin.
8GNDGround
Читайте также:  Какой должна быть электропроводка в новой квартире?

Controller basics

The embedded controller is PCD8544. There are few commands:

  • Power Down
  • Video inversion
  • Vertical/Horizontal addressing
  • Extended functions (set contrast…)/Regular function (display)
  • Set memory location (coordinates)
  • Set voltage adjustment / temperature
  • Set LCD contrast
  • Set system bias

Code sample content

I don’t use SPI module. SPI protocol is handled by code. Without optimization the clock speed is 1 Mhz. The module stands 4Mhz clock speed.
In this basic sample, the main module is almost empty. We just have to initialize the chip (set clock) and define the Systick interruption to fire every 1 ms. This enables an accurate Delay() function instead of a basic loop.

LCD functions are put in a separate file. For the moment there are only basic functions:

  • Low level function (SPI interface and Pin control)
  • Set cursor position
  • Write a string to screen
  • Write a char to screen
  • Write an integer value to screen
  • Clear the screen

There is only one font (6×8).

I will had picture drawing later…

Dependencies

You have to configure a project with the following modules:

  • stm32f4xx_gpio
  • stm32f4xx_rcc
  • stm32f4xx_syscfg
  • stm32f4xx_pwr
  • misc

Initialization

The following sequence is applied:

  1. Configure IO pins
  2. Set Reset pin to low level at power startup (don’t wait more than 30ms after power goes up)
  3. Keep reset low at least 100 ns (use milliseconds as practical values)
  4. Switch module to extended instruction set
  5. Set LCD voltage (try various value : too low you won’t see nothing, too high the screen will be black)
  6. Set temperature coefficient for LCD voltage (to maintain the same contrast as temperature varies)
  7. Set Bias level
  8. Clear screen (ram is filled with random values after reset)
  9. Enable display (display on in normal mode)

Source code

The source are available for download here. or you can browse Github repository

Игровая консоль stm32

Немного шутеров для stm32; как, зачем, что получилось.

Предисловие

Будучи поклонником «старой» школы шутеров с одной стороны и embedded-разработчиком с другой, я всегда испытывал интерес, как и почему авторам той эпохи удавалось воплощать новый жанр, требующий совершенно новых подходов на весьма «скромном» железе. И я решил попробовать запустить нечто подобное используя решения на основе современных МК — тут и bare-metal и «скромные» ресурсы и довольно мощный инструмент отладки (stm32, имхо). И так, мой выбор пал на плату разработчика stm32f769i discovery.

Примечания

На текущий момент сборка возможна только из среды Keil MDK (загрузчик, игры) или же с помощью arm-gcc + make (только загрузчик). На данный момент доступны порты для — Quake I (+mods), Doom (+mods), Duke Nukem (+mods), Hexen, Heretic. С учетом всех модификаций, список может быть значительно расширен.

Начнем

Архитектура

Так как конечная реализация требует возможности независимого запуска различных игр без обновления прошивки МК, возникла необходимость в некотором варианте «загрузчика», итак:

  1. Загрузчик; работа с памятью — «установка» приложения (игры), запуск.
  2. Драйвер; Обслуживание HAL уровня системы и сопутствующие функции, предача API в приложение.
  3. Приложение; Конечная программа, не возвращает управление в загрузчик.

1. Загрузчик

В основе лежит модель IAP (In-Application-Programming) — драйвера на примере от ST-microelectronics.

Особенность этого подхода в том, что нет необходимости менять когфигурацию загрузки МК,
Все «тело» загрузчика находится в основной памяти, и это в свою очередь позволяет использовать stm32f769i discovery «из коробки».

Основной функционал этого уровня — чтение .bin файла, запись его содержимого в память МК и передача управления. На этом этапе ключевой момент — прочитать адрес точки входа и адрес указателя стека, второе не требуется — т.к. приложение не возвращает управления —
стэк является общим и в перезаписи указателя нет необходимости. Вызов так же может быть выполнен через указатель на функцию. Таким образом, в результате будет получен «гибридный» загрузчик — его «драйверная» часть продолжает обслуживать приложение, в то время как ресурсы самого загрузчика выгружены.

2. Драйвер

Драйвер выполнен в виде «обертки» над уровнем HAL, предоставляя доступ к необходимым ресурсам — файловая система, дисплеймонитор, звук, игровой контроллерсенсор дисплея. Для дальнейшего использования, API драйвера передается в виде структуры указателей через «общую память» — участок памяти зарезервированный как для загрузчика так и для ответной стороны. Подобная манипуляция требует затрат памяти, и возможно лучшим решением было бы использовать SWI (soft-interrupt, svc call), но для этого в свою очередь необходимо иметь возможноть смены контекста — т.к. не все вызовы могут быть обработанны в прерывании. Так же «общая» память используется для передачи пользовательских аргументов (например через консоль), обязательное условие — добавить атрибут no-init для этого участка, это позволит избежать его перезаписи runtime-с библиотекой на момент инициализации пользовательского приложения.

3. Приложение

Как следствие — единственное что необходимо знать на момент сборки приложения — это архитектуру ядра процессора, никаких зависимостей из HAL нет, так же отсутствует таблица векторов прерываний, — все прерывания обрабатываются загрузчиком. Приложение в результате использует гораздо меньше места в памяти программ — благодаря тому что часть функционала «зашита» вместе с загрузчикомдрайвером, что позволяет установить его в область SRAM data (встроенной оперативной памяти). Это в свою очередь позволяет значительно сократить количество циклов записи Flash памяти и так же ускорить процесс отладки и выполнения в целом. Из минусов же — на момент отладки, вызов приложения возможно произвести только извне, например командой из консоли (COM порт сверх ST-Link, VCOM), для этого используется очень упрощенный вариант командной строки.

Особенности разработки

Память

5.5mbytes). Разместить такой объем возможно лишь в sdram, но т.к. эта же память используется загрузчиком для хранения временных данных — изображения, звук, содержимое файлов и т.д. необходимых только до запуска приложения, — было решено разделить управление этой частью памяти — с каждой стороны есть свой malloc/free. После запуска — драйвер использует указатели на функции mallocfree, которые при необходимости, передаются как параметр в функцию вызова. То есть, после запуска игры — драйвер не может напрямую выполнить аллокацию из sdram. Интересный факт о D-Cache и I-Cache — в силу особенностей обращения с внешней памятью — перед запуском необходимо выключать обе линии, т.к. sdram повторно инициализируется, все бы хорошо, но есть одно «но» — необходимо всегда инвалидировать кэш, иначе, по умолчанию он сохраняет валидное состояние всех линий, в то время как они были перезаписанны в промежутке когда кэш был выключен.
Еще одна особенность — все данные загрузчика помещаются в DTCM секцию, это позволяет не задействовать кэш при обращении к памяти (то же самое позволяет выполнить MPU) и как следствие — решаются проблемы когерентности при работе с DMA;
В связке — CPU -> D-Cache -> Memory Теги:

  • stm32
  • stm32f769i
  • doom
  • quake
  • duke nukem 3d
  • microcontrollers

Добавить метки Хабы:

  • Программирование микроконтроллеров
  • Игры и игровые приставки

Записки программиста

Использование ЖК-экранчика от Nokia 5110 в Arduino

Ранее в этом блоге было рассмотрено несколько ЖК-дисплеев / индикаторов и их использование из Arduino. Существенным их недостатком является довольно большой размер, а также вес. Зачастую это не является проблемой. Например, если вы собираете DIY паяльную станцию в самодельном корпусе, там как-то без разницы, какого размера дисплей. С другой стороны, если вам нужен дисплей, скажем, на квадрокоптере, тут вес и размер становятся критически важными. Поэтому сегодня мы научимся работать с очень маленьким и легким экранчиком от телефона Nokia 5110.

Читайте также:  Как спрятать проводку на потолке?

Не беспокойтесь, покупать эффективно не существующий нынче телефон Nokia 5110, выковыривать из него экранчик и выбрасывать все остальные детали не придется. Экранчик от Nokia 5110 являются очень распространенным самостоятельным модулем для радиолюбителей и стоит где-то от 2 до 5$, в зависимости от магазина. В России модуль можно купить, например, на tpai.ru, arduino-kit.ru, amperkot.ru, compacttool.ru, chipster.ru или electromicro.ru. Ну и, конечно же, по самой низкой цене экранчики продаются на AliExpress, но придется подождать месяц или два, пока они придут из Китая.

Как это часто бывает в мире Arduino, для модуля уже существуют готовые библиотеки, и не одна. Мне понравилась библиотека LCD5110, выложенная на сайте rinkydinkelectronics.com. У этой библиотеки есть две версии. Первая называется LCD5110_Basic. Она попроще и способна выводить только текст шрифтами разного размера. Есть возможность создания собственных шрифтов. Вторая версия называется LCD5110_Graph. Она имеет все возможности первой библиотеки и в дополнение к ним умеет рисовать отрезки, прямоугольники, круги и так далее.

В рамках этого поста будет использована LCD5110_Basic. Обе библиотеки прекрасно документированы и имеют множество примеров использования, так что при необходимости в LCD5110_Graph вы без труда разберетесь самостоятельно. Стоит однако отметить, что чтобы LCD5110_Basic компилировалась без warning’ов, мне пришлось внести пару небольших правок в ее код.

Итак, пример использования библиотеки:

extern uint8_t BigNumbers [ ] ;
extern uint8_t MediumNumbers [ ] ;
extern uint8_t SmallFont [ ] ;

/* SCK / CLK, MOSI / DIN, DC, RST, CS */
LCD5110 lcd ( 2 , 3 , 4 , 6 , 5 ) ;

void setup ( )
<
lcd. InitLCD ( ) ;
>

int ctr = 0 ;
void loop ( )
<
lcd. clrScr ( ) ;

lcd. setFont ( BigNumbers ) ;
lcd. printNumI ( ctr, RIGHT, 0 ) ;

lcd. setFont ( MediumNumbers ) ;
lcd. printNumF ( 12.34 , 2 , RIGHT, 24 ) ;

lcd. setFont ( SmallFont ) ;
lcd. print ( “Line 1” , 0 , 8 * 0 ) ;
lcd. print ( “Line 2” , 0 , 8 * 1 ) ;
lcd. print ( “Line 3” , 0 , 8 * 2 ) ;
lcd. print ( “L 4” , 0 , 8 * 3 ) ;
lcd. print ( “L 5” , 0 , 8 * 4 ) ;
lcd. print ( “0123456789ABCD” , 0 , 8 * 5 ) ;

ctr + = 5 ;
if ( ctr >= 1000 )
ctr = 0 ;

Как это выглядит в действии:

Надеюсь, что код разжевывать не требуется. Заметьте, что модуль питается от 3.3 В, но команды от Arduino при этом понимает нормально безо всяких преобразователей логических уровней. Соответственно, пины VCC (питание) и BL (подсветка) подключаем к 3.3 В, GND подключаем к земле, остальные пять пинов подключаем к цифровым пинам Arduino. Номера пинов передаем конструктору класса LCD5110 в соответствии с комментариями в приведенном коде.

Просто, не правда ли? Полную версию исходников к этой заметке вы найдете в этом репозитории на GitHub. Дополнения и вопросы, как всегда, всячески приветствуются.

Дополнение: Автор библиотеки для работы с экранчиком от Nokia 5110 также является автором библиотеки OLED_I2C, предназначенной для работы с не менее популярными OLED-экранчиками с I2C-интерфейсом. Пример использования OLED_I2C вы найдете в посте Используем джойстик от Sega Genesis в проектах на Arduino. Как можно было ожидать, эти две библиотеки имеют похожий интерфейс.

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

Урок 6

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

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

Мы будем подключать дисплей на контроллере 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.

Читайте также:  Модернизация поворотного стола для 3d-фото

Для данных мы будем использовать порт 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

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

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

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

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

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

Затем подключаем lcd.h к main.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_WriteData(uint8_t dt)

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

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

void LCD_Command(uint8_t dt)

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

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

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

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

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

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

/* USER CODE BEGIN 2 */

/* USER CODE END 2 */

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

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

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

Как подключить LCD дисплей для Nokia 5110 к Arduino

Инструкция по подключению ЖК экрана Nokia 5110 к Arduino

  • Arduino (или совместимая плата);
  • ЖК дисплей для Nokia 5110/3310 (покупаем здесь);
  • соединительные провода (типа таких).

1 Схема подключения ЖК экрана Nokia 5110 к Arduino

Схема подключения ЖК экрана Nokia 5110 к Arduino

Пин ArduinoПин экрана Nokia 5110НазваниеФункция
3,3 V1VccПитание экрана, от 2,7 до 3,3 В
GND2GNDЗемля
33SCEEnable, активный LOW
44ResetReset, активный LOW
55D/CВыбор «Данные/команда»:
“0” – данные, “1” – команда
66SDNВход данных
77SCLKВход тактовых импульсов
3,3 V8LEDСветодиодная подсветка экрана

Будьте внимательны, некоторые модификации экрана имеют другую нумерацию выводов. Также на некоторых модификациях экрана вывод подсветки подключается к GND, а не Vcc.

Заказать недорого экран Nokia 5110 можно, например, в Китае.

2 Библиотека для работы с LCD дисплеем Nokia 5110

Для работы с этим LCD экраном написано много библиотек. Предлагаю воспользоваться вот этой библиотекой. Скачаем и разархивируем скачанный файл в директорию Arduino IDE/libraries/.

Библиотека поддерживает следующие возможности.

ФункцияНазначение
LCD5110(SCK, MOSI, DC, RST, CS)объявление ЖК экрана с указанием соответствия пинам Arduino;
InitLCD([contrast])инициализация дисплея 5110 с опциональным указанием контрастности (0-127), по умолчанию используется значение 70;
setContrast(contrast)задаёт контрастность (0-127);
enableSleep()переводит экран в спящий режим;
disableSleep()выводит экран из спящего режима;
clrScr()очищает экран;
clrRow(row, [start], [end])очистка выбранной строки номер row, от позиции start до end;
invert(true), invert(false)включение и выключение инверсии содержимого LCD экрана;
print(string, x, y)выводит строку символов с заданными координатами; вместо x-координаты можно использовать LEFT, CENTER и RIGHT; высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8;
printNumI(num, x, y, [length], [filler])вывести целое число на экран на заданной позиции (x, y); length – желаемая длина числа; filler – символ для заполнения «пустот», если число меньше желаемой длины; по умолчанию это пустой пробел ” “;
printNumF(num, dec, x, y, [divider], [length], [filler])вывести число с плавающей запятой; dec – число знаков после запятой; divider – знак десятичного разделителя, по умолчанию точка “.”;
setFont(name)выбрать шрифт; встроенные шрифты называются SmallFont и TinyFont; вы можете определить свои шрифты в скетче;
invertText(true), invertText(false)инверсия текста вкл./выкл.;
drawBitmap(x, y, data, sx, sy)вывести картинку на экран по координатам x и y; data – массив, содержащий картинку; sx и sy – ширина и высота рисунка.

3 Скетч для вывода текста на ЖК экран Nokia 5110

Напишем такой скетч.

Сначала подключаем библиотеку, затем объявляем экземпляр класса LCD5110 с назначением выводов. В процедуре setup() инициализируем ЖК экран. В процедуре loop() очищаем экран и пишем маленьким шрифтом произвольный текст, под ним – средним шрифтом выводим счётчик секунд.

Вывод текстовых данных на LCD экран Nokia 5110 с помощью Arduino

4 Скетч для вывода изображения на ЖК экран Nokia 5110

Давайте к тексту на экране добавим картинку. Для этого подготовим монохромное изображение, которое хотим вывести на экран Nokia 5110. Помните, что разрешение экрана Nokia 5110 составляет 48 на 84 точек, и картинка должна быть не больше. Воспользуемся онлайн-инструментом для преобразования изображения в массив битов. Скачаем полученный файл с расширением “*.c” и добавим его к проекту через меню: Эскиз Добавить файл… или просто поместим файл в директорию скетча, а затем перезагрузим среду разработки Arduino IDE.

Добавление файла к проекту Arduino

Дополним наш скетч работой с изображением.

Теперь нужно в коде программы объявить массив с данными изображения (у меня в коде это строка extern uint8_t mysymb[];, а в файле изображения массив называется mysymb[]), а затем используем функцию drawBitmap() для вывода изображения в нужном месте экрана.

Загрузим скетч в Arduino. Теперь текст сменяется картинкой, и счётчик каждый раз увеличивает своё значение.

Вывод изображения на ЖК экран Nokia 5110 с помощью Arduino

Рейтинг
( Пока оценок нет )
Загрузка ...
Adblock
detector