STM8S настройка и использование семисегментного LED модуля на чипе MAX7219 с помощью SPL.
Ссылка на видео в YouTubeМикросхема драйвер MAX7219 предназначен для управления индикацией семисегметных LED индикаторов а также LED матрицами. у меня же в статье будем использовать вот такой модуль с восьмью цифрами, передача информации с которым будет осуществляется через интерфейс SPI по шестнадцать бит данных, первым уходит младший байт.
Формат передаваемых данных выглядит следующим образом.
Адресное пространство MAX7219 в котором используется только младших четыре бита.
- No-Op
- не используется, адрес 0.
- Digit 0-Digit 7
- адреса с 1 по 8 для записи отображаемого символа, адрес 1 отображает крайний правый символ, 8 крайний левый.
- Decode Mode
- адрес 9, включение декодирования символов, в данных определяется какой символ должен декодироваться установкой бита в нужную позицию.
Если установить цифрам декодирование то в их адреса для отображения нужного символа необходимо записывать код «B» из таблицы или если не включено то нужно самостоятельно включать нужные сегменты.
- Intensity
- адрес 10, яркость LED.
- Scan Limit
- адрес 11, отображение количества символов, если установить 0 то отображается только первый символ, 1 отображается первый -второй, 2 первый-второй-третий и так далее, 7 отображаются все восемь символов.
- Shutdown
- адрес 12, запись в этот адрес 0 выключит отображение или 1 включит.
- Display Test
- адрес 15, запись в этот адрес 0 выключит тестовый режим, запись 1 включит будут отображается все сегменты.
Практика использования или пример программ.
Для примера я буду использовать контроллер STM8S903K3, что бы отправить данные используется функция LCD_Send_Data( uint8_t address, uint8_t data) в которую передаётся адрес регистра MAX7219 и данные которые нужно записать.
Схема подключения.
Первый пример будем отображать символы без декодирования, для этого будет нужен массив символов для включения нужных сигментов.
#include "stm8s.h"
#define Decode_Mode 9
#define Intensity 10
#define Scan_Limit 11
#define Shutdown 12
#define Display_Test 15
/*Массив символов 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.*/
const uint16_t CHARACTER[10] = { 126, 48, 109, 121, 51, 91, 95, 112, 127, 123};
void LCD_Send_Data( uint8_t address, uint8_t data);
int main( void ){
CLK_DeInit();
/*Настройка для SPI выводов.*/
GPIO_Init( GPIOC, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init( GPIOC, GPIO_PIN_6, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init( GPIOC, GPIO_PIN_7, GPIO_MODE_OUT_PP_HIGH_FAST);
/*Настройка самого SPI для передачи данных.*/
SPI_Init( SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_2, SPI_MODE_MASTER,
SPI_CLOCKPOLARITY_LOW, SPI_CLOCKPHASE_1EDGE, SPI_DATADIRECTION_1LINE_TX,
SPI_NSS_SOFT, 0x07);
SPI_Cmd(ENABLE);
/*Инициализация MAX7219.*/
LCD_Send_Data( Shutdown, 1);
LCD_Send_Data( Display_Test, 0);
LCD_Send_Data( Decode_Mode, 0);
LCD_Send_Data( Intensity, 9);
LCD_Send_Data( Scan_Limit, 7);
while(1){
/*Вывод 7-6-5-4-3-2-1-0.*/
for( uint16_t i=1; i<9; i++){LCD_Send_Data( i, CHARACTER[i-1]);}
for( uint32_t e=0; e<100000; e++);
/*Вывод 2-3-4-5-6-7-8-9.*/
for( uint16_t i=8; i>0; i--){LCD_Send_Data( i, CHARACTER[10-i]);}
for( uint32_t e=0; e<100000; e++);
/*Вывод 7-6-5-4-3-2-1-0 с точкой.*/
for( uint16_t i=1; i<9; i++){LCD_Send_Data( i, CHARACTER[i-1] | 128);}//128 маска точки.
for( uint32_t e=0; e<100000; e++);
}
return 0;
}
/*Функция отправки адреса и данных.*/
void LCD_Send_Data( uint8_t address, uint8_t data){
GPIO_WriteLow( GPIOC, GPIO_PIN_7);
SPI_SendData(address);
while(!SPI_GetFlagStatus(SPI_FLAG_TXE));
SPI_SendData(data);
while(SPI_GetFlagStatus(SPI_FLAG_BSY));
GPIO_WriteHigh( GPIOC, GPIO_PIN_7);
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
while (1){}
}
#endif
Второй пример здесь включено декодирование всех позиций LED и отсылаем код «B» нужного символа.
#include "stm8s.h"
#define Decode_Mode 9
#define Intensity 10
#define Scan_Limit 11
#define Shutdown 12
#define Display_Test 15
void LCD_Send_Data( uint8_t address, uint8_t data);
int main( void ){
CLK_DeInit();
/*Настройка для SPI выводов.*/
GPIO_Init( GPIOC, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init( GPIOC, GPIO_PIN_6, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init( GPIOC, GPIO_PIN_7, GPIO_MODE_OUT_PP_HIGH_FAST);
/*Настройка самого SPI для передачи данных.*/
SPI_Init( SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_2, SPI_MODE_MASTER,
SPI_CLOCKPOLARITY_LOW, SPI_CLOCKPHASE_1EDGE, SPI_DATADIRECTION_1LINE_TX,
SPI_NSS_SOFT, 0x07);
SPI_Cmd(ENABLE);
/*Инициализация MAX7219.*/
LCD_Send_Data( Shutdown, 1);
LCD_Send_Data( Display_Test, 0);
LCD_Send_Data( Decode_Mode, 255);
LCD_Send_Data( Intensity, 9);
LCD_Send_Data( Scan_Limit, 7);
LCD_Send_Data( Scan_Limit, 7);
while(1){
/*Вывод 7-6-5-4-3-2-1-0.*/
for( uint16_t i=1; i<9; i++){LCD_Send_Data( i, i-1);}
for( uint32_t e=0; e<100000; e++);
/*Вывод 0-1-2-3-4-5-6-7.*/
for( uint16_t i=8; i>0; i--){LCD_Send_Data( i, 8-i);}
for( uint32_t e=0; e<100000; e++);
/*Вывод 7-6-5-4-3-2-1-0 с точкой.*/
for( uint16_t i=1; i<9; i++){LCD_Send_Data( i, i-1|128);}
for( uint32_t e=0; e<100000; e++);
}
return 0;
}
/*Функция отправки адреса и данных.*/
void LCD_Send_Data( uint8_t address, uint8_t data){
GPIO_WriteLow( GPIOC, GPIO_PIN_7);
SPI_SendData(address);
while(!SPI_GetFlagStatus(SPI_FLAG_TXE));
SPI_SendData(data);
while(SPI_GetFlagStatus(SPI_FLAG_BSY));
GPIO_WriteHigh( GPIOC, GPIO_PIN_7);
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
while (1){}
}
#endif