Передмова
Мабуть самий з найпоширеніших дисплеїв в радіоаматорскій практиці є семисегментний світлодіодний дисплей. Це й простота і дешевизна. Але й є недоліки. Це інформаційне обмеження щодо варіантів символів, які можна зобразити і велика кількість ніжок на мікроконтролері (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 завелось без питань.
ВідповістиВидалити