optical/NxFuncs/keyled/digitaltube.c
2025-09-04 09:45:08 +08:00

277 lines
5.2 KiB
C

#include "digitaltube.h"
#include "shell.h"
#include "string.h"
//-------------------------------------------------------------
/*
a
*********
* *
f* *b
* g *
*********
* *
e* *c
* d * **p
********* **
*/
// 数码管的段定义
#define LED_A 0x01
#define LED_B 0x02
#define LED_C 0x04
#define LED_D 0x08
#define LED_E 0x10
#define LED_F 0x20
#define LED_G 0x40
#define LED_P 0x80
//-------------------------------------------------------------
// 显示字符定义
// 数字
static const u8 g_ledNumList[10] =
{
(LED_A|LED_B|LED_C|LED_D|LED_E|LED_F| 0) , // '0',
(LED_B|LED_C) , // '1',
(LED_A|LED_B|LED_D|LED_E|LED_G) , // '2',
(LED_A|LED_B|LED_C|LED_D|LED_G) , // '3',
(LED_B|LED_C|LED_F|LED_G) , // '4',
(LED_A|LED_C|LED_D|LED_F|LED_G) , // '5',
(LED_A|LED_C|LED_D|LED_E|LED_F|LED_G) , // '6',
(LED_A|LED_B|LED_C) , // '7',
(LED_A|LED_B|LED_C|LED_D|LED_E|LED_F|LED_G) , // '8',
(LED_A|LED_B|LED_C|LED_D|LED_F|LED_G) , // '9',
};
// 字母
static const u8 g_ledCharList[26] =
{
(LED_A|LED_B|LED_C|LED_E|LED_F|LED_G) , // 'A',
(LED_C|LED_D|LED_E|LED_F|LED_G) , // 'B',
(LED_A|LED_D|LED_E|LED_F) , // 'C',
(LED_B|LED_C|LED_D|LED_E|LED_G) , // 'D',
(LED_A|LED_D|LED_E|LED_F|LED_G) , // 'E',
(LED_A|LED_E|LED_F|LED_G) , // 'F',
(LED_A|LED_C|LED_D|LED_E|LED_F) , // 'G',
(LED_B|LED_C|LED_E|LED_F|LED_G) , // 'H',
(LED_E) , // 'I',
(LED_B|LED_C|LED_D|LED_E) , // 'J',
(LED_B|LED_D|LED_E|LED_F|LED_G) , // 'K',
(LED_D|LED_E|LED_F) , // 'L',
(LED_A|LED_C|LED_E|LED_G) , // 'M',
(LED_C|LED_E|LED_G) , // 'N',
(LED_C|LED_D|LED_E|LED_G) , // 'O',
(LED_A|LED_B|LED_E|LED_F|LED_G) , // 'P',
(LED_A|LED_B|LED_C|LED_F|LED_G) , // 'Q',
(LED_E|LED_G) , // 'R',
(LED_A|LED_C|LED_F|LED_G) , // 'S',
(LED_D|LED_E|LED_F|LED_G) , // 'T',
(LED_B|LED_C|LED_D|LED_E|LED_F) , // 'U',
(LED_B|LED_C|LED_D|LED_E|LED_F|LED_G) , // 'V',
(LED_A|LED_C|LED_D|LED_E) , // 'W',
(LED_B|LED_D|LED_F|LED_G) , // 'X',
(LED_B|LED_C|LED_D|LED_F|LED_G) , // 'Y',
(LED_A|LED_D|LED_G) , // 'Z',
};
typedef struct
{
u8 ch;
u8 code;
}SignMap;
#define SIGN_NUM 5
// 符号定义
static const SignMap g_ledSignList[SIGN_NUM] =
{
{'\0', (0)}, // 空字符
{' ', (0)}, // 空格
{'`', (0)}, // 显示为空
{'-', (LED_G)}, // 减号(横杠)
{'_', (LED_D)}, // 下画线
};
// 得到LED显示值
u8 GetLedValue(u8 ch)
{
u8 code = 0;
if (ch >= '0' && ch <= '9') // 数字
{
code = g_ledNumList[ch-'0'];
}
else if (ch >= 'a' && ch <= 'z') // 小写字母
{
code = g_ledCharList[ch-'a'];
}
else if (ch >= 'A' && ch <= 'Z') // 大写字母
{
code = g_ledCharList[ch-'A'];
}
else
{
int i;
for (i = 0; i < SIGN_NUM; i++)
{
if (g_ledSignList[i].ch == ch)
{
code = g_ledSignList[i].code;
break;
}
}
}
return (code & 0x7F);
}
// 添加点的信息
u8 AddDota(u8 ch)
{
return ch |= LED_P;
}
//-------------------------------------------------------------
typedef struct
{
u8 ledvalue[LED_NUM]; // 显示值
u8 dotvalue[LED_NUM]; // 显示点
u8 dispBuf[LED_NUM]; // 显示值
u8 displev; // 显示亮度
}LedCtrl;
LedCtrl g_ledctrl;
void TestLeds(char * para1, char * para2);
void MakeLedsDisp(void);
void InitDigialtubes(void)
{
memset(&g_ledctrl, 0, sizeof(LedCtrl));
g_ledctrl.displev = DISP_LEV(3)|DISP_ON;
TM1637SetLedDisp(0);
MakeLedsDisp();
TM1637WriteLedData(LED_REG_BEG_ADDR, g_ledctrl.dispBuf, g_ledctrl.displev);
TM1637SetLedDisp(5);
//AddShellCmd("LED", "test leds", TestLeds);
}
void MakeLedsDisp(void)
{
int i;
u8 disp;
for (i = 0; i < LED_NUM; i++)
{
disp = GetLedValue(g_ledctrl.ledvalue[i]);
if (g_ledctrl.dotvalue[i] == '.')
{
disp = AddDota(disp);
}
g_ledctrl.dispBuf[i] = disp;
}
}
void DisplayOnDig(char * strBuf, char * dotBuf)
{
int len;
memset(g_ledctrl.ledvalue, 0, LED_NUM);
memset(g_ledctrl.dotvalue, 0, LED_NUM);
if (strBuf != NULL)
{
len = strlen(strBuf);
if (len > LED_NUM)
{
len = LED_NUM;
}
memcpy(g_ledctrl.ledvalue, strBuf, len);
}
if (dotBuf != NULL)
{
len = strlen(dotBuf);
if (len > LED_NUM)
{
len = LED_NUM;
}
memcpy(g_ledctrl.dotvalue, dotBuf, len);
}
MakeLedsDisp();
TM1637WriteLedData(LED_REG_BEG_ADDR, g_ledctrl.dispBuf, g_ledctrl.displev);
}
//-------------------------------------------------------------
// 测试功能
void TestLeds(char * para1, char * para2)
{
int p1, p2;
if (para1 == NULL || para2 == NULL)
{
return;
}
printf("para1=%s, para2=%s\r\n", para1, para2);
p1 = 0;
p2 = 0;
if (strcmp(para1, "") != 0)
{
p1 = atoi(para1);
if (strcmp(para2, "") != 0)
{
p2 = atoi(para2);
}
}
if (p1 == p2)
{
}
//--------------------------------
{
if (p1 == 0)
{
if (p2 == 100)
{
memset(&g_ledctrl, 0, sizeof(LedCtrl));
g_ledctrl.displev = DISP_LEV(3)|DISP_ON;
}
}
else if (p1 > 0 && p1 <= 5)
{
g_ledctrl.ledvalue[p1-1] = p2;
}
else if (p1 > 10 && p1 <= 15)
{
g_ledctrl.dotvalue[p1-11] = p2;
}
else if (p1 == 100)
{
memset(g_ledctrl.ledvalue, 0, LED_NUM);
memcpy(g_ledctrl.ledvalue, para2, LED_NUM);
}
MakeLedsDisp();
TM1637WriteLedData(LED_REG_BEG_ADDR, g_ledctrl.dispBuf, g_ledctrl.displev);
}
}
//-------------------------------------------------------------