PROGCONT.RU

Форма входа







Регистрация Вход/

Пример Пример Пример


STM8S настройка и использование семисегментного LED модуля на чипе MAX7219 с помощью SPL.

Ссылка на видео в YouTubeNOМикросхема драйвер MAX7219 предназначен для управления индикацией семисегметных LED индикаторов а также LED матрицами. у меня же в статье будем использовать вот такой модуль с восьмью цифрами, передача информации с которым будет осуществляется через интерфейс SPI по шестнадцать бит данных, первым уходит младший байт.

Формат передаваемых данных выглядит следующим образом.


NO


Адресное пространство MAX7219 в котором используется только младших четыре бита.

NO


No-Op
не используется, адрес 0.
Digit 0-Digit 7
адреса с 1 по 8 для записи отображаемого символа, адрес 1 отображает крайний правый символ, 8 крайний левый.
Decode Mode
адрес 9, включение декодирования символов, в данных определяется какой символ должен декодироваться установкой бита в нужную позицию.
NO


Если установить цифрам декодирование то в их адреса для отображения нужного символа необходимо записывать код «B» из таблицы или если не включено то нужно самостоятельно включать нужные сегменты.

NO


Intensity
адрес 10, яркость LED.
NO


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 и данные которые нужно записать.


Схема подключения.

NO


Первый пример будем отображать символы без декодирования, для этого будет нужен массив символов для включения нужных сигментов.

#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

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