diff --git a/Inc/DS_MAX7219.h b/Inc/DS_MAX7219.h new file mode 100644 index 0000000..b7a7134 --- /dev/null +++ b/Inc/DS_MAX7219.h @@ -0,0 +1,30 @@ +#ifndef DSMAX7219_H +#define DSMAX7219_H + +#include "stm32f0xx_hal.h" +#include + +typedef struct DS_MAX7219 +{ + SPI_HandleTypeDef* SPI; + char DisplayData[8]; + uint8_t Dots; + uint8_t DecodeMode, Intensivity, ScanLimit; + bool EnableDecodeMode; + GPIO_TypeDef* Port_CS; + uint16_t Pin_CS; +}DS_MAX7219; + +void DS_MAX7219_Init(DS_MAX7219* Display, SPI_HandleTypeDef* SPI, GPIO_TypeDef* Port_CS, uint16_t Pin_CS); + +void DS_MAX7219_EnableDots(DS_MAX7219* Display, uint8_t Dots); + +void DS_MAX7219_Print(DS_MAX7219* Display, int64_t Number); + +void DS_MAX7219_UpdataDisplay(DS_MAX7219* Display); + +void DS_MAX7219_ConfigureDisplay(DS_MAX7219* Display, uint8_t DecodeMode, uint8_t Intensivity, uint8_t ScanLimit); + +void __DS_MAX7219_SendConfigData(DS_MAX7219* Display); + +#endif //DSMAX7219_H \ No newline at end of file diff --git a/Src/DS_MAX7219.c b/Src/DS_MAX7219.c new file mode 100644 index 0000000..b33e25f --- /dev/null +++ b/Src/DS_MAX7219.c @@ -0,0 +1,221 @@ +#include "../inc/DS_MAX7219.h" +#include + +void DS_MAX7219_Init(DS_MAX7219* Display, SPI_HandleTypeDef* SPI, GPIO_TypeDef* Port_CS, uint16_t Pin_CS) +{ + HAL_Delay(500); + Display->SPI = SPI; + Display->DecodeMode = 0; + Display->Intensivity = 8; + Display->ScanLimit = 7; + Display->EnableDecodeMode = true; + + Display->Port_CS = Port_CS; + Display->Pin_CS = Pin_CS; + + for (uint8_t i = 0; i < 9; i++) + { + Display->DisplayData[i] = ' '; + } + + __DS_MAX7219_SendConfigData(Display); + DS_MAX7219_UpdataDisplay(Display); +} + +void DS_MAX7219_Print(DS_MAX7219* Display, int64_t Number) +{ + + //sprintf(Display->DisplayData, "%lld", Number); + + + if (Number<0) + { + Display->DisplayData[0] = '-'; + Number = Number * -1; + } + else + Display->DisplayData[0] = ' '; + + + uint8_t t = Number/1000000; + + if (t==0) + Display->DisplayData[1] = ' '; + else if (t<10) + { + Display->DisplayData[1] = t; + Number = Number - t*1000000; + } + else + { + Display->DisplayData[0] = + Display->DisplayData[1] = + Display->DisplayData[2] = + Display->DisplayData[3] = + Display->DisplayData[4] = + Display->DisplayData[5] = + Display->DisplayData[6] = + Display->DisplayData[7] = '9'; + return; + } + + t = Number/100000; + if ((t==0)&&(Display->DisplayData[1] == ' ')) + Display->DisplayData[2] = ' '; + else + { + Display->DisplayData[2] = t; + Number = Number - t*100000; + } + + t = Number/10000; + if ((t==0)&&(Display->DisplayData[2] == ' ')) + Display->DisplayData[3] = ' '; + else + { + Display->DisplayData[3] = t; + Number = Number - t*10000; + } + + t = Number/1000; + if ((t==0)&&(Display->DisplayData[3] == ' ')) + Display->DisplayData[4] = ' '; + else + { + Display->DisplayData[4] = t; + Number = Number - t*1000; + } + + t = Number/100; + if ((t==0)&&(Display->DisplayData[4] == ' ')) + Display->DisplayData[5] = ' '; + else + { + Display->DisplayData[5] = t; + Number = Number - t*100; + } + + t = Number/10; + if ((t==0)&&(Display->DisplayData[5] == ' ')) + Display->DisplayData[6] = ' '; + else + { + Display->DisplayData[6] = t; + Number = Number - t*10; + } + + Display->DisplayData[7] = Number; +} + +uint8_t __DS_MAX7219_ConvertSymbol(char Symbol) +{ + switch (Symbol) + { + case '0': + return 0; + break; + case '1': + return 1; + break; + case '2': + return 2; + break; + case '3': + return 3; + break; + case '4': + return 4; + break; + case '5': + return 5; + break; + case '6': + return 6; + break; + case '7': + return 7; + break; + case '8': + return 8; + break; + case '9': + return 9; + break; + case '-': + return 10; + break; + case 'E': + return 11; + break; + case 'H': + return 12; + break; + case 'L': + return 13; + break; + case 'P': + return 14; + break; + case ' ': + return 15; + break; + + default: + break; + } + return Symbol; +} + +void DS_MAX7219_UpdataDisplay(DS_MAX7219 *Display) +{ + for (uint8_t i = 0; i < 8; i++) + { + HAL_GPIO_WritePin(Display->Port_CS, Display->Pin_CS, GPIO_PIN_RESET); + uint16_t Data = (i+1<<8) + __DS_MAX7219_ConvertSymbol(Display->DisplayData[7-i]); + HAL_SPI_Transmit(Display->SPI, (uint8_t*) &Data, 1, 100); + HAL_GPIO_WritePin(Display->Port_CS, Display->Pin_CS, GPIO_PIN_SET); + } +} + +void DS_MAX7219_ConfigureDisplay(DS_MAX7219 *Display, uint8_t DecodeMode, uint8_t Intensivity, uint8_t ScanLimit) +{ + Display->DecodeMode = DecodeMode; + + if(Intensivity>0xF) + Display->Intensivity = 0xF; + else + Display->Intensivity = Intensivity; + + if(ScanLimit>0x7) + Display->ScanLimit = 0x7; + else + Display->ScanLimit = ScanLimit; + + __DS_MAX7219_SendConfigData(Display); +} + +void __DS_MAX7219_SendConfigData(DS_MAX7219 *Display) +{ + uint16_t Data[5]; + // 0 - Decode mode 0x9 + // 1 - Intensivity 0xA + // 2 - ScanLimit 0xB + // 3 - Shutdown mode 0xC + // 4 - Display test 0xF + if (Display->EnableDecodeMode) + Data[0]=0x9FF; + else + Data[0]=0x900; + + Data[1] = 0xA00 + Display->Intensivity; + Data[2] = 0xB00 + Display->ScanLimit; + Data[3] = 0xC00 + 1; + Data[4] = 0xF00 + 0; + + for (uint8_t i = 0; i < 5; i++) + { + HAL_GPIO_WritePin(Display->Port_CS, Display->Pin_CS, GPIO_PIN_RESET); + HAL_SPI_Transmit(Display->SPI, (uint8_t*) &Data[i], 1, 100); + HAL_GPIO_WritePin(Display->Port_CS, Display->Pin_CS, GPIO_PIN_SET); + } +}