#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->Intensivity = 8; Display->ScanLimit = 7; Display->DecodeMode = 0; Display->EnableDecodeMode = true; Display->PORT_CS = PORT_CS; Display->Pin_CS = Pin_CS; Display->DisplaData[0]= Display->DisplaData[1]= Display->DisplaData[2]= Display->DisplaData[3]= Display->DisplaData[4]= Display->DisplaData[5]= Display->DisplaData[6]= Display->DisplaData[7]=' '; __DS_MAX7219_SendConfigData(Display); DS_MAX7219_UpdateDisplay(Display); } void DS_MAX7219_Print(DS_MAX7219* Display, int64_t Number) { if(Number<0) { Display->DisplaData[0] = '-'; Number = Number * -1; } else Display->DisplaData[0] = ' '; uint8_t t = Number/1000000; if(t==0) Display->DisplaData[1] = ' '; else if(t<10) { Display->DisplaData[1] = t; Number = Number - t*1000000; } else { Display->DisplaData[0]= Display->DisplaData[1]= Display->DisplaData[2]= Display->DisplaData[3]= Display->DisplaData[4]= Display->DisplaData[5]= Display->DisplaData[6]= Display->DisplaData[7]='9'; } t = Number / 100000; if(t==0) Display->DisplaData[2] = ' '; else { Display->DisplaData[2] = t; Number = Number - t*100000; } t = Number / 10000; if(t==0) Display->DisplaData[3] = ' '; else { Display->DisplaData[3] = t; Number = Number - t*10000; } t = Number / 1000; if(t==0) Display->DisplaData[4] = ' '; else { Display->DisplaData[4] = t; Number = Number - t*1000; } t = Number / 100; if(t==0) Display->DisplaData[5] = ' '; else { Display->DisplaData[5] = t; Number = Number - t*100; } t = Number / 10; if(t==0) Display->DisplaData[6] = ' '; else { Display->DisplaData[6] = t; Number = Number - t*10; } Display->DisplaData[7] = Number; } void DS_MAX7219_UpdateDisplay(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->DisplaData[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 - DecodeMode 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_ConvertSymbol(char Symbol) { switch (Symbol) { // case '0': // return 0; // break; // case '1': // return 1; // break; // case '2': // return 3; // 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; }