K1Guitar/device/TM1629D/Drv_TM1629D_Key_Led.c

845 lines
28 KiB
C
Raw Normal View History

/*
* @Author: CTW
* @Date: 2025-11-07 14:37:55
* @FilePath: \PhoenixSMGT_Testproject\Drivers\TM1629D\Drv_TM1629D_Key_Led.c
* @note: 从 STM32 HAL 库移植到 AT32F403A,软件模拟时序(GPIO 位翻转)
* - HAL_GPIO_WritePin/ReadPin/Init -> at32f403a_407 库 GPIO 函数
* - Delay_us / Delay_ms -> 内置忙等延时
*/
#include "Drv_TM1629D_Key_Led.h"
#include <stddef.h>
/* ================= 底层原语(AT32 GPIO) ================= */
#define TM1629D_DIO_H() gpio_bits_set(TM1629D_DIO_PORT, TM1629D_DIO_PIN)
#define TM1629D_DIO_L() gpio_bits_reset(TM1629D_DIO_PORT, TM1629D_DIO_PIN)
#define TM1629D_CLK_H() gpio_bits_set(TM1629D_CLK_PORT, TM1629D_CLK_PIN)
#define TM1629D_CLK_L() gpio_bits_reset(TM1629D_CLK_PORT, TM1629D_CLK_PIN)
#define TM1629D_STB_H() gpio_bits_set(TM1629D_STB_PORT, TM1629D_STB_PIN)
#define TM1629D_STB_L() gpio_bits_reset(TM1629D_STB_PORT, TM1629D_STB_PIN)
/* 忙等延时:约 1us(NOP 循环,不依赖 SysTick/RTOS) */
static void TM1629D_Delay1us(void)
{
volatile uint32_t i = 24; /* 240MHz 下约 1us,可实测微调 */
while (i--) __NOP();
}
/* DIO 引脚切换为输出模式(推挽) */
static void TM1629D_DIO_Output(void)
{
gpio_init_type g;
gpio_default_para_init(&g);
g.gpio_mode = GPIO_MODE_OUTPUT;
g.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
g.gpio_pull = GPIO_PULL_NONE;
g.gpio_pins = TM1629D_DIO_PIN;
gpio_init(TM1629D_DIO_PORT, &g);
}
/* DIO 引脚切换为输入模式(读按键)。上拉:板子拔掉时读到全 1,用来识别未插入。 */
static void TM1629D_DIO_Input(void)
{
gpio_init_type g;
gpio_default_para_init(&g);
g.gpio_mode = GPIO_MODE_INPUT;
g.gpio_pull = GPIO_PULL_UP;
g.gpio_pins = TM1629D_DIO_PIN;
gpio_init(TM1629D_DIO_PORT, &g);
}
/* 显示模式 + 开显示。芯片掉电(拔插/后插入)后必须重发,否则显存写了也不亮。 */
static void TM1629D_DisplayOn(void)
{
TM1629D_STB_L();
TM1629D_Delay1us();
TM1629D_SendByte(0x40);
TM1629D_STB_H();
TM1629D_Delay1us();
TM1629D_STB_L();
TM1629D_Delay1us();
TM1629D_SendByte(0x8F);
TM1629D_STB_H();
TM1629D_Delay1us();
}
static void TM1629D_OnKeySample(const uint8_t *keyBuf);
/* GPIO初始化 */
void TM1629D_Key_LED_Init(void)
{
gpio_init_type g;
/* 使能 GPIOB / GPIOC 时钟 */
crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);
/* STB(PB11)、CLK(PB0)、DIO(PC4):推挽输出,初始拉高 */
gpio_default_para_init(&g);
g.gpio_mode = GPIO_MODE_OUTPUT;
g.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
g.gpio_pull = GPIO_PULL_NONE;
g.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
g.gpio_pins = TM1629D_STB_PIN;
gpio_init(TM1629D_STB_PORT, &g);
g.gpio_pins = TM1629D_CLK_PIN;
gpio_init(TM1629D_CLK_PORT, &g);
g.gpio_pins = TM1629D_DIO_PIN;
gpio_init(TM1629D_DIO_PORT, &g);
TM1629D_STB_H();
TM1629D_CLK_H();
TM1629D_DIO_H();
TM1629D_AllLedOff();
TM1629D_DisplayOn();
TM1629D_UpdateDisplay(0);
}
// 发送1字节数据(CLK上升沿锁存)
uint8_t TM1629D_SendByte(uint8_t dat)
{
uint8_t i;
for (i = 0; i < 8; i++)
{
TM1629D_CLK_L(); // CLK低
TM1629D_Delay1us(); // 满足最小脉冲宽度
// 输出当前bit(从低位开始)
if (dat & 0x01)
{
TM1629D_DIO_H();
}
else
{
TM1629D_DIO_L();
}
TM1629D_CLK_H(); // CLK高(锁存)
TM1629D_Delay1us();
dat >>= 1; // 移至下一位
}
return 0;
}
// 接收1字节数据(CLK上升沿读取)
uint8_t TM1629D_RecvByte(void) {
uint8_t i, dat = 0;
// DIO切换为输入
TM1629D_DIO_Input();
for (i = 0; i < 8; i++)
{
TM1629D_CLK_L(); // CLK低
TM1629D_Delay1us();
TM1629D_CLK_H(); // CLK高(读取)
TM1629D_Delay1us();
if (gpio_input_data_bit_read(TM1629D_DIO_PORT, TM1629D_DIO_PIN) == SET)
dat |= (0x01 << i);
}
// DIO切换回推挽输出
TM1629D_DIO_Output();
return dat;
}
// 读取4字节键扫数据(keyBuf[0]=BYTE1, keyBuf[1]=BYTE2...keyBuf[3]=BYTE4)
void TM1629D_ReadKeyData(uint8_t *keyBuf) {
if (keyBuf == NULL) return;
TM1629D_STB_L(); // STB拉低初始化
TM1629D_Delay1us(); // 满足STB最小低电平时间
TM1629D_SendByte(0x42); // 发送读键命令
TM1629D_Delay1us();
TM1629D_Delay1us(); // 等待Twait≥2μs
// 按顺序读取4字节
keyBuf[0] = TM1629D_RecvByte();
keyBuf[1] = TM1629D_RecvByte();
keyBuf[2] = TM1629D_RecvByte();
keyBuf[3] = TM1629D_RecvByte();
TM1629D_STB_H(); // STB拉高结束
}
// 按键映射表
static const sChordKeyMap m_sChordKeymap[] = {
// 解析BYTE1(keyBuf[0])
{0, 0x02, KEY_T1}, {0, 0x04, KEY_T2}, {0, 0x08, KEY_T3},
{0, 0x20, KEY_T4}, {0, 0x40, KEY_T5}, {0, 0x80, KEY_T6},
{0, 0x01, KEY_T22}, {0, 0x10, KEY_T23},
// 解析BYTE2(keyBuf[1])
{1, 0x02, KEY_T7}, {1, 0x04, KEY_T8}, {1, 0x08, KEY_T9},
{1, 0x20, KEY_T10}, {1, 0x40, KEY_T11}, {1, 0x80, KEY_T12},
// 解析BYTE3(keyBuf[2])
{2, 0x02, KEY_T13}, {2, 0x04, KEY_T14}, {2, 0x08, KEY_T15},
{2, 0x20, KEY_T16}, {2, 0x40, KEY_T17}, {2, 0x80, KEY_T18},
// 解析BYTE4(keyBuf[3])
{3, 0x02, KEY_T19}, {3, 0x04, KEY_T20}, {3, 0x08, KEY_T21},
};
// 获取按键状态
#define KEY_MAP_LEN (KEY_NUM - 1)
Key_TypeDef TM1629D_GetKey(void)
{
uint8_t keyBuf[4] = {0};
TM1629D_ReadKeyData(keyBuf); // 读取原始按键数据(与原逻辑一致)
TM1629D_OnKeySample(keyBuf);
/* 拔掉时上拉读到全 1,不能当成按键 */
if (keyBuf[0] == 0xFF && keyBuf[1] == 0xFF &&
keyBuf[2] == 0xFF && keyBuf[3] == 0xFF)
{
return KEY_NONE;
}
// 遍历映射表匹配按键(C语言循环写法)
for (uint8_t i = 0; i < KEY_MAP_LEN; i++)
{
const sChordKeyMap* map = &m_sChordKeymap[i]; // 显式结构体指针类型(替代auto)
// 检查对应bit是否置位
if (keyBuf[map->buf_idx] & map->mask)
{
return map->key; // 匹配到按键,返回
}
}
return KEY_NONE; // 无按键按下
}
/**
* @brief 设置指定GRID和SEG的LED状态
* @param grid:GRID编号(0~8)
* @param seg:SEG编号(0~8)
* @param on:1=点亮,0=熄灭
*/
// GRID0~8对应的HL(低字节)和HU(高字节)地址(共9个GRID,每个2字节)
// grid_addr[grid][0] = HL地址,grid_addr[grid][1] = HU地址
const uint8_t grid_addr[8][2] = {
{0xC0, 0xC1}, // GRID1
{0xC2, 0xC3}, // GRID2
{0xC4, 0xC5}, // GRID3
{0xC6, 0xC7}, // GRID4
{0xC8, 0xC9}, // GRID5
{0xCA, 0xCB}, // GRID6
{0xCC, 0xCD}, // GRID7
{0xCE, 0xCF}, // GRID8
};
// 显示缓存数组:对应GRID1~8的SEG1~8缓存情况
// 初始全为0(所有LED熄灭)
static uint8_t grid_Buf[8] = {
0x00, // GRID1
0x00, // GRID2
0x00, // GRID3
0x00, // GRID4
0x00, // GRID5
0x00, // GRID6
0x00, // GRID7
0x00, // GRID8
};
void TM1629D_SetGridSeg(uint8_t grid, uint8_t seg, uint8_t on)
{
if (grid >= 8 || seg >= 8)
{
return; // 越界检查
}
if (seg <= 3)
{ // SEG1~4对应HL低字节(bit0~3)
uint8_t bit = 0;
switch(seg)
{
case 0: bit = SEG1_HL_BIT; break;
case 1: bit = SEG2_HL_BIT; break;
case 2: bit = SEG3_HL_BIT; break;
case 3: bit = SEG4_HL_BIT; break;
}
if (on)
{
grid_Buf[grid] |= bit; // 置位(点亮)
}
else
{
grid_Buf[grid] &= ~bit; // 清零(熄灭)
}
}
else
{ // SEG5~8对应HU高字节(bit0~3)
uint8_t bit = 0;
switch(seg)
{
case 4: bit = SEG5_HU_BIT; break;
case 5: bit = SEG6_HU_BIT; break;
case 6: bit = SEG7_HU_BIT; break;
case 7: bit = SEG8_HU_BIT; break;
}
if (on)
{
grid_Buf[grid] |= bit; // 置位(点亮)
}
else
{
grid_Buf[grid] &= ~bit; // 清零(熄灭)
}
}
}
// 更新显示(将缓存数据写入TM1629D) -- u8LH = 0x00低位,0x01高位
void TM1629D_UpdateDisplay(uint8_t u8LH)
{
uint8_t grid;
/* 每次刷灯都重开显示,后插入的板子不用等下一次拔插检测 */
TM1629D_DisplayOn();
TM1629D_STB_L();
TM1629D_Delay1us();
for (grid = 0; grid < 8; grid++)
{
if(u8LH)
{//高位
TM1629D_SendByte(grid_addr[grid][1]); // 写地址
}
else
{//低位
TM1629D_SendByte(grid_addr[grid][0]); // 写地址
}
TM1629D_SendByte(grid_Buf[grid]);
}
TM1629D_STB_H();
TM1629D_Delay1us();
}
/* 连续全 0xFF 视为板子不在;重新读到键值后把当前灯态刷回去,闪烁逻辑不用重来。 */
static uint8_t s_board_present;
static uint8_t s_absent_cnt;
static uint8_t s_present_cnt;
static void TM1629D_OnKeySample(const uint8_t *keyBuf)
{
int absent = (keyBuf[0] == 0xFF && keyBuf[1] == 0xFF &&
keyBuf[2] == 0xFF && keyBuf[3] == 0xFF);
if (absent)
{
s_present_cnt = 0;
if (s_absent_cnt < 8)
s_absent_cnt++;
if (s_absent_cnt >= 3)
s_board_present = 0;
return;
}
s_absent_cnt = 0;
if (s_present_cnt < 8)
s_present_cnt++;
if (!s_board_present && s_present_cnt >= 2)
{
s_board_present = 1;
TM1629D_UpdateDisplay(0);
}
}
// 向指定地址写入1字节数据(单独调用调试用)
void TM1629D_WriteDisplayByte(uint8_t addr, uint8_t data)
{
TM1629D_STB_L();
TM1629D_Delay1us();
TM1629D_SendByte(addr); // 发送寄存器地址
TM1629D_SendByte(data); // 发送数据
TM1629D_STB_H();
TM1629D_Delay1us();
}
/**
* @brief 控制指定LED的指定颜色(点亮/熄灭)
* @param led:LED编号(LED_L1~LED_L8)
* @param color:颜色(COLOR_R/COLOR_G/COLOR_B/COLOR_OTHER)
* @param on:1=点亮,0=熄灭(仅对R/G/B有效,OTHER忽略此参数)
*/
//void TM1629D_ControlLed(LedNum_TypeDef led, LedColor_TypeDef color, uint8_t on)
//{
// // 根据LED编号和颜色,映射到对应的GRID和SEG
// switch(led)
// {
// case LED_L1: // L1:SEG1 + GRID1(R)/GRID2(G)/GRID3(B)
// switch(color) {
// case LED_COLOR_R: TM1629D_SetGridSeg(0, 0, 1);break; // GRID1+SEG1
// case LED_COLOR_G: TM1629D_SetGridSeg(1, 0, 1);break; // GRID2+SEG1
// case LED_COLOR_B: TM1629D_SetGridSeg(2, 0, 1);break; // GRID3+SEG1
// case COLOR_OTHER: // 关闭L1所有颜色,方便加入其它颜色的预留接口
// {
// TM1629D_SetGridSeg(0, 0, 0);
// TM1629D_SetGridSeg(1, 0, 0);
// TM1629D_SetGridSeg(2, 0, 0);
// }break;
//
// }
// break;
//
// case LED_L2: // L2:SEG1 + GRID4(R)/GRID5(G)/GRID6(B)
// switch(color) {
// case LED_COLOR_R: TM1629D_SetGridSeg(3, 0, 1);break; // GRID4+SEG1
// case LED_COLOR_G: TM1629D_SetGridSeg(4, 0, 1);break; // GRID5+SEG1
// case LED_COLOR_B: TM1629D_SetGridSeg(5, 0, 1);break; // GRID6+SEG1
// case COLOR_OTHER: // 关闭L2所有颜色
// {
// TM1629D_SetGridSeg(3, 0, 0);
// TM1629D_SetGridSeg(4, 0, 0);
// TM1629D_SetGridSeg(5, 0, 0);
// }break;
// }
// break;
//
// case LED_L3: // L3:SEG2 + GRID1(R)/GRID2(G)/GRID3(B)
// switch(color) {
// case LED_COLOR_R: TM1629D_SetGridSeg(0, 1, 1);break; // GRID1+SEG2
// case LED_COLOR_G: TM1629D_SetGridSeg(1, 1, 1);break; // GRID2+SEG2
// case LED_COLOR_B: TM1629D_SetGridSeg(2, 1, 1);break; // GRID3+SEG2
// case COLOR_OTHER: // 关闭L3所有颜色
// {
// TM1629D_SetGridSeg(0, 1, 0);
// TM1629D_SetGridSeg(1, 1, 0);
// TM1629D_SetGridSeg(2, 1, 0);
// }break;
// }
// break;
//
// case LED_L4: // L4:SEG2 + GRID4(R)/GRID5(G)/GRID6(B)
// switch(color) {
// case LED_COLOR_R: TM1629D_SetGridSeg(3, 1, 1);break; // GRID4+SEG2
// case LED_COLOR_G: TM1629D_SetGridSeg(4, 1, 1);break; // GRID5+SEG2
// case LED_COLOR_B: TM1629D_SetGridSeg(5, 1, 1);break; // GRID6+SEG2
// case COLOR_OTHER: // 关闭L4所有颜色
// {
// TM1629D_SetGridSeg(3, 1, 0);
// TM1629D_SetGridSeg(4, 1, 0);
// TM1629D_SetGridSeg(5, 1, 0);
// }break;
// }
// break;
//
// case LED_L5: // L5:SEG3 + GRID1(R)/GRID2(G)/GRID3(B)
// switch(color) {
// case LED_COLOR_R: TM1629D_SetGridSeg(0, 2, 1);break; // GRID1+SEG3
// case LED_COLOR_G: TM1629D_SetGridSeg(1, 2, 1);break; // GRID2+SEG3
// case LED_COLOR_B: TM1629D_SetGridSeg(2, 2, 1);break; // GRID3+SEG3
// case COLOR_OTHER: // 关闭L5所有颜色
// {
// TM1629D_SetGridSeg(0, 2, 0);
// TM1629D_SetGridSeg(1, 2, 0);
// TM1629D_SetGridSeg(2, 2, 0);
// }break;
// }
// break;
//
// case LED_L6: // L6:SEG3 + GRID4(R)/GRID5(G)/GRID6(B)
// switch(color) {
// case LED_COLOR_R: TM1629D_SetGridSeg(3, 2, 1);break; // GRID4+SEG3
// case LED_COLOR_G: TM1629D_SetGridSeg(4, 2, 1);break; // GRID5+SEG3
// case LED_COLOR_B: TM1629D_SetGridSeg(5, 2, 1);break; // GRID6+SEG3
// case COLOR_OTHER: // 关闭L6所有颜色
// {
// TM1629D_SetGridSeg(3, 2, 0);
// TM1629D_SetGridSeg(4, 2, 0);
// TM1629D_SetGridSeg(5, 2, 0);
// }break;
// }
// break;
//
// case LED_L7: // L7:SEG4 + GRID1(R)/GRID2(G)/GRID3(B)
// switch(color) {
// case LED_COLOR_R: TM1629D_SetGridSeg(0, 3, 1);break; // GRID1+SEG4
// case LED_COLOR_G: TM1629D_SetGridSeg(1, 3, 1);break; // GRID2+SEG4
// case LED_COLOR_B: TM1629D_SetGridSeg(2, 3, 1);break; // GRID3+SEG4
// case COLOR_OTHER: // 关闭L7所有颜色
// {
// TM1629D_SetGridSeg(0, 3, 0);
// TM1629D_SetGridSeg(1, 3, 0);
// TM1629D_SetGridSeg(2, 3, 0);
// }break;
// }
// break;
//
// case LED_L8: // L8:SEG4 + GRID4(R)/GRID5(G)/GRID6(B)
// switch(color) {
// case LED_COLOR_R: TM1629D_SetGridSeg(3, 3, 1);break; // GRID4+SEG4
// case LED_COLOR_G: TM1629D_SetGridSeg(4, 3, 1);break; // GRID5+SEG4
// case LED_COLOR_B: TM1629D_SetGridSeg(5, 3, 1);break; // GRID6+SEG4
// case COLOR_OTHER: // 关闭L8所有颜色
// {
// TM1629D_SetGridSeg(3, 3, 0);
// TM1629D_SetGridSeg(4, 3, 0);
// TM1629D_SetGridSeg(5, 3, 0);
// }break;
// }
// break;
//
// default: break;
// }
//}
void TM1629D_ControlLed(LedNum_TypeDef led, LedColor_TypeDef color, uint8_t on)
{
// 根据LED编号和颜色,映射到对应的GRID和SEG
switch(led)
{
case LED_L1: // L1:SEG1
switch(color) {
case LED_COLOR_R:
TM1629D_SetGridSeg(0, 0, on);
break;
case LED_COLOR_G:
TM1629D_SetGridSeg(1, 0, on);
break;
case LED_COLOR_B:
TM1629D_SetGridSeg(2, 0, on);
break;
case LED_COLOR_YELL: // 红+绿同时
TM1629D_SetGridSeg(0, 0, on);
TM1629D_SetGridSeg(1, 0, on);
break;
case LED_COLOR_PURP: // 红+紫
TM1629D_SetGridSeg(0, 0, on);
TM1629D_SetGridSeg(2, 0, on);
break;
case LED_COLOR_CYA: // 绿+蓝
TM1629D_SetGridSeg(1, 0, on);
TM1629D_SetGridSeg(2, 0, on);
break;
case LED_COLOR_WHITE: // 三色全开
TM1629D_SetGridSeg(0, 0, on);
TM1629D_SetGridSeg(1, 0, on);
TM1629D_SetGridSeg(2, 0, on);
break;
case COLOR_OTHER: // 关闭L1所有颜色
{
TM1629D_SetGridSeg(0, 0, 0);
TM1629D_SetGridSeg(1, 0, 0);
TM1629D_SetGridSeg(2, 0, 0);
}break;
}
break;
case LED_L2: // L2:SEG1
switch(color) {
case LED_COLOR_R:
TM1629D_SetGridSeg(3, 0, on);
break;
case LED_COLOR_G:
TM1629D_SetGridSeg(4, 0, on);
break;
case LED_COLOR_B:
TM1629D_SetGridSeg(5, 0, on);
break;
case LED_COLOR_YELL:
TM1629D_SetGridSeg(3, 0, on);
TM1629D_SetGridSeg(4, 0, on);
break;
case LED_COLOR_PURP:
TM1629D_SetGridSeg(3, 0, on);
TM1629D_SetGridSeg(5, 0, on);
break;
case LED_COLOR_CYA:
TM1629D_SetGridSeg(4, 0, on);
TM1629D_SetGridSeg(5, 0, on);
break;
case LED_COLOR_WHITE:
TM1629D_SetGridSeg(3, 0, on);
TM1629D_SetGridSeg(4, 0, on);
TM1629D_SetGridSeg(5, 0, on);
break;
case COLOR_OTHER:
{
TM1629D_SetGridSeg(3, 0, 0);
TM1629D_SetGridSeg(4, 0, 0);
TM1629D_SetGridSeg(5, 0, 0);
}break;
}
break;
case LED_L3: // L3:SEG2
switch(color) {
case LED_COLOR_R:
TM1629D_SetGridSeg(0, 1, on);
break;
case LED_COLOR_G:
TM1629D_SetGridSeg(1, 1, on);
break;
case LED_COLOR_B:
TM1629D_SetGridSeg(2, 1, on);
break;
case LED_COLOR_YELL:
TM1629D_SetGridSeg(0, 1, on);
TM1629D_SetGridSeg(1, 1, on);
break;
case LED_COLOR_PURP:
TM1629D_SetGridSeg(0, 1, on);
TM1629D_SetGridSeg(2, 1, on);
break;
case LED_COLOR_CYA:
TM1629D_SetGridSeg(1, 1, on);
TM1629D_SetGridSeg(2, 1, on);
break;
case LED_COLOR_WHITE:
TM1629D_SetGridSeg(0, 1, on);
TM1629D_SetGridSeg(1, 1, on);
TM1629D_SetGridSeg(2, 1, on);
break;
case COLOR_OTHER:
{
TM1629D_SetGridSeg(0, 1, 0);
TM1629D_SetGridSeg(1, 1, 0);
TM1629D_SetGridSeg(2, 1, 0);
}break;
}
break;
case LED_L4: // L4:SEG2
switch(color) {
case LED_COLOR_R:
TM1629D_SetGridSeg(3, 1, on);
break;
case LED_COLOR_G:
TM1629D_SetGridSeg(4, 1, on);
break;
case LED_COLOR_B:
TM1629D_SetGridSeg(5, 1, on);
break;
case LED_COLOR_YELL:
TM1629D_SetGridSeg(3, 1, on);
TM1629D_SetGridSeg(4, 1, on);
break;
case LED_COLOR_PURP:
TM1629D_SetGridSeg(3, 1, on);
TM1629D_SetGridSeg(5, 1, on);
break;
case LED_COLOR_CYA:
TM1629D_SetGridSeg(4, 1, on);
TM1629D_SetGridSeg(5, 1, on);
break;
case LED_COLOR_WHITE:
TM1629D_SetGridSeg(3, 1, on);
TM1629D_SetGridSeg(4, 1, on);
TM1629D_SetGridSeg(5, 1, on);
break;
case COLOR_OTHER:
{
TM1629D_SetGridSeg(3, 1, 0);
TM1629D_SetGridSeg(4, 1, 0);
TM1629D_SetGridSeg(5, 1, 0);
}break;
}
break;
case LED_L5: // L5:SEG3
switch(color) {
case LED_COLOR_R:
TM1629D_SetGridSeg(0, 2, on);
break;
case LED_COLOR_G:
TM1629D_SetGridSeg(1, 2, on);
break;
case LED_COLOR_B:
TM1629D_SetGridSeg(2, 2, on);
break;
case LED_COLOR_YELL:
TM1629D_SetGridSeg(0, 2, on);
TM1629D_SetGridSeg(1, 2, on);
break;
case LED_COLOR_PURP:
TM1629D_SetGridSeg(0, 2, on);
TM1629D_SetGridSeg(2, 2, on);
break;
case LED_COLOR_CYA:
TM1629D_SetGridSeg(1, 2, on);
TM1629D_SetGridSeg(2, 2, on);
break;
case LED_COLOR_WHITE:
TM1629D_SetGridSeg(0, 2, on);
TM1629D_SetGridSeg(1, 2, on);
TM1629D_SetGridSeg(2, 2, on);
break;
case COLOR_OTHER:
{
TM1629D_SetGridSeg(0, 2, 0);
TM1629D_SetGridSeg(1, 2, 0);
TM1629D_SetGridSeg(2, 2, 0);
}break;
}
break;
case LED_L6: // L6:SEG3
switch(color) {
case LED_COLOR_R:
TM1629D_SetGridSeg(3, 2, on);
break;
case LED_COLOR_G:
TM1629D_SetGridSeg(4, 2, on);
break;
case LED_COLOR_B:
TM1629D_SetGridSeg(5, 2, on);
break;
case LED_COLOR_YELL:
TM1629D_SetGridSeg(3, 2, on);
TM1629D_SetGridSeg(4, 2, on);
break;
case LED_COLOR_PURP:
TM1629D_SetGridSeg(3, 2, on);
TM1629D_SetGridSeg(5, 2, on);
break;
case LED_COLOR_CYA:
TM1629D_SetGridSeg(4, 2, on);
TM1629D_SetGridSeg(5, 2, on);
break;
case LED_COLOR_WHITE:
TM1629D_SetGridSeg(3, 2, on);
TM1629D_SetGridSeg(4, 2, on);
TM1629D_SetGridSeg(5, 2, on);
break;
case COLOR_OTHER:
{
TM1629D_SetGridSeg(3, 2, 0);
TM1629D_SetGridSeg(4, 2, 0);
TM1629D_SetGridSeg(5, 2, 0);
}break;
}
break;
case LED_L7: // L7:SEG4
switch(color) {
case LED_COLOR_R:
TM1629D_SetGridSeg(0, 3, on);
break;
case LED_COLOR_G:
TM1629D_SetGridSeg(1, 3, on);
break;
case LED_COLOR_B:
TM1629D_SetGridSeg(2, 3, on);
break;
case LED_COLOR_YELL:
TM1629D_SetGridSeg(0, 3, on);
TM1629D_SetGridSeg(1, 3, on);
break;
case LED_COLOR_PURP:
TM1629D_SetGridSeg(0, 3, on);
TM1629D_SetGridSeg(2, 3, on);
break;
case LED_COLOR_CYA:
TM1629D_SetGridSeg(1, 3, on);
TM1629D_SetGridSeg(2, 3, on);
break;
case LED_COLOR_WHITE:
TM1629D_SetGridSeg(0, 3, on);
TM1629D_SetGridSeg(1, 3, on);
TM1629D_SetGridSeg(2, 3, on);
break;
case COLOR_OTHER:
{
TM1629D_SetGridSeg(0, 3, 0);
TM1629D_SetGridSeg(1, 3, 0);
TM1629D_SetGridSeg(2, 3, 0);
}break;
}
break;
case LED_L8: // L8:SEG4
switch(color) {
case LED_COLOR_R:
TM1629D_SetGridSeg(3, 3, on);
break;
case LED_COLOR_G:
TM1629D_SetGridSeg(4, 3, on);
break;
case LED_COLOR_B:
TM1629D_SetGridSeg(5, 3, on);
break;
case LED_COLOR_YELL:
TM1629D_SetGridSeg(3, 3, on);
TM1629D_SetGridSeg(4, 3, on);
break;
case LED_COLOR_PURP:
TM1629D_SetGridSeg(3, 3, on);
TM1629D_SetGridSeg(5, 3, on);
break;
case LED_COLOR_CYA:
TM1629D_SetGridSeg(4, 3, on);
TM1629D_SetGridSeg(5, 3, on);
break;
case LED_COLOR_WHITE:
TM1629D_SetGridSeg(3, 3, on);
TM1629D_SetGridSeg(4, 3, on);
TM1629D_SetGridSeg(5, 3, on);
break;
case COLOR_OTHER:
{
TM1629D_SetGridSeg(3, 3, 0);
TM1629D_SetGridSeg(4, 3, 0);
TM1629D_SetGridSeg(5, 3, 0);
}break;
}
break;
default: break;
}
}
/**
* @brief 控制L1~L8全亮(指定颜色R/G/B)
* @param color:指定颜色(仅支持COLOR_R/COLOR_G/COLOR_B,其他颜色无效)
*/
void TM1629D_AllLedOn(LedColor_TypeDef color)
{
// 仅处理R/G/B三种颜色,OTHER不执行
if (color >= COLOR_OTHER) return;
// 循环控制L1~L8,点亮指定颜色
TM1629D_ControlLed(LED_L1, color, 1);
TM1629D_ControlLed(LED_L2, color, 1);
TM1629D_ControlLed(LED_L3, color, 1);
TM1629D_ControlLed(LED_L4, color, 1);
TM1629D_ControlLed(LED_L5, color, 1);
TM1629D_ControlLed(LED_L6, color, 1);
TM1629D_ControlLed(LED_L7, color, 1);
TM1629D_ControlLed(LED_L8, color, 1);
return ;
}
/**
* @brief 控制L1~L8全灭(关闭所有颜色)
*/
void TM1629D_AllLedOff(void)
{
// 循环控制L1~L8,关闭所有颜色(使用COLOR_OTHER)
TM1629D_ControlLed(LED_L1, COLOR_OTHER, 0);
TM1629D_ControlLed(LED_L2, COLOR_OTHER, 0);
TM1629D_ControlLed(LED_L3, COLOR_OTHER, 0);
TM1629D_ControlLed(LED_L4, COLOR_OTHER, 0);
TM1629D_ControlLed(LED_L5, COLOR_OTHER, 0);
TM1629D_ControlLed(LED_L6, COLOR_OTHER, 0);
TM1629D_ControlLed(LED_L7, COLOR_OTHER, 0);
TM1629D_ControlLed(LED_L8, COLOR_OTHER, 0);
return ;
}