#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) { 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); } }