/* * @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 /* ================= 底层原语(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 ; }