STM32 - дисплей TM1637
Библиотека для подключения модуля TM1637 к stm32. Модуль представляет из себя четыре семисегментных LED-индикатора и микросхемы (сдвиговый регистр) TM1637. Подойдёт для создания часов или секундомера, или чего угодно для вывода цифр и некоторых букв-символов, а ещё можно программно изменять яркость. Работает по двухпроводной шине по типу I2C, но не I2C, похоже на работу со сдвиговым регистром. Выглядит очень даже прилично…
Питание от 3 до 6 вольт.
Если у вас плата BluePill, то просто подключите контакты DIO к PB8, а CLK к PB9, и прошейте пример. Если же плата другая, то настраиваем в Кубе два любых пина как GPIO_Output…
… и называем их
Пины задефайнены в файле
#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 я писал тут.
Подключаем в проект файлы
Инклюдим файлы
/* 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] — четвёртый. В первый знак записывается целая часть часа, во второй дробная, с минутами так же. Собственно со временем всё, можно прошивать и смотреть что вышло.
Если нужно выводить какие-то символы, то идём в файл
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] = 0x7f;
TimeDisp[1] = 12;
TimeDisp[2] = 23 / 10;
TimeDisp[3] = 23 % 10;
display_mass(TimeDisp);
HAL_Delay(1000);
Выведет -23.
Чтоб нарисовать другие символы воспользуйтесь онлайн конструктором. Потыкайте нужные сегменты, и полученное значение добавьте в массив TubeTab[].
Это всё, всем спасибо
Библиотека
Телеграм-чат istarik
Телеграм-чат STM32
- 0
- stD
21565
Поддержать автора
Комментарии (0)