STM32 - дисплей TM1637








Библиотека для подключения модуля TM1637 к stm32. Модуль представляет из себя четыре семисегментных LED-индикатора и микросхемы (сдвиговый регистр) TM1637. Подойдёт для создания часов или секундомера, или чего угодно для вывода цифр и некоторых букв-символов, а ещё можно программно изменять яркость. Работает по двухпроводной шине по типу I2C, но не I2C, похоже на работу со сдвиговым регистром. Выглядит очень даже прилично…



Питание от 3 до 6 вольт.



Если у вас плата BluePill, то просто подключите контакты DIO к PB8, а CLK к PB9, и прошейте пример. Если же плата другая, то настраиваем в Кубе два любых пина как GPIO_Output…



… и называем их DIO и CLK. Потом их нужно будет соединить с соответствующим контактам на модуле…




Пины задефайнены в файле tm1637.h

#define CLK_HIGH	(HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_SET))
#define CLK_LOW		(HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_RESET))

#define DIO_HIGH	(HAL_GPIO_WritePin(DIO_GPIO_Port, DIO_Pin, GPIO_PIN_SET))
#define DIO_LOW		(HAL_GPIO_WritePin(DIO_GPIO_Port, DIO_Pin, GPIO_PIN_RESET))

#define DIO_READ	(HAL_GPIO_ReadPin(DIO_GPIO_Port, DIO_Pin))




Далее нужно настроить RTC, если планируете использовать внутренние часы.

Указываем источник тактирования…



Настраиваем мультиплексор…



И само RTC…



Подробнее про RTC я писал тут.



Подключаем в проект файлы tm1637.c, tm1637.h, delay_micros.c и delay_micros.h (для микросекундных задержек используется счётчик DWT).


Инклюдим файлы tm1637.h и delay_micros.h в main.c

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


Перед бесконечным циклом пишем это…

/* USER CODE BEGIN 2 */
  DWT_Init();        // инициализация DWT
  set_brightness(7); // 0 - 7 яркость
  clearDisplay();    // очистка дисплея

  RTC_TimeTypeDef sTime = {0}; // структура для времени
  // RTC_DateTypeDef DateToUpdate = {0}; // если микроконтроллер F4xx или F7xx
  
  int8_t TimeDisp[4] = {0,};
  /* USER CODE END 2 */


Яркость нужно установить от 0 до 7. Можно это делать «на лету».

Очистка дисплея — гасит все сегменты.

Если у вас микроконтроллер F4xx или F7xx, то нужно после функции HAL_RTC_GetTime(...) вызывать HAL_RTC_GetDate(...), в противном случае время не будет обновляться.



В бесконечно цикле считываем время и выводим на дисплей…


  while (1)
  {
	  HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
          // HAL_RTC_GetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN); // если микроконтроллер F4xx или F7xx

	  point(0); // двоеточие, 0 - мигает, 1 - горит постоянно, удалить функцию - нет двоеточия

	  TimeDisp[0] = sTime.Hours / 10; 
	  TimeDisp[1] = sTime.Hours % 10; 
	  TimeDisp[2] = sTime.Minutes / 10;
	  TimeDisp[3] = sTime.Minutes % 10;
	  display_mass(TimeDisp);

	  HAL_Delay(1000);
          ...


Индексы буфера (TimeDisp) соответствуют знакам на дисплее, слева на право, TimeDisp[0] — первый знак, TimeDisp[1] — второй, TimeDisp[2] — третий, TimeDisp[3] — четвёртый. В первый знак записывается целая часть часа, во второй дробная, с минутами так же. Собственно со временем всё, можно прошивать и смотреть что вышло.



Если нужно выводить какие-то символы, то идём в файл tm1637.c и находим там массив…

static int8_t TubeTab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x40}; //0~9, A(10), b(11), -(12)

Первые десять байт, соответствуют цифрам (с 0 по 9), а оставшиеся три, это символы 'А', 'b', '-' (можно добавлять сколько нужно).

То есть, когда мы выводили время, мы отправляли на дисплей не часы с минутами, а указывали этими цифрами индексы из массива TubeTab[].

Каждый из семи сегментов отдельного знака включается/отключается соответствующим битом в байте, который прописан в массиве TubeTab[]…


Цифра '9' — 0x6f.


Символ 'А' — 0x77.


Добавляем в программу вот такой код…

TimeDisp[0] = 10;
TimeDisp[1] = 0x7f;
TimeDisp[2] = 11;
TimeDisp[3] = 0x7f;
display_mass(TimeDisp);
HAL_Delay(1000);


На первом месте будет символ 'А', а на третьем 'b'.

TimeDisp[0] = 10 — означает, что нужно вывести значение хранящееся под индексом 10, в массиве TubeTab[].

0x7f — выключает второй знак.

TimeDisp[2] = 11 — выводим значение хранящееся под индексом 11.

0x7f — выключает четвёртый знак.


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

TimeDisp[0] = 0x7f;
TimeDisp[1] = 12;
TimeDisp[2] = 23 / 10;
TimeDisp[3] = 23 % 10;
display_mass(TimeDisp);
HAL_Delay(1000);

Выведет -23.


Чтоб нарисовать другие символы воспользуйтесь онлайн конструктором. Потыкайте нужные сегменты, и полученное значение добавьте в массив TubeTab[].


Это всё, всем спасибо

Библиотека


Телеграм-чат istarik

Телеграм-чат STM32

Форум


  • 0
  • 988
Поддержать автора




Telegram-чат istarik

Задать вопрос по статье
Telegram-канал istarik

Известит Вас о новых публикациях






Комментарии (0)

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.