Skip to content

Commit f605090

Browse files
authored
Merge pull request #4 from Vinzenz82/feature/show-chars
Support STM with LL library, support ASCII chars directly, added much more glyphs
2 parents 4cf7d03 + 0f8905d commit f605090

4 files changed

Lines changed: 296 additions & 8 deletions

File tree

TM1638.c

Lines changed: 208 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
/**
6565
* @brief Convert HEX number to Seven-Segment code
6666
*/
67-
const uint8_t HexTo7Seg[16] =
67+
const uint8_t HexTo7Seg[40] =
6868
{
6969
0x3F, // 0
7070
0x06, // 1
@@ -81,7 +81,31 @@ const uint8_t HexTo7Seg[16] =
8181
0x39, // C
8282
0x5E, // d
8383
0x79, // E
84-
0x71 // F
84+
0x71, // F
85+
0x6F, // g
86+
0x3D, // G
87+
0x74, // h
88+
0x76, // H
89+
0x05, // i
90+
0x06, // I
91+
0x0D, // j
92+
0x30, // l
93+
0x38, // L
94+
0x54, // n
95+
0x37, // N
96+
0x5C, // o
97+
0x3F, // O
98+
0x73, // P
99+
0x67, // q
100+
0x50, // r
101+
0x6D, // S
102+
0x78, // t
103+
0x1C, // u
104+
0x3E, // U
105+
0x66, // y
106+
0x08, // _
107+
0x40, // -
108+
0x01 // Overscore
85109
};
86110

87111

@@ -518,6 +542,188 @@ TM1638_SetMultipleDigit_HEX(TM1638_Handler_t *Handler, const uint8_t *DigitData,
518542
(const uint8_t *)DigitDataHEX, StartAddr, Count);
519543
}
520544

545+
/**
546+
* @brief Set data to multiple digits in char format
547+
* @param Handler: Pointer to handler
548+
* @param DigitData: Array to Digits data.
549+
* Supported chars 0,1,2,3,4,5,6,7,8,9
550+
* A,b,C,d,E,F,g,G,h,H,i,I,j,l,L,n,N,o,O,P,q,r,S,t,u,U,y
551+
* _,-,Overscore (use ~ to set)
552+
*
553+
* @param StartAddr: First digit position
554+
* - 0: Seg1
555+
* - 1: Seg2
556+
* - .
557+
* - .
558+
* - .
559+
*
560+
* @param Count: Number of segments to write data
561+
* @retval TM1638_Result_t
562+
* - TM1638_OK: Operation was successful
563+
*/
564+
TM1638_Result_t
565+
TM1638_SetMultipleDigit_CHAR(TM1638_Handler_t *Handler, const uint8_t *DigitData,
566+
uint8_t StartAddr, uint8_t Count)
567+
{
568+
uint8_t DigitDataHEX[10];
569+
uint8_t DecimalPoint = 0;
570+
571+
for (uint8_t i = 0; i < Count; i++)
572+
{
573+
DecimalPoint = DigitData[i] & 0x80;
574+
575+
// numbers 0 - 9
576+
if ((DigitData[i] & 0x7F) >= (uint8_t)'0' && (DigitData[i] & 0x7F) <= (uint8_t)'9')
577+
{
578+
DigitDataHEX[i] = HexTo7Seg[(DigitData[i]-48) & 0x7F] | DecimalPoint;
579+
}
580+
else
581+
{
582+
switch (DigitData[i] & 0x7F)
583+
{
584+
case 'A':
585+
case 'a':
586+
DigitDataHEX[i] = HexTo7Seg[0x0A] | DecimalPoint;
587+
break;
588+
589+
case 'B':
590+
case 'b':
591+
DigitDataHEX[i] = HexTo7Seg[0x0B] | DecimalPoint;
592+
break;
593+
594+
case 'C':
595+
case 'c':
596+
DigitDataHEX[i] = HexTo7Seg[0x0C] | DecimalPoint;
597+
break;
598+
599+
case 'D':
600+
case 'd':
601+
DigitDataHEX[i] = HexTo7Seg[0x0D] | DecimalPoint;
602+
break;
603+
604+
case 'E':
605+
case 'e':
606+
DigitDataHEX[i] = HexTo7Seg[0x0E] | DecimalPoint;
607+
break;
608+
609+
case 'F':
610+
case 'f':
611+
DigitDataHEX[i] = HexTo7Seg[0x0F] | DecimalPoint;
612+
break;
613+
614+
case 'g':
615+
DigitDataHEX[i] = HexTo7Seg[0x10] | DecimalPoint;
616+
break;
617+
618+
case 'G':
619+
DigitDataHEX[i] = HexTo7Seg[0x11] | DecimalPoint;
620+
break;
621+
622+
case 'h':
623+
DigitDataHEX[i] = HexTo7Seg[0x12] | DecimalPoint;
624+
break;
625+
626+
case 'H':
627+
DigitDataHEX[i] = HexTo7Seg[0x13] | DecimalPoint;
628+
break;
629+
630+
case 'i':
631+
DigitDataHEX[i] = HexTo7Seg[0x14] | DecimalPoint;
632+
break;
633+
634+
case 'I':
635+
DigitDataHEX[i] = HexTo7Seg[0x15] | DecimalPoint;
636+
break;
637+
638+
case 'j':
639+
case 'J':
640+
DigitDataHEX[i] = HexTo7Seg[0x16] | DecimalPoint;
641+
break;
642+
643+
case 'l':
644+
DigitDataHEX[i] = HexTo7Seg[0x17] | DecimalPoint;
645+
break;
646+
647+
case 'L':
648+
DigitDataHEX[i] = HexTo7Seg[0x18] | DecimalPoint;
649+
break;
650+
651+
case 'n':
652+
DigitDataHEX[i] = HexTo7Seg[0x19] | DecimalPoint;
653+
break;
654+
655+
case 'N':
656+
DigitDataHEX[i] = HexTo7Seg[0x1A] | DecimalPoint;
657+
break;
658+
659+
case 'o':
660+
DigitDataHEX[i] = HexTo7Seg[0x1B] | DecimalPoint;
661+
break;
662+
663+
case 'O':
664+
DigitDataHEX[i] = HexTo7Seg[0x1C] | DecimalPoint;
665+
break;
666+
667+
case 'p':
668+
case 'P':
669+
DigitDataHEX[i] = HexTo7Seg[0x1D] | DecimalPoint;
670+
break;
671+
672+
case 'q':
673+
case 'Q':
674+
DigitDataHEX[i] = HexTo7Seg[0x1E] | DecimalPoint;
675+
break;
676+
677+
case 'r':
678+
case 'R':
679+
DigitDataHEX[i] = HexTo7Seg[0x1F] | DecimalPoint;
680+
break;
681+
682+
case 's':
683+
case 'S':
684+
DigitDataHEX[i] = HexTo7Seg[0x20] | DecimalPoint;
685+
break;
686+
687+
case 't':
688+
case 'T':
689+
DigitDataHEX[i] = HexTo7Seg[0x21] | DecimalPoint;
690+
break;
691+
692+
case 'u':
693+
DigitDataHEX[i] = HexTo7Seg[0x22] | DecimalPoint;
694+
break;
695+
696+
case 'U':
697+
DigitDataHEX[i] = HexTo7Seg[0x23] | DecimalPoint;
698+
break;
699+
700+
case 'y':
701+
case 'Y':
702+
DigitDataHEX[i] = HexTo7Seg[0x24] | DecimalPoint;
703+
break;
704+
705+
case '_':
706+
DigitDataHEX[i] = HexTo7Seg[0x25] | DecimalPoint;
707+
break;
708+
709+
case '-':
710+
DigitDataHEX[i] = HexTo7Seg[0x26] | DecimalPoint;
711+
break;
712+
713+
case '~':
714+
DigitDataHEX[i] = HexTo7Seg[0x27] | DecimalPoint;
715+
break;
716+
717+
default:
718+
DigitDataHEX[i] = 0;
719+
break;
720+
}
721+
}
722+
}
723+
724+
return TM1638_SetMultipleDigit(Handler,
725+
(const uint8_t *)DigitDataHEX, StartAddr, Count);
726+
}
521727

522728
/**
523729
==================================================================================

TM1638.h

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,28 @@ TM1638_Result_t
262262
TM1638_SetMultipleDigit_HEX(TM1638_Handler_t *Handler, const uint8_t *DigitData,
263263
uint8_t StartAddr, uint8_t Count);
264264

265-
265+
/**
266+
* @brief Set data to multiple digits in char format
267+
* @param Handler: Pointer to handler
268+
* @param DigitData: Array to Digits data.
269+
* Supported chars 0,1,2,3,4,5,6,7,8,9
270+
* A,b,C,d,E,F,g,G,h,H,i,I,j,l,L,n,N,o,O,P,q,r,S,t,u,U,y
271+
* _,-,Overscore (use ~ to set)
272+
*
273+
* @param StartAddr: First digit position
274+
* - 0: Seg1
275+
* - 1: Seg2
276+
* - .
277+
* - .
278+
* - .
279+
*
280+
* @param Count: Number of segments to write data
281+
* @retval TM1638_Result_t
282+
* - TM1638_OK: Operation was successful
283+
*/
284+
TM1638_Result_t
285+
TM1638_SetMultipleDigit_CHAR(TM1638_Handler_t *Handler, const uint8_t *DigitData,
286+
uint8_t StartAddr, uint8_t Count);
266287

267288
/**
268289
==================================================================================

TM1638_platform.c

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
#include <util/delay.h>
3838
#elif defined(TM1638_PLATFORM_STM32)
3939
#include "main.h"
40+
#elif defined(TM1638_PLATFORM_STM32_LL)
41+
#include "main.h"
4042
#elif defined(TM1638_PLATFORM_ESP32_IDF)
4143
#include "freertos/FreeRTOS.h"
4244
#include "driver/gpio.h"
@@ -71,6 +73,29 @@ void TM1638_SetGPIO_IN_PU(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
7173
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
7274
HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
7375
}
76+
#elif defined(TM1638_PLATFORM_STM32_LL)
77+
void TM1638_SetGPIO_OUT(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
78+
{
79+
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
80+
81+
GPIO_InitStruct.Pin = GPIO_Pin;
82+
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
83+
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
84+
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
85+
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
86+
LL_GPIO_Init(GPIOx, &GPIO_InitStruct);
87+
}
88+
89+
void TM1638_SetGPIO_IN_PU(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
90+
{
91+
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
92+
93+
GPIO_InitStruct.Pin = GPIO_Pin;
94+
GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
95+
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
96+
GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
97+
LL_GPIO_Init(GPIOx, &GPIO_InitStruct);
98+
}
7499
#elif defined(TM1638_PLATFORM_ESP32_IDF)
75100
void TM1638_SetGPIO_OUT(gpio_num_t GPIO_Pad)
76101
{
@@ -93,7 +118,7 @@ TM1638_PlatformInit(void)
93118
TM1638_CLK_DDR |= (1<<TM1638_CLK_NUM);
94119
TM1638_DIO_DDR |= (1<<TM1638_DIO_NUM);
95120
TM1638_STB_DDR |= (1<<TM1638_STB_NUM);
96-
#elif defined(TM1638_PLATFORM_STM32)
121+
#elif defined(TM1638_PLATFORM_STM32) || defined(TM1638_PLATFORM_STM32_LL)
97122
TM1638_SetGPIO_OUT(TM1638_CLK_GPIO, TM1638_CLK_PIN);
98123
TM1638_SetGPIO_OUT(TM1638_STB_GPIO, TM1638_STB_PIN);
99124
TM1638_SetGPIO_OUT(TM1638_DIO_GPIO, TM1638_DIO_PIN);
@@ -113,7 +138,7 @@ TM1638_PlatformDeInit(void)
113138
TM1638_DIO_PORT &= ~(1<<TM1638_DIO_NUM);
114139
TM1638_STB_DDR &= ~(1<<TM1638_STB_NUM);
115140
TM1638_STB_PORT &= ~(1<<TM1638_STB_NUM);
116-
#elif defined(TM1638_PLATFORM_STM32)
141+
#elif defined(TM1638_PLATFORM_STM32) || defined(TM1638_PLATFORM_STM32_LL)
117142

118143
#elif defined(TM1638_PLATFORM_ESP32_IDF)
119144
gpio_reset_pin(TM1638_CLK_GPIO);
@@ -127,7 +152,7 @@ TM1638_DioConfigOut(void)
127152
{
128153
#if defined(TM1638_PLATFORM_AVR)
129154
TM1638_DIO_DDR |= (1<<TM1638_DIO_NUM);
130-
#elif defined(TM1638_PLATFORM_STM32)
155+
#elif defined(TM1638_PLATFORM_STM32) || defined(TM1638_PLATFORM_STM32_LL)
131156
TM1638_SetGPIO_OUT(TM1638_DIO_GPIO, TM1638_DIO_PIN);
132157
#elif defined(TM1638_PLATFORM_ESP32_IDF)
133158
TM1638_SetGPIO_OUT(TM1638_DIO_GPIO);
@@ -139,7 +164,7 @@ TM1638_DioConfigIn(void)
139164
{
140165
#if defined(TM1638_PLATFORM_AVR)
141166
TM1638_DIO_DDR &= ~(1<<TM1638_DIO_NUM);
142-
#elif defined(TM1638_PLATFORM_STM32)
167+
#elif defined(TM1638_PLATFORM_STM32) || defined(TM1638_PLATFORM_STM32_LL)
143168
TM1638_SetGPIO_IN_PU(TM1638_DIO_GPIO, TM1638_DIO_PIN);
144169
#elif defined(TM1638_PLATFORM_ESP32_IDF)
145170
TM1638_SetGPIO_IN_PU(TM1638_DIO_GPIO);
@@ -156,6 +181,13 @@ TM1638_DioWrite(uint8_t Level)
156181
TM1638_DIO_PORT &= ~(1<<TM1638_DIO_NUM);
157182
#elif defined(TM1638_PLATFORM_STM32)
158183
HAL_GPIO_WritePin(TM1638_DIO_GPIO, TM1638_DIO_PIN, Level);
184+
#elif defined(TM1638_PLATFORM_STM32_LL)
185+
if( Level != 0u) {
186+
LL_GPIO_SetOutputPin(TM1638_DIO_GPIO, TM1638_DIO_PIN);
187+
}
188+
else {
189+
LL_GPIO_ResetOutputPin(TM1638_DIO_GPIO, TM1638_DIO_PIN);
190+
}
159191
#elif defined(TM1638_PLATFORM_ESP32_IDF)
160192
gpio_set_level(TM1638_DIO_GPIO, Level);
161193
#endif
@@ -169,6 +201,8 @@ TM1638_DioRead(void)
169201
Result = (TM1638_DIO_PIN & (1 << TM1638_DIO_NUM)) ? 1 : 0;
170202
#elif defined(TM1638_PLATFORM_STM32)
171203
Result = HAL_GPIO_ReadPin(TM1638_DIO_GPIO, TM1638_DIO_PIN);
204+
#elif defined(TM1638_PLATFORM_STM32_LL)
205+
Result = (LL_GPIO_ReadInputPort(TM1638_DIO_GPIO) & TM1638_DIO_PIN) == TM1638_DIO_PIN;
172206
#elif defined(TM1638_PLATFORM_ESP32_IDF)
173207
Result = gpio_get_level(TM1638_DIO_GPIO);
174208
#endif
@@ -185,6 +219,13 @@ TM1638_ClkWrite(uint8_t Level)
185219
TM1638_CLK_PORT &= ~(1<<TM1638_CLK_NUM);
186220
#elif defined(TM1638_PLATFORM_STM32)
187221
HAL_GPIO_WritePin(TM1638_CLK_GPIO, TM1638_CLK_PIN, Level);
222+
#elif defined(TM1638_PLATFORM_STM32_LL)
223+
if( Level != 0u) {
224+
LL_GPIO_SetOutputPin(TM1638_CLK_GPIO, TM1638_CLK_PIN);
225+
}
226+
else {
227+
LL_GPIO_ResetOutputPin(TM1638_CLK_GPIO, TM1638_CLK_PIN);
228+
}
188229
#elif defined(TM1638_PLATFORM_ESP32_IDF)
189230
gpio_set_level(TM1638_CLK_GPIO, Level);
190231
#endif
@@ -200,6 +241,13 @@ TM1638_StbWrite(uint8_t Level)
200241
TM1638_STB_PORT &= ~(1<<TM1638_STB_NUM);
201242
#elif defined(TM1638_PLATFORM_STM32)
202243
HAL_GPIO_WritePin(TM1638_STB_GPIO, TM1638_STB_PIN, Level);
244+
#elif defined(TM1638_PLATFORM_STM32_LL)
245+
if( Level != 0u) {
246+
LL_GPIO_SetOutputPin(TM1638_STB_GPIO, TM1638_STB_PIN);
247+
}
248+
else {
249+
LL_GPIO_ResetOutputPin(TM1638_STB_GPIO, TM1638_STB_PIN);
250+
}
203251
#elif defined(TM1638_PLATFORM_ESP32_IDF)
204252
gpio_set_level(TM1638_STB_GPIO, Level);
205253
#endif
@@ -211,7 +259,7 @@ TM1638_DelayUs(uint8_t Delay)
211259
#if defined(TM1638_PLATFORM_AVR)
212260
for (; Delay; --Delay)
213261
_delay_us(1);
214-
#elif defined(TM1638_PLATFORM_STM32)
262+
#elif defined(TM1638_PLATFORM_STM32) || defined(TM1638_PLATFORM_STM32_LL)
215263
for (uint32_t DelayCounter = 0; DelayCounter < 100 * Delay; DelayCounter++)
216264
DelayCounter = DelayCounter;
217265
#elif defined(TM1638_PLATFORM_ESP32_IDF)

0 commit comments

Comments
 (0)