K1Guitar/device/TM1629D/Drv_TM1629D_Key_Led.c

803 lines
26 KiB
C
Raw 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)
/* 忙等延时:约 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 引脚切换为输入模式(读按键) */
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[] = {
// 解析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); // 读取原始按键数据(与原逻辑一致)
// 遍历映射表匹配按键(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_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 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 ;
}