print float numbers #4

Merged
Mikhail merged 1 commits from Dev into main 2025-05-18 04:55:18 -04:00
2 changed files with 187 additions and 1 deletions

View File

@@ -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); 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_EnableDots(DS_MAX7219* Display, uint8_t Dots);
void DS_MAX7219_Print(DS_MAX7219* Display, int64_t Number); 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_UpdataDisplay(DS_MAX7219* Display);
void DS_MAX7219_ConfigureDisplay(DS_MAX7219* Display, uint8_t DecodeMode, uint8_t Intensivity, uint8_t ScanLimit); void DS_MAX7219_ConfigureDisplay(DS_MAX7219* Display, uint8_t DecodeMode, uint8_t Intensivity, uint8_t ScanLimit);
void __DS_MAX7219_SendConfigData(DS_MAX7219* Display); void __DS_MAX7219_SendConfigData(DS_MAX7219* Display);
uint8_t __DS_Max7219_MakeNumberGreaterOne(float, uint8_t);
#endif //DSMAX7219_H #endif //DSMAX7219_H

View File

@@ -1,5 +1,6 @@
#include "../inc/DS_MAX7219.h" #include "../inc/DS_MAX7219.h"
#include <stdio.h> #include <stdio.h>
#include "DS_MAX7219.h"
void DS_MAX7219_Init(DS_MAX7219* Display, SPI_HandleTypeDef* SPI, GPIO_TypeDef* Port_CS, uint16_t Pin_CS) 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->Intensivity = 8;
Display->ScanLimit = 7; Display->ScanLimit = 7;
Display->EnableDecodeMode = true; Display->EnableDecodeMode = true;
Display->Dots = 0;
Display->Port_CS = Port_CS; Display->Port_CS = Port_CS;
Display->Pin_CS = Pin_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); 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) void DS_MAX7219_Print(DS_MAX7219* Display, int64_t Number)
{ {
if (Number<0) if (Number<0)
@@ -103,6 +110,166 @@ void DS_MAX7219_Print(DS_MAX7219* Display, int64_t Number)
Display->DisplayData[7] = 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) uint8_t __DS_MAX7219_ConvertSymbol(char Symbol)
{ {
switch (Symbol) switch (Symbol)
@@ -166,11 +333,12 @@ void DS_MAX7219_UpdataDisplay(DS_MAX7219 *Display)
{ {
for (uint8_t i = 0; i < 8; i++) 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_GPIO_WritePin(Display->Port_CS, Display->Pin_CS, GPIO_PIN_RESET);
HAL_SPI_Transmit(Display->SPI, (uint8_t*) &Data, 1, 100); HAL_SPI_Transmit(Display->SPI, (uint8_t*) &Data, 1, 100);
HAL_GPIO_WritePin(Display->Port_CS, Display->Pin_CS, GPIO_PIN_SET); 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) 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); 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;
}