#include "../inc/DS_MAX7219.h" #include #include "DS_MAX7219.h" 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->Dots = 0; 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_EnableDots(DS_MAX7219* Display, uint8_t Dots) { Display->Dots = Dots; } void DS_MAX7219_Print(DS_MAX7219* Display, int64_t 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; } void DS_MAX7219_PrintFloat(DS_MAX7219* Display, float Number) { uint64_t tempNumber = 0; if (Number<0) { Display->DisplayData[0] = '-'; Number = Number * -1; } else Display->DisplayData[0] = ' '; if (Number > 9999999) { tempNumber = 100000000; } if (Number == 0) { tempNumber = 0; DS_MAX7219_EnableDots(Display, 0); } else if (Number < 1) { uint8_t Zeroes = __DS_Max7219_MakeNumberGreaterOne(Number, 0); if (Zeroes > 8) { tempNumber = 100000000; } for (uint8_t i = 0; i < Zeroes; i++) { Display->DisplayData[i+1] = 0; } tempNumber = Number * 1000000; DS_MAX7219_EnableDots(Display, 0x40); } else { if (Number < 10) { tempNumber = Number * 100000; DS_MAX7219_EnableDots(Display, 0x20); } if (Number < 100) { tempNumber = Number * 10000; DS_MAX7219_EnableDots(Display, 0x10); } if (Number < 1000) { tempNumber = Number * 1000; DS_MAX7219_EnableDots(Display, 0x8); } if (Number < 10000) { tempNumber = Number * 100; DS_MAX7219_EnableDots(Display, 0x4); } if (Number < 100000) { tempNumber = Number * 10; DS_MAX7219_EnableDots(Display, 0x2); } if (Number < 1000000) { tempNumber = Number * 1; DS_MAX7219_EnableDots(Display, 0x1); } } uint8_t t = tempNumber/1000000; if (t==0 && Display->DisplayData[1] != 0) Display->DisplayData[1] = ' '; else if (t<10) { Display->DisplayData[1] = t; tempNumber = tempNumber - 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 = tempNumber/100000; if ((t==0)&&(Display->DisplayData[1] == ' ')) Display->DisplayData[2] = ' '; else { Display->DisplayData[2] = t; tempNumber = tempNumber - t*100000; } t = tempNumber/10000; if ((t==0)&&(Display->DisplayData[2] == ' ')) Display->DisplayData[3] = ' '; else { Display->DisplayData[3] = t; tempNumber = tempNumber - t*10000; } t = tempNumber/1000; if ((t==0)&&(Display->DisplayData[3] == ' ')) Display->DisplayData[4] = ' '; else { Display->DisplayData[4] = t; tempNumber = tempNumber - t*1000; } t = tempNumber/100; if ((t==0)&&(Display->DisplayData[4] == ' ')) Display->DisplayData[5] = ' '; else { Display->DisplayData[5] = t; tempNumber = tempNumber - t*100; } t = tempNumber/10; if ((t==0)&&(Display->DisplayData[5] == ' ')) Display->DisplayData[6] = ' '; else { Display->DisplayData[6] = t; tempNumber = tempNumber - t*10; } Display->DisplayData[7] = tempNumber; } 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++) { uint16_t Data = ((i+1)<<8) + __DS_MAX7219_ConvertSymbol(Display->DisplayData[7-i]) + ((Display->Dots >> i & (1)) << 7); HAL_GPIO_WritePin(Display->Port_CS, Display->Pin_CS, GPIO_PIN_RESET); 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); } } uint8_t __DS_Max7219_MakeNumberGreaterOne(float Number, uint8_t Counter) { if (Number < 1) { Counter++; Counter = __DS_Max7219_MakeNumberGreaterOne(Number * 10, Counter); } return Counter; }