803 lines
26 KiB
C
803 lines
26 KiB
C
/*
|
||
* @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 ;
|
||
}
|