K1Guitar/device/TM1629D/Drv_TM1629D_Key_Led.c

803 lines
26 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @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)
/* 忙等延时:约 1usNOP 循环,不依赖 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 引脚切换为输入模式(读按键) */
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_NONE;
g.gpio_pins = TM1629D_DIO_PIN;
gpio_init(TM1629D_DIO_PORT, &g);
}
/* 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为“普通显示模式”无译码8个GRID
TM1629D_STB_L();
TM1629D_Delay1us();
TM1629D_SendByte(0x40); // 普通模式命令文档1-46
TM1629D_STB_H();
TM1629D_Delay1us();
// 配置亮度(示例:中亮度)
TM1629D_STB_L();
TM1629D_Delay1us();
TM1629D_SendByte(0x8F); // 0x88最暗~0x8F最亮
TM1629D_STB_H();
TM1629D_Delay1us();
TM1629D_AllLedOn(COLOR_OTHER);
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[] = {
// 解析BYTE1keyBuf[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},
// 解析BYTE2keyBuf[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},
// 解析BYTE3keyBuf[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},
// 解析BYTE4keyBuf[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); // 读取原始按键数据(与原逻辑一致)
// 遍历映射表匹配按键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 gridGRID编号0~8
* @param segSEG编号0~8
* @param on1=点亮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_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();
}
// 向指定地址写入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 ledLED编号LED_L1~LED_L8
* @param color颜色COLOR_R/COLOR_G/COLOR_B/COLOR_OTHER
* @param on1=点亮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: // L1SEG1 + 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: // L2SEG1 + 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: // L3SEG2 + 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: // L4SEG2 + 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: // L5SEG3 + 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: // L6SEG3 + 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: // L7SEG4 + 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: // L8SEG4 + 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: // L1SEG1
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: // L2SEG1
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: // L3SEG2
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: // L4SEG2
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: // L5SEG3
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: // L6SEG3
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: // L7SEG4
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: // L8SEG4
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 ;
}