Передмова
Мабуть самий з найпоширеніших дисплеїв в радіоаматорскій практиці є семисегментний світлодіодний дисплей. Це й простота і дешевизна. Але й є недоліки. Це інформаційне обмеження щодо варіантів символів, які можна зобразити і велика кількість ніжок на мікроконтролері (7 або 8 ніжок для сегментів плюс на кожен розряд по 1 ніжці мікоконтролера).
За допомоги мікросхеми MAX7219 можна усунути недолік з великою кількістю ніжок. За допомоги однієї мікросхеми MAX7219 можна керувати 8 розрядним 7-ми сегментним дисплеєм, плюс режим декодування цифр, плюс регулювання яскравості свічення дисплею, плюс не потрібно турбуватись про динамічну індикацію. А данні до мікросхеми надсилати по шині SPI, яка обмежена швидкістю в 10 Мбіт/сек.
В цій статті розглянемо невеличку бібліотеку для зручного друку інформації на семисегментний дисплей з мікросхемою MAX7219:
В користувацьку секцію 2 додаємо ініціалізацію дисплею з встановленим рівнем яскравості 7 і вмикаємо режим декодування цифр:
В безкінечному циклі друкуємо від'ємне число Pi. Та слово HELP. Чекаємо 1.5 секунди, очищаємо дисплей та друкуємо число 765 на 4-ри розряди (додається незначащий нуль), та ціле число 321. Знову чекаємо 1.5 секунди і все з початку.
Щоб друкувати довільні символи, то треба вимкнути режим декодування цифр і в масив static uint8_t SYMBOLS[] файлу max7219.c додати ці символи. А в нумерований список MAX7219_Numeric в файлі max7219.h додати позначення і порядковий номер в масиві - нового символу.
За допомоги мікросхеми MAX7219 можна усунути недолік з великою кількістю ніжок. За допомоги однієї мікросхеми MAX7219 можна керувати 8 розрядним 7-ми сегментним дисплеєм, плюс режим декодування цифр, плюс регулювання яскравості свічення дисплею, плюс не потрібно турбуватись про динамічну індикацію. А данні до мікросхеми надсилати по шині SPI, яка обмежена швидкістю в 10 Мбіт/сек.
В цій статті розглянемо невеличку бібліотеку для зручного друку інформації на семисегментний дисплей з мікросхемою MAX7219:
- Очищення дисплею
- Встановлення рівню яскравості
- Надсилання даних на MAX7219
- Вмикання/вимикання дисплею
- Встановлення/скидання режиму декодування
- Друк цифр (символів) в заданому розряді
- Друк чисел типу INT та FLOAT
Залізяччя
Для прикладу буду використовувати такі матеріали:
- Модуль семисегментний, восьмирозрядний дисплей з MAX7219
- Дошку Синя пігулка STM32F103C8T6
- Програматор ST-Link V2
- Жмут дротів і макетну плату
Створюємо проект в STM32CubeMX або STM32CubeIDE
Обираємо свій мікроконтролер або дошку. Та налаштовуємо проект.
![]() |
Налаштування проекту в Cube |
- Тиснемо RCC -> High Speed Clock (HSE) -> Crystal/Ceramic Resonator
- SYS -> Debug -> Serial Wire
- Тиснемо SPI1
- Обираємо шпильку Chip Select -> наприклад PB0, обираємо режим GPIO_OUTPUT, та називаємо її CS_MAX7219
- Обираємо режим для SPI1 -> Transmit only master
- Слідкуємо щоб Baud Rate не перевищував 10 MBits/sec, якщо перевищує збільшіть Prescaler (for Baud Rate)
Генеруємо проект та переходимо до підключення дисплейного модуля до мікроконтролера, завантаження бібліотеки та написання демо-коду.
Підключення дисплейного модуля до мікроконтролера
STM32F103C8T6 | Дисплейний модуль |
Vcc 3.3V
|
Vcc
|
GND
|
GND
|
PA7 SPI1_MOSI
|
DIN
|
PB0 CS_MAX7219
|
CS
|
PA5 SPI1_SCK
|
CLK
|
Бібліотека MAX7219
Завантажити бібліотеку можна з GitHub. Бібліотека складається з двох файлів: max7219.h та max7219.c та має такі функції:
1 2 3 4 5 6 7 8 9 10 11 12 | void max7219_Init(uint8_t intensivity); void max7219_SetIntensivity(uint8_t intensivity); void max7219_Clean(void); void max7219_SendData(uint8_t addr, uint8_t data); void max7219_Turn_On(void); void max7219_Turn_Off(void); void max7219_Decode_On(void); void max7219_Decode_Off(void); void max7219_PrintDigit(MAX7219_Digits position, MAX7219_Numeric numeric, bool point); MAX7219_Digits max7219_PrintItos(MAX7219_Digits position, int value); MAX7219_Digits max7219_PrintNtos(MAX7219_Digits position, uint32_t value, uint8_t n); MAX7219_Digits max7219_PrintFtos(MAX7219_Digits position, float value, uint8_t n); |
- Ініціалізація дисплею. На вхід "рівень яскравості" (0x0 - 0xF);
- Встановлення рівня яскравості. На вхід "рівень яскравості" (0x0 - 0xF);
- Очищення дисплею;
- Надсилання в шину SPI до MAX7219 даних. На вхід: адреса, дані;
- Увімкнення дисплею;
- Вимкнення дисплею;
- Увімкнути режим декодування;
- Вимкнути режим декодування;
- Друк цифри (символу). На вхід: позиція (1 - 8), цифра (0 - 9), точка (true/false);
- Друк числа типу INT. На вхід: стартова позиція числа на дисплеї, число INT. На виході: поточна позиція курсору;
- Друк числа типу INT з фіксованою кількістю розрядів. На вхід: стартова позиція числа на дисплеї, число INT, кількість розрядів. На виході: поточна позиція курсору;
- Друк числа типу FLOAT. На вхід: стартова позиція числа на дисплеї, число FLOAT, кількість знаків після коми (не більше 4-х). На виході: поточна позиція курсору;
Демо-код
Відкриваємо свій засіб розробки та експортуємо, згенерований CubeMX або CubeIDE, код.
Копіюємо файли бібліотеки до проекту. Файли з розширенням *.h до теки INC, файли з розширенням *.c до теки SRC.
Відкриваємо файл max7219.h та налаштовуємо бібліотеку:
Відкриваємо файл max7219.h та налаштовуємо бібліотеку:
- Кількість розрядів #define NUMBER_OF_DIGITS 8
- Порт SPI до якого приєднано дисплейний модуль #define SPI_PORT hspi1
Відкриваємо файл main.c і в секції USER CODE Includes вкладаємо нашу бібліотеку:
/* USER CODE BEGIN Includes */ #include "max7219.h" /* USER CODE END Includes */
В користувацьку секцію 2 додаємо ініціалізацію дисплею з встановленим рівнем яскравості 7 і вмикаємо режим декодування цифр:
/* USER CODE BEGIN 2 */ max7219_Init(7); max7219_Decode_On(); /* USER CODE END 2 */
В безкінечному циклі друкуємо від'ємне число Pi. Та слово HELP. Чекаємо 1.5 секунди, очищаємо дисплей та друкуємо число 765 на 4-ри розряди (додається незначащий нуль), та ціле число 321. Знову чекаємо 1.5 секунди і все з початку.
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { max7219_Clean(); max7219_PrintFtos(DIGIT_8, -3.14, 2); max7219_PrintDigit(DIGIT_4, LETTER_H, false); max7219_PrintDigit(DIGIT_3, LETTER_E, false); max7219_PrintDigit(DIGIT_2, LETTER_L, false); max7219_PrintDigit(DIGIT_1, LETTER_P, false); HAL_Delay(1500); max7219_Clean(); max7219_PrintNtos(DIGIT_8, 765, 4); max7219_PrintItos(DIGIT_3, 321); HAL_Delay(1500); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */
Приклад роботи
![]() |
Приклад роботи |
Excellent article. I am new to the STM32 family, but your article made it simple and easy to hook up my CT8 to my 7219. I'm sure i will have no problem moving it over to my F407VET.
ВідповістиВидалитиI was able to add a little code and now I am watching the display count to 99,988,888.
Thank you for a well written, detailed and explained article. I'm sure anyone looking to make their first leap should look here first.
thank you very much!
ВидалитиThanks, I had some thoughts to write it myself for F423 but you saved me a few hours.
ВідповістиВидалитиIf someone decide to dig into it, read MAX7219 Serially Interfaced, 8-Digit LED Display Drivers doc. But you will be puzzled by a start sequence of commands which are not too obvious, so use the driver.
Автор видалив цей коментар.
ВідповістиВидалитиАвтор видалив цей коментар.
ВідповістиВидалитиВелика подяка Вам. На С6Т6 завелось без питань.
ВідповістиВидалитиOperating supply voltage min 4V for MAX 7219
ВідповістиВидалитиvoid max7219_SendData(uint8_t addr, uint8_t data)
{
CS_SET();
HAL_SPI_Transmit(&hspi1, &addr, 1, HAL_MAX_DELAY);
HAL_SPI_Transmit(&hspi1, &data, 1, HAL_MAX_DELAY);
CS_RESET();
} chenge hspi1 -> SPI_PORT