STM Урок 59. Модуль LCD 16×2 с кнопками

 

 

 

 

Урок 59

Модуль LCD 16×2 с кнопками

 

 

Сегодня мы попробуем поработать с модулем дисплея 16×2 с кнопками и регулятором контрастности, который я приобрёл уже давно, а урока под STM32 по нему ещё не было. Что поделать, дела. Сегодня мы начнём восполнять данный пробел и подключим данный модуль к плате STM32F4-Discovery.

В данном модуле уже установлен регулятор контрастности, а также установлено 7 кнопок. Данные кнопки подключены не к отдельным ножкам портов, а подключены только к одной ножке и между контактами кнопок установлены резисторы, что позволяет при нажатии определённой кнопки получать различное напряжение, которое затем распознаётся аналого-цифровым преобразователем микроконтроллера. Данный тип подключения позволит нам сэкономить четыре ножки порта. Кнопка Reset не участвует в данной цепочке и выведена на отдельный контакт, поэтому данную кнопку мы рассматривать не будем.

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

 

image01

 

Вот краткая схема модуля (нажмите на картинку для увеличения размера)

 

image00_0500

 

Информационные входы-выходы модуля, а также управляющие контакты мы подключим таким же образом. как и в уроке 6 по подключению дисплея 20×4 и будем исользовать тот же самый 4-битный режим.

На модуле это выглядеть будет вот так

 

image02

 

Из обзора данного дисплея мы также знаем, что отслеживание каждой нажатой кнопки происходит не с помощью отдельно-взятого контакта порта на МК, а с помощью резисторного делителя и подключения к АЦП. Таким образом, нажимая одну из кнопок на модуле, мы управляем напряжением на общей ножке. Эту общую ножку мы подключим к АЦП контроллера, только не прямиком подключим ибо питание на модуль, а также на дисплей мы будем использовать 5 вольт, иначе у нас не хватит для контрастности, а такое напряжение не подходит для АЦП. Поэтому подключим мы ножку кнопок к АЦП через резисторный делитель. В нем я использовал два резистора по 4,1 килоома. Поэтому на выходе делителя мы будем получать ровно половину напряжения, приложенного на вход.

Вот такой вот делитель

 

image03

 

Получилась вот такая вот схемка (нажмите на картинку для увеличения изображения)

 

image04_0500

 

Ну, теперь, конечно же проект.

Его мы создадим из проекта по работе с АЦП с применением прерываний ADC_REGULAR_INT и назовём его LCDBUTTON.

Запустим проект в Cube MX.

Ничего не трогаем, просто генерируем проект и открываем его в Keil.

Настроим на авторезет программатор, подключим файл lcd.c в дерево проекта.

 

 

Уберём повторное подключение в файле main.c файла main.h. Это у нас происходит из-за новой организации подключения данного файла в автогенераторе проектов Cube MX.

 

/* USER CODE BEGIN Includes */
#include "main.h"
/* USER CODE END Includes */

 

Так как файл main.h был автоматически пересоздан, то весь наш пользовательский код, который был размещён в данном файле, был удалён. Поэтому мы его заново добавим куда следует, скопировав из проекта-донора

 

/* USER CODE BEGIN Includes */
#include "stm32f4xx_hal.h"
#include "lcd.h"

/* USER CODE END Includes */

 

Соберём проект и видим 36 ошибок. Это не страшно. Лечится легко добавлением следующей строчки в файл lcd.h

 

//————————————————
#include "stm32f4xx_hal.h"
#include "stdint.h"
//————————————————

 

Теперь у нас ошибок нет. Вот так вот мы боремся с нововведениями в Cube MX для возвращения возможности лепить проекты из старых проектов, которые были сделаны ещё до обновлений.

Теперь мы можем перейти к написанию непосредственно кода. Перейдём в main.c.

На всякий случай проинициализируем переменную, в которой будут храниться текущие данные АЦП

 

/* Private variables ———————————————————*/
uint16_t ADC_Data=0;
/* USER CODE END PV */

 

В 1-м пользовательском блоке в функции main() подправим переменные, так как нам плавающий тип будет не нужен, ибо нам не важно точное значение напряжения, а важны только диапазоны значений. Также можно немного убавить размер строкового массива. Ну, и заодно немного подправить имя переменной с str на str1. Последнее время я что-то боюсь str.

 

  /* USER CODE BEGIN 1 */
 char str1[7];
 uint16_t adc_value=0;
  /* USER CODE END 1 */
 

Уберем лишний код из 2-го блока main(), расположенного до бесконечного цикла. Останется в нём только вот это

 

  /* USER CODE BEGIN 2 */
 LCD_ini();
 LCD_Clear();
 HAL_ADC_Start_IT(&hadc1);
 HAL_Delay(1000);

  /* USER CODE END 2 */

 

Задержка нужна обязательно. Иначе АЦП не успевает инициализироваться и мы получим эмуляцию нажатой кнопки, нам это не надо.

В бесконечном коде также уберем лишнее и поправим код

 

  /* USER CODE BEGIN WHILE */
  while (1)
  {
    adc_value = ADC_Data;
    LCD_SetPos(0, 0);
    sprintf(str1,"%d",adc_value);
    LCD_String(str1);
    HAL_Delay(200);
    /* USER CODE END WHILE */
 

Соберём код, прошьём контроллер и мы должны увидеть на экране дисплея абсолютные показания АЦП. Вот их мы и будем использовать

 

image05

 

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

 

  LCD_String(str1);
  LCD_SetPos(0, 1);
  if(adc_value<200) LCD_String("RIGHT KEY ");
  else if(adc_value<700) LCD_String("UP KEY    ");
  else if(adc_value<1200) LCD_String("DOWN KEY  ");
  else if(adc_value<1800) LCD_String("LEFT KEY  ");
  else if(adc_value<2300) LCD_String("SELECT KEY");

  HAL_Delay(200);

 

Соберём код, прошьём контроллер и при нажатии каждой кнопки текст на экране будет меняться на соответствующий, например при нажатии кнопки SELECT мы получим вот это

 

image06

 

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

 

Исходный код

 

 

Отладочную плату можно приобрести здесь STM32F4-DISCOVERY

Дисплей с кнопками можно приобрести здесь Дисплей LCD 16×2 с кнопками

 

 

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

 

STM32 Модуль LCD 16x2 с кнопками

4 комментария на “STM Урок 59. Модуль LCD 16×2 с кнопками
  1. Роман:

    Доброй ночи Уважаемы!

    Хотелось бы уточнить: в предложение "В данном модуле уже установлен регулятор контрастности, а также установлено 7 кнопок." — правильнее будет скорее всего 6 кнопок )))

    И по схеме у Вас питание LCD подключено к ножкам процессора — но это 3.3 вольта, а надо поидее 5 вольт? Или для упрощения схемы было так нарисовани? 

     

    Спасибо заранее.

  2. Марк:

    Здравствуйте. Есть модуль LCD 16×2 с кнопками (как в статье, но с надписью D1 ROBOT). С Cub файла генерирую проект, собираю его, но после прошивки на дисплей ничего не выводится (горит подсветка и все). Прозвонил, есть все контакты, PD4-D4 …. PD7-D7, PB9 — E, RS — PB8, 5В c discowery на 5V, GND на следующие две ноги. Подскажите, пожалуйста, в чем может быть ошибка? 

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

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

*