Compare commits
6 Commits
f9d87948d6
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 83ace09636 | |||
| 2c84f55b21 | |||
| 77ae4c005b | |||
| 5815085de1 | |||
| 30a9b33b25 | |||
| ace707c10d |
@@ -1,8 +1,16 @@
|
|||||||
#ifndef DSMAX7219_H
|
#ifndef DSMAX7219_H
|
||||||
#define DSMAX7219_H
|
#define DSMAX7219_H
|
||||||
|
|
||||||
#include "stm32f0xx_hal.h"
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#ifdef STM32G030xx
|
||||||
|
#include "stm32g0xx_hal.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef STM32F030xx
|
||||||
|
#include "stm32f0xx_hal.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct DS_MAX7219
|
typedef struct DS_MAX7219
|
||||||
{
|
{
|
||||||
@@ -17,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
|
||||||
185
Src/DS_MAX7219.c
185
Src/DS_MAX7219.c
@@ -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,12 +24,13 @@ 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)
|
||||||
{
|
{
|
||||||
|
|
||||||
//sprintf(Display->DisplayData, "%lld", Number);
|
|
||||||
|
|
||||||
|
|
||||||
if (Number<0)
|
if (Number<0)
|
||||||
{
|
{
|
||||||
Display->DisplayData[0] = '-';
|
Display->DisplayData[0] = '-';
|
||||||
@@ -107,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)
|
||||||
@@ -170,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]) + ((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);
|
||||||
uint16_t Data = (i+1<<8) + __DS_MAX7219_ConvertSymbol(Display->DisplayData[7-i]);
|
|
||||||
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)
|
||||||
@@ -219,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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user