Merge pull request 'Version 1.0' (#1) from Dev into main
Reviewed-on: http://192.168.0.103:3000/Library/DS_MAX7219/pulls/1
This commit is contained in:
30
Inc/DS_MAX7219.h
Normal file
30
Inc/DS_MAX7219.h
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
#ifndef DSMAX7219_H
|
||||||
|
#define DSMAX7219_H
|
||||||
|
|
||||||
|
#include "stm32f0xx_hal.h"
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
typedef struct DS_MAX7219
|
||||||
|
{
|
||||||
|
SPI_HandleTypeDef* SPI;
|
||||||
|
char DisplayData[8];
|
||||||
|
uint8_t Dots;
|
||||||
|
uint8_t DecodeMode, Intensivity, ScanLimit;
|
||||||
|
bool EnableDecodeMode;
|
||||||
|
GPIO_TypeDef* Port_CS;
|
||||||
|
uint16_t Pin_CS;
|
||||||
|
}DS_MAX7219;
|
||||||
|
|
||||||
|
void DS_MAX7219_Init(DS_MAX7219* Display, SPI_HandleTypeDef* SPI, GPIO_TypeDef* Port_CS, uint16_t Pin_CS);
|
||||||
|
|
||||||
|
void DS_MAX7219_EnableDots(DS_MAX7219* Display, uint8_t Dots);
|
||||||
|
|
||||||
|
void DS_MAX7219_Print(DS_MAX7219* Display, int64_t 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);
|
||||||
|
|
||||||
|
#endif //DSMAX7219_H
|
||||||
221
Src/DS_MAX7219.c
Normal file
221
Src/DS_MAX7219.c
Normal file
@@ -0,0 +1,221 @@
|
|||||||
|
#include "../inc/DS_MAX7219.h"
|
||||||
|
#include <stdio.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->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)
|
||||||
|
{
|
||||||
|
|
||||||
|
//sprintf(Display->DisplayData, "%lld", 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user