From 2c84f55b21972f6a1a2f148b0e6c71dd5373566c Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sun, 18 May 2025 11:48:53 +0300 Subject: [PATCH] print float numbers --- Inc/DS_MAX7219.h | 7 ++ Src/DS_MAX7219.c | 181 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 187 insertions(+), 1 deletion(-) diff --git a/Inc/DS_MAX7219.h b/Inc/DS_MAX7219.h index df8921a..6f1a5e2 100644 --- a/Inc/DS_MAX7219.h +++ b/Inc/DS_MAX7219.h @@ -25,14 +25,21 @@ typedef struct DS_MAX7219 void DS_MAX7219_Init(DS_MAX7219* Display, SPI_HandleTypeDef* SPI, GPIO_TypeDef* Port_CS, uint16_t Pin_CS); +/// @brief Enabled dots from display. Each bit - dot +/// @param Display +/// @param Dots 0 - 0xFF void DS_MAX7219_EnableDots(DS_MAX7219* Display, uint8_t Dots); void DS_MAX7219_Print(DS_MAX7219* Display, int64_t Number); +void DS_MAX7219_PrintFloat(DS_MAX7219* Display, float 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); +uint8_t __DS_Max7219_MakeNumberGreaterOne(float, uint8_t); + #endif //DSMAX7219_H \ No newline at end of file diff --git a/Src/DS_MAX7219.c b/Src/DS_MAX7219.c index c46229a..44dc7ce 100644 --- a/Src/DS_MAX7219.c +++ b/Src/DS_MAX7219.c @@ -1,5 +1,6 @@ #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) { @@ -9,6 +10,7 @@ void DS_MAX7219_Init(DS_MAX7219* Display, SPI_HandleTypeDef* SPI, GPIO_TypeDef* Display->Intensivity = 8; Display->ScanLimit = 7; Display->EnableDecodeMode = true; + Display->Dots = 0; Display->Port_CS = Port_CS; Display->Pin_CS = Pin_CS; @@ -22,6 +24,11 @@ void DS_MAX7219_Init(DS_MAX7219* Display, SPI_HandleTypeDef* SPI, GPIO_TypeDef* 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) @@ -103,6 +110,166 @@ void DS_MAX7219_Print(DS_MAX7219* Display, int64_t Number) 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) @@ -166,11 +333,12 @@ 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]); + 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) @@ -215,3 +383,14 @@ void __DS_MAX7219_SendConfigData(DS_MAX7219 *Display) 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; +} \ No newline at end of file