#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h> // 补充memset所需头文件
#include "bsp.h"
#include "global_instance.h"

// -------------------------- 全局配置宏定义（无魔法数字） --------------------------
// LCD硬件参数（1/6 duty + 1/3 bias + 12 SEG 固定配置）
#define LCD_COM_NUM             6U          // COM通道数（0~5）
#define LCD_SEG_NUM             12U         // SEG通道数（0~11）
#define LCD_1_3BIAS_VOLT_LEVELS 4U          // 1/3 bias对应的电压等级数
#define LCD_FULL_VOLTAGE        3.3f        // LCD满电压值(V)
#define LCD_REFRESH_FREQ        200U        // LCD刷新频率(Hz)
#define LCD_COM_MAX             LCD_COM_NUM // 兼容原有宏定义
#define LCD_SEG_MAX             LCD_SEG_NUM // 兼容原有宏定义

#define LCD_REG_DIV_VOLTAGE

// GPIO直驱版本
#if defined(LCD_NO_VOLTAGE_DIRVIDER)
// 兼容1/2bias
#define LCD_COM_INIT_DIR              GPIO_OUTPUT
#define LCD_COM_VOLT_0V_GPIO_DIR      GPIO_OUTPUT
#define LCD_COM_VOLT_1_3V_GPIO_DIR    GPIO_OUTPUT
#define LCD_COM_VOLT_2_3V_GPIO_DIR    GPIO_OUTPUT
#define LCD_COM_VOLT_FULLV_GPIO_DIR   GPIO_OUTPUT
#define LCD_COM_INIT_MODE             (PORT_FUNC_GPIO)
#define LCD_COM_VOLT_0V_GPIO_MODE     (PORT_FUNC_GPIO)
#define LCD_COM_VOLT_1_3V_GPIO_MODE   (PORT_FUNC_GPIO | PORT_OPEN_DRAIN)
#define LCD_COM_VOLT_2_3V_GPIO_MODE   (PORT_FUNC_GPIO | PORT_OPEN_DRAIN)
#define LCD_COM_VOLT_FULLV_GPIO_MODE  (PORT_FUNC_GPIO)
#define LCD_COM_INIT_VALUE            0
#define LCD_COM_VOLT_0V_GPIO_VALUE    0
#define LCD_COM_VOLT_1_3V_GPIO_VALUE  1
#define LCD_COM_VOLT_2_3V_GPIO_VALUE  1
#define LCD_COM_VOLT_FULLV_GPIO_VALUE 1

#define LCD_SEG_INIT_DIR              GPIO_OUTPUT
#define LCD_SEG_VOLT_0V_GPIO_DIR      GPIO_OUTPUT
#define LCD_SEG_VOLT_1_3V_GPIO_DIR    GPIO_OUTPUT
#define LCD_SEG_VOLT_2_3V_GPIO_DIR    GPIO_OUTPUT
#define LCD_SEG_VOLT_FULLV_GPIO_DIR   GPIO_OUTPUT
#define LCD_SEG_INIT_MODE             (PORT_FUNC_GPIO)
#define LCD_SEG_VOLT_0V_GPIO_MODE     (PORT_FUNC_GPIO)
#define LCD_SEG_VOLT_1_3V_GPIO_MODE   (PORT_FUNC_GPIO | PORT_OPEN_DRAIN)
#define LCD_SEG_VOLT_2_3V_GPIO_MODE   (PORT_FUNC_GPIO | PORT_OPEN_DRAIN)
#define LCD_SEG_VOLT_FULLV_GPIO_MODE  (PORT_FUNC_GPIO)
#define LCD_SEG_INIT_VALUE            0
#define LCD_SEG_VOLT_0V_GPIO_VALUE    0
#define LCD_SEG_VOLT_1_3V_GPIO_VALUE  1
#define LCD_SEG_VOLT_2_3V_GPIO_VALUE  1
#define LCD_SEG_VOLT_FULLV_GPIO_VALUE 1

#elif defined(LCD_REG_DIV_VOLTAGE)
// 1/3 Bias - 推挽+高阻分压方案（4级电压：0V, 1/3V, 2/3V, V）
// ---------- COM 配置 ----------
#define LCD_COM_INIT_DIR              GPIO_OUTPUT
#define LCD_COM_VOLT_0V_GPIO_DIR      GPIO_OUTPUT
#define LCD_COM_VOLT_1_3V_GPIO_DIR    GPIO_OUTPUT
#define LCD_COM_VOLT_2_3V_GPIO_DIR    GPIO_OUTPUT
#define LCD_COM_VOLT_FULLV_GPIO_DIR   GPIO_OUTPUT

#define LCD_COM_INIT_MODE             (PORT_FUNC_GPIO)
#define LCD_COM_VOLT_0V_GPIO_MODE     (PORT_FUNC_GPIO)
#define LCD_COM_VOLT_1_3V_GPIO_MODE   (PORT_FUNC_GPIO)
#define LCD_COM_VOLT_2_3V_GPIO_MODE   (PORT_FUNC_GPIO)
#define LCD_COM_VOLT_FULLV_GPIO_MODE  (PORT_FUNC_GPIO)

#define LCD_COM_INIT_VALUE            0
#define LCD_COM_VOLT_0V_GPIO_VALUE    0
#define LCD_COM_VOLT_1_3V_GPIO_VALUE  1
#define LCD_COM_VOLT_2_3V_GPIO_VALUE  1
#define LCD_COM_VOLT_FULLV_GPIO_VALUE 1

// ---------- SEG 配置 ----------
#define LCD_SEG_INIT_DIR              GPIO_OUTPUT
#define LCD_SEG_VOLT_0V_GPIO_DIR      GPIO_OUTPUT
#define LCD_SEG_VOLT_1_3V_GPIO_DIR    GPIO_INPUT // 高阻输入
#define LCD_SEG_VOLT_2_3V_GPIO_DIR    GPIO_INPUT // 高阻输入
#define LCD_SEG_VOLT_FULLV_GPIO_DIR   GPIO_OUTPUT

#define LCD_SEG_INIT_MODE             (PORT_FUNC_GPIO)
#define LCD_SEG_VOLT_0V_GPIO_MODE     (PORT_FUNC_GPIO)
#define LCD_SEG_VOLT_1_3V_GPIO_MODE   (PORT_FUNC_GPIO | PORT_PULLDOWN)
#define LCD_SEG_VOLT_2_3V_GPIO_MODE   (PORT_FUNC_GPIO | PORT_PULLUP)
#define LCD_SEG_VOLT_FULLV_GPIO_MODE  (PORT_FUNC_GPIO)

#define LCD_SEG_INIT_VALUE            0
#define LCD_SEG_VOLT_0V_GPIO_VALUE    0
#define LCD_SEG_VOLT_1_3V_GPIO_VALUE  1
#define LCD_SEG_VOLT_2_3V_GPIO_VALUE  1
#define LCD_SEG_VOLT_FULLV_GPIO_VALUE 1

#elif defined(LCD_DUAL_OPEN_DRAIN)
// 1/3 Bias - 双开漏电阻分压方案（4级电压：0V, 1/3V, 2/3V, V） 需要分压网络
// ---------- COM 配置 ----------
#define LCD_COM_INIT_DIR              GPIO_OUTPUT
#define LCD_COM_VOLT_0V_GPIO_DIR      GPIO_OUTPUT
#define LCD_COM_VOLT_1_3V_GPIO_DIR    GPIO_OUTPUT
#define LCD_COM_VOLT_2_3V_GPIO_DIR    GPIO_OUTPUT
#define LCD_COM_VOLT_FULLV_GPIO_DIR   GPIO_OUTPUT

#define LCD_COM_INIT_MODE             (PORT_FUNC_GPIO)
#define LCD_COM_VOLT_0V_GPIO_MODE     (PORT_FUNC_GPIO)
#define LCD_COM_VOLT_1_3V_GPIO_MODE   (PORT_FUNC_GPIO | PORT_OPEN_DRAIN)
#define LCD_COM_VOLT_2_3V_GPIO_MODE   (PORT_FUNC_GPIO | PORT_OPEN_DRAIN)
#define LCD_COM_VOLT_FULLV_GPIO_MODE  (PORT_FUNC_GPIO)

#define LCD_COM_INIT_VALUE            0
#define LCD_COM_VOLT_0V_GPIO_VALUE    0
#define LCD_COM_VOLT_1_3V_GPIO_VALUE  0 // 开漏低：1/3V
#define LCD_COM_VOLT_2_3V_GPIO_VALUE  1 // 开漏高：2/3V
#define LCD_COM_VOLT_FULLV_GPIO_VALUE 1

// ---------- SEG 配置 ----------
#define LCD_SEG_INIT_DIR              GPIO_OUTPUT
#define LCD_SEG_VOLT_0V_GPIO_DIR      GPIO_OUTPUT
#define LCD_SEG_VOLT_1_3V_GPIO_DIR    GPIO_OUTPUT
#define LCD_SEG_VOLT_2_3V_GPIO_DIR    GPIO_OUTPUT
#define LCD_SEG_VOLT_FULLV_GPIO_DIR   GPIO_OUTPUT

#define LCD_SEG_INIT_MODE             (PORT_FUNC_GPIO)
#define LCD_SEG_VOLT_0V_GPIO_MODE     (PORT_FUNC_GPIO)
#define LCD_SEG_VOLT_1_3V_GPIO_MODE   (PORT_FUNC_GPIO | PORT_OPEN_DRAIN)
#define LCD_SEG_VOLT_2_3V_GPIO_MODE   (PORT_FUNC_GPIO | PORT_OPEN_DRAIN)
#define LCD_SEG_VOLT_FULLV_GPIO_MODE  (PORT_FUNC_GPIO)

#define LCD_SEG_INIT_VALUE            0
#define LCD_SEG_VOLT_0V_GPIO_VALUE    0
#define LCD_SEG_VOLT_1_3V_GPIO_VALUE  1 // 开漏高：1/3V
#define LCD_SEG_VOLT_2_3V_GPIO_VALUE  0 // 开漏低：2/3V
#define LCD_SEG_VOLT_FULLV_GPIO_VALUE 1
#else
#error 请选择LCD驱动方案
#endif

// -------------------------- 枚举类型定义 --------------------------
/**
 * @brief LCD电压等级（1/3 bias专用）
 */
typedef enum {
  LCD_VOLT_0V = 0,   // 0V (VSS)
  LCD_VOLT_1_3V = 1, // 1/3 VLCD (1.1V@3.3V)
  LCD_VOLT_2_3V = 2, // 2/3 VLCD (2.2V@3.3V)
  LCD_VOLT_FULLV = 3 // 满电压 VLCD (3.3V)
} lcd_volt_level_e;

/**
 * @brief LCD通道类型（COM/SEG）
 */
typedef enum {
  LCD_CH_COM = 0,
  LCD_CH_SEG = 1
} lcd_channel_type_e;

/**
 * @brief LCD像素状态
 */
typedef enum {
  LCD_PIXEL_OFF = 0, // 像素熄灭
  LCD_PIXEL_ON = 1   // 像素点亮
} lcd_pixel_state_e;

// LCD 符号段枚举定义 (P1~P7, S1~S9)
typedef enum {
  // P 系列符号
  LCD_SYMBLE_SLOT_P1,
  LCD_SYMBLE_SLOT_P2,
  LCD_SYMBLE_SLOT_P3,
  LCD_SYMBLE_SLOT_P4,
  LCD_SYMBLE_SLOT_P5,
  LCD_SYMBLE_SLOT_P6,
  LCD_SYMBLE_SLOT_P7,

  // S 系列符号
  LCD_SYMBLE_SLOT_S1,
  LCD_SYMBLE_SLOT_S2,
  LCD_SYMBLE_SLOT_S3,
  LCD_SYMBLE_SLOT_S4,
  LCD_SYMBLE_SLOT_S5,
  LCD_SYMBLE_SLOT_S6,
  LCD_SYMBLE_SLOT_S7,
  LCD_SYMBLE_SLOT_S8,
  LCD_SYMBLE_SLOT_S9,
} lcd_symble_slot_e;

// -------------------------- 函数指针与结构体定义 --------------------------
/**
 * @brief 电平设置函数指针类型
 */
typedef void (*lcd_set_level_func_t)(void);

/**
 * @brief LCD电平设置表（硬件回调函数表）
 */
typedef struct {
  lcd_set_level_func_t com[LCD_COM_NUM][LCD_1_3BIAS_VOLT_LEVELS];
  lcd_set_level_func_t seg[LCD_SEG_NUM][LCD_1_3BIAS_VOLT_LEVELS];
} lcd_level_table_t;

/**
 * @brief LCD设备对象（1/6duty+1/3bias+12seg专用）
 */
typedef struct lcd_device {
  // 状态属性
  bool is_init;                               // 初始化状态标记
  uint8_t current_com;                        // 当前扫描的COM索引
  uint8_t disp_buf[LCD_COM_NUM][LCD_SEG_NUM]; // 显示缓存
  uint8_t frame_invert;

  // 硬件回调表
  lcd_level_table_t *level_table; // 电平设置函数表

  // 成员方法
  void (*init)(struct lcd_device *dev);                                                                         // 初始化
  void (*set_pixel)(struct lcd_device *dev, uint8_t com, uint8_t seg, lcd_pixel_state_e state);                 // 设置像素
  void (*set_level)(struct lcd_device *dev, lcd_channel_type_e ch_type, uint8_t index, lcd_volt_level_e level); // 设置电平
  void (*refresh)(struct lcd_device *dev);                                                                      // 刷新（定时器回调）
  void (*clear)(struct lcd_device *dev);                                                                        // 清屏
} lcd_device_t;

void xl1981_lcd_gpio_init(struct lcd_device *dev);
void COM1_Set0V(void);
void COM1_Set1_3V(void);
void COM1_Set2_3V(void);
void COM1_SetFullV(void);
void COM2_Set0V(void);
void COM2_Set1_3V(void);
void COM2_Set2_3V(void);
void COM2_SetFullV(void);
void COM3_Set0V(void);
void COM3_Set1_3V(void);
void COM3_Set2_3V(void);
void COM3_SetFullV(void);
void COM4_Set0V(void);
void COM4_Set1_3V(void);
void COM4_Set2_3V(void);
void COM4_SetFullV(void);
void COM5_Set0V(void);
void COM5_Set1_3V(void);
void COM5_Set2_3V(void);
void COM5_SetFullV(void);
void COM6_Set0V(void);
void COM6_Set1_3V(void);
void COM6_Set2_3V(void);
void COM6_SetFullV(void);
void SEG1_Set0V(void);
void SEG1_Set1_3V(void);
void SEG1_Set2_3V(void);
void SEG1_SetFullV(void);
void SEG2_Set0V(void);
void SEG2_Set1_3V(void);
void SEG2_Set2_3V(void);
void SEG2_SetFullV(void);
void SEG3_Set0V(void);
void SEG3_Set1_3V(void);
void SEG3_Set2_3V(void);
void SEG3_SetFullV(void);
void SEG4_Set0V(void);
void SEG4_Set1_3V(void);
void SEG4_Set2_3V(void);
void SEG4_SetFullV(void);
void SEG5_Set0V(void);
void SEG5_Set1_3V(void);
void SEG5_Set2_3V(void);
void SEG5_SetFullV(void);
void SEG6_Set0V(void);
void SEG6_Set1_3V(void);
void SEG6_Set2_3V(void);
void SEG6_SetFullV(void);
void SEG7_Set0V(void);
void SEG7_Set1_3V(void);
void SEG7_Set2_3V(void);
void SEG7_SetFullV(void);
void SEG8_Set0V(void);
void SEG8_Set1_3V(void);
void SEG8_Set2_3V(void);
void SEG8_SetFullV(void);
void SEG9_Set0V(void);
void SEG9_Set1_3V(void);
void SEG9_Set2_3V(void);
void SEG9_SetFullV(void);
void SEG10_Set0V(void);
void SEG10_Set1_3V(void);
void SEG10_Set2_3V(void);
void SEG10_SetFullV(void);
void SEG11_Set0V(void);
void SEG11_Set1_3V(void);
void SEG11_Set2_3V(void);
void SEG11_SetFullV(void);
void SEG12_Set0V(void);
void SEG12_Set1_3V(void);
void SEG12_Set2_3V(void);
void SEG12_SetFullV(void);
static void lcd_clear(lcd_device_t *dev);
static void lcd_set_pixel(lcd_device_t *dev, uint8_t com, uint8_t seg, lcd_pixel_state_e state);
static void lcd_set_level(lcd_device_t *dev, lcd_channel_type_e ch_type, uint8_t index, lcd_volt_level_e level);
static void lcd_refresh(lcd_device_t *dev);
void lcd_clear_slot(lcd_device_t *dev, uint8_t slot);
void lcd_clear_buf(lcd_device_t *dev);
void lcd_set_segment(lcd_device_t *dev, uint8_t com, uint8_t seg, uint8_t state);
void lcd_display_number(lcd_device_t *dev, uint8_t slot, uint8_t num);
static void lcd_init(lcd_device_t *dev);
static void lcd_fresh(void);
void lcd_hw_init();

// -------------------------- 段码坐标宏定义 --------------------------
// 坐标解析宏（16位坐标：高8位=COM，低8位=SEG）
#define GET_COM(coord)      ((uint8_t)((coord) >> 8))      // 提取COM编号
#define GET_SEG(coord)      ((uint8_t)((coord) & 0xFF))    // 提取SEG编号
#define LCD_COORD(com, seg) ((uint16_t)((com << 8) | seg)) // 组合坐标

// 数字位1~7的七段码坐标定义
#define LCD_SLOT_1_A  LCD_COORD(0, 0)
#define LCD_SLOT_1_B  LCD_COORD(0, 8)
#define LCD_SLOT_1_C  LCD_COORD(0, 6)
#define LCD_SLOT_1_D  LCD_COORD(0, 5)
#define LCD_SLOT_1_E  LCD_COORD(0, 4)
#define LCD_SLOT_1_F  LCD_COORD(0, 1)
#define LCD_SLOT_1_G  LCD_COORD(0, 2)

#define LCD_SLOT_2_A  LCD_COORD(1, 11)
#define LCD_SLOT_2_B  LCD_COORD(0, 11)
#define LCD_SLOT_2_C  LCD_COORD(5, 10)
#define LCD_SLOT_2_D  LCD_COORD(0, 10)
#define LCD_SLOT_2_E  LCD_COORD(0, 9)
#define LCD_SLOT_2_F  LCD_COORD(5, 9)
#define LCD_SLOT_2_G  LCD_COORD(5, 11)

#define LCD_SLOT_3_A  LCD_COORD(4, 10)
#define LCD_SLOT_3_B  LCD_COORD(3, 10)
#define LCD_SLOT_3_C  LCD_COORD(2, 10)
#define LCD_SLOT_3_D  LCD_COORD(1, 10)
#define LCD_SLOT_3_E  LCD_COORD(2, 11)
#define LCD_SLOT_3_F  LCD_COORD(4, 11)
#define LCD_SLOT_3_G  LCD_COORD(3, 11)

#define LCD_SLOT_4_A  LCD_COORD(4, 8)
#define LCD_SLOT_4_B  LCD_COORD(3, 8)
#define LCD_SLOT_4_C  LCD_COORD(2, 8)
#define LCD_SLOT_4_D  LCD_COORD(1, 8)
#define LCD_SLOT_4_E  LCD_COORD(2, 9)
#define LCD_SLOT_4_F  LCD_COORD(4, 9)
#define LCD_SLOT_4_G  LCD_COORD(3, 9)

#define LCD_SLOT_5_A  LCD_COORD(4, 6)
#define LCD_SLOT_5_B  LCD_COORD(3, 6)
#define LCD_SLOT_5_C  LCD_COORD(2, 6)
#define LCD_SLOT_5_D  LCD_COORD(1, 6)
#define LCD_SLOT_5_E  LCD_COORD(2, 7)
#define LCD_SLOT_5_F  LCD_COORD(4, 7)
#define LCD_SLOT_5_G  LCD_COORD(3, 7)

#define LCD_SLOT_6_A  LCD_COORD(4, 4)
#define LCD_SLOT_6_B  LCD_COORD(3, 4)
#define LCD_SLOT_6_C  LCD_COORD(2, 4)
#define LCD_SLOT_6_D  LCD_COORD(1, 4)
#define LCD_SLOT_6_E  LCD_COORD(2, 5)
#define LCD_SLOT_6_F  LCD_COORD(4, 5)
#define LCD_SLOT_6_G  LCD_COORD(3, 5)

#define LCD_SLOT_7_A  LCD_COORD(4, 2)
#define LCD_SLOT_7_B  LCD_COORD(3, 2)
#define LCD_SLOT_7_C  LCD_COORD(2, 2)
#define LCD_SLOT_7_D  LCD_COORD(1, 2)
#define LCD_SLOT_7_E  LCD_COORD(2, 3)
#define LCD_SLOT_7_F  LCD_COORD(4, 3)
#define LCD_SLOT_7_G  LCD_COORD(3, 3)

#define LCD_SLOT_8_A  LCD_COORD(4, 0)
#define LCD_SLOT_8_B  LCD_COORD(3, 0)
#define LCD_SLOT_8_C  LCD_COORD(2, 0)
#define LCD_SLOT_8_D  LCD_COORD(1, 0)
#define LCD_SLOT_8_E  LCD_COORD(2, 1)
#define LCD_SLOT_8_F  LCD_COORD(4, 1)
#define LCD_SLOT_8_G  LCD_COORD(3, 1)

#define LCD_SYMBLE_S1 LCD_COORD(5, 8)
#define LCD_SYMBLE_S2 LCD_COORD(5, 7)
#define LCD_SYMBLE_S3 LCD_COORD(5, 6)
#define LCD_SYMBLE_S4 LCD_COORD(5, 5)
#define LCD_SYMBLE_S5 LCD_COORD(5, 4)
#define LCD_SYMBLE_S6 LCD_COORD(5, 3)
#define LCD_SYMBLE_S7 LCD_COORD(5, 2)
#define LCD_SYMBLE_S8 LCD_COORD(5, 1)
#define LCD_SYMBLE_S9 LCD_COORD(5, 0)

#define LCD_SYMBLE_P1 LCD_COORD(1, 9)
#define LCD_SYMBLE_P2 LCD_COORD(0, 7)
#define LCD_SYMBLE_P3 LCD_COORD(1, 7)
#define LCD_SYMBLE_P4 LCD_COORD(1, 5)
#define LCD_SYMBLE_P5 LCD_COORD(0, 3)
#define LCD_SYMBLE_P6 LCD_COORD(1, 3)
#define LCD_SYMBLE_P7 LCD_COORD(1, 1)

// -------------------------- 全局变量定义 --------------------------
// 全局LCD设备实例（供定时器回调使用）

// --------------------------
// COM 定义 (1-6)
// --------------------------
#define COM1_GPIO_PORT 0
#define COM1_GPIO_PIN  3

#define COM2_GPIO_PORT 0
#define COM2_GPIO_PIN  2

#define COM3_GPIO_PORT 6
#define COM3_GPIO_PIN  6

#define COM4_GPIO_PORT 1
#define COM4_GPIO_PIN  7

#define COM5_GPIO_PORT 1
#define COM5_GPIO_PIN  3

#define COM6_GPIO_PORT 6
#define COM6_GPIO_PIN  0

// --------------------------
// SEG 定义 (7-18)
// --------------------------
#define SEG1_GPIO_PORT  2
#define SEG1_GPIO_PIN   5

#define SEG2_GPIO_PORT  0
#define SEG2_GPIO_PIN   1

#define SEG3_GPIO_PORT  2
#define SEG3_GPIO_PIN   3

#define SEG4_GPIO_PORT  0
#define SEG4_GPIO_PIN   0

#define SEG5_GPIO_PORT  2
#define SEG5_GPIO_PIN   2

#define SEG6_GPIO_PORT  2
#define SEG6_GPIO_PIN   4

#define SEG7_GPIO_PORT  5
#define SEG7_GPIO_PIN   0

#define SEG8_GPIO_PORT  5
#define SEG8_GPIO_PIN   5

#define SEG9_GPIO_PORT  5
#define SEG9_GPIO_PIN   2

#define SEG10_GPIO_PORT 5
#define SEG10_GPIO_PIN  3

#define SEG11_GPIO_PORT 5
#define SEG11_GPIO_PIN  4

#define SEG12_GPIO_PORT 5
#define SEG12_GPIO_PIN  1

void xl1981_lcd_gpio_init(struct lcd_device *dev) {
  (void)dev;

  // ==========================
  // COM 端口初始化 (1-6)
  // ==========================
  GPIO_SetPinDir(COM1_GPIO_PORT, COM1_GPIO_PIN, LCD_COM_INIT_DIR);
  PORT_PinConfigure(COM1_GPIO_PORT, COM1_GPIO_PIN, (PORT_FUNC)LCD_COM_INIT_MODE);
  GPIO_PinWrite(COM1_GPIO_PORT, COM1_GPIO_PIN, LCD_COM_INIT_VALUE);

  GPIO_SetPinDir(COM2_GPIO_PORT, COM2_GPIO_PIN, LCD_COM_INIT_DIR);
  PORT_PinConfigure(COM2_GPIO_PORT, COM2_GPIO_PIN, (PORT_FUNC)LCD_COM_INIT_MODE);
  GPIO_PinWrite(COM2_GPIO_PORT, COM2_GPIO_PIN, LCD_COM_INIT_VALUE);

  GPIO_SetPinDir(COM3_GPIO_PORT, COM3_GPIO_PIN, LCD_COM_INIT_DIR);
  PORT_PinConfigure(COM3_GPIO_PORT, COM3_GPIO_PIN, (PORT_FUNC)LCD_COM_INIT_MODE);
  GPIO_PinWrite(COM3_GPIO_PORT, COM3_GPIO_PIN, LCD_COM_INIT_VALUE);

  GPIO_SetPinDir(COM4_GPIO_PORT, COM4_GPIO_PIN, LCD_COM_INIT_DIR);
  PORT_PinConfigure(COM4_GPIO_PORT, COM4_GPIO_PIN, (PORT_FUNC)LCD_COM_INIT_MODE);
  GPIO_PinWrite(COM4_GPIO_PORT, COM4_GPIO_PIN, LCD_COM_INIT_VALUE);

  GPIO_SetPinDir(COM5_GPIO_PORT, COM5_GPIO_PIN, LCD_COM_INIT_DIR);
  PORT_PinConfigure(COM5_GPIO_PORT, COM5_GPIO_PIN, (PORT_FUNC)LCD_COM_INIT_MODE);
  GPIO_PinWrite(COM5_GPIO_PORT, COM5_GPIO_PIN, LCD_COM_INIT_VALUE);

  GPIO_SetPinDir(COM6_GPIO_PORT, COM6_GPIO_PIN, LCD_COM_INIT_DIR);
  PORT_PinConfigure(COM6_GPIO_PORT, COM6_GPIO_PIN, (PORT_FUNC)LCD_COM_INIT_MODE);
  GPIO_PinWrite(COM6_GPIO_PORT, COM6_GPIO_PIN, LCD_COM_INIT_VALUE);

  // ==========================
  // SEG 端口初始化 (1-12)
  // ==========================
  GPIO_SetPinDir(SEG1_GPIO_PORT, SEG1_GPIO_PIN, LCD_SEG_INIT_DIR);
  PORT_PinConfigure(SEG1_GPIO_PORT, SEG1_GPIO_PIN, (PORT_FUNC)LCD_SEG_INIT_MODE);
  GPIO_PinWrite(SEG1_GPIO_PORT, SEG1_GPIO_PIN, LCD_SEG_INIT_VALUE);

  GPIO_SetPinDir(SEG2_GPIO_PORT, SEG2_GPIO_PIN, LCD_SEG_INIT_DIR);
  PORT_PinConfigure(SEG2_GPIO_PORT, SEG2_GPIO_PIN, (PORT_FUNC)LCD_SEG_INIT_MODE);
  GPIO_PinWrite(SEG2_GPIO_PORT, SEG2_GPIO_PIN, LCD_SEG_INIT_VALUE);

  GPIO_SetPinDir(SEG3_GPIO_PORT, SEG3_GPIO_PIN, LCD_SEG_INIT_DIR);
  PORT_PinConfigure(SEG3_GPIO_PORT, SEG3_GPIO_PIN, (PORT_FUNC)LCD_SEG_INIT_MODE);
  GPIO_PinWrite(SEG3_GPIO_PORT, SEG3_GPIO_PIN, LCD_SEG_INIT_VALUE);

  GPIO_SetPinDir(SEG4_GPIO_PORT, SEG4_GPIO_PIN, LCD_SEG_INIT_DIR);
  PORT_PinConfigure(SEG4_GPIO_PORT, SEG4_GPIO_PIN, (PORT_FUNC)LCD_SEG_INIT_MODE);
  GPIO_PinWrite(SEG4_GPIO_PORT, SEG4_GPIO_PIN, LCD_SEG_INIT_VALUE);

  GPIO_SetPinDir(SEG5_GPIO_PORT, SEG5_GPIO_PIN, LCD_SEG_INIT_DIR);
  PORT_PinConfigure(SEG5_GPIO_PORT, SEG5_GPIO_PIN, (PORT_FUNC)LCD_SEG_INIT_MODE);
  GPIO_PinWrite(SEG5_GPIO_PORT, SEG5_GPIO_PIN, LCD_SEG_INIT_VALUE);

  GPIO_SetPinDir(SEG6_GPIO_PORT, SEG6_GPIO_PIN, LCD_SEG_INIT_DIR);
  PORT_PinConfigure(SEG6_GPIO_PORT, SEG6_GPIO_PIN, (PORT_FUNC)LCD_SEG_INIT_MODE);
  GPIO_PinWrite(SEG6_GPIO_PORT, SEG6_GPIO_PIN, LCD_SEG_INIT_VALUE);

  GPIO_SetPinDir(SEG7_GPIO_PORT, SEG7_GPIO_PIN, LCD_SEG_INIT_DIR);
  PORT_PinConfigure(SEG7_GPIO_PORT, SEG7_GPIO_PIN, (PORT_FUNC)LCD_SEG_INIT_MODE);
  GPIO_PinWrite(SEG7_GPIO_PORT, SEG7_GPIO_PIN, LCD_SEG_INIT_VALUE);

  GPIO_SetPinDir(SEG8_GPIO_PORT, SEG8_GPIO_PIN, LCD_SEG_INIT_DIR);
  PORT_PinConfigure(SEG8_GPIO_PORT, SEG8_GPIO_PIN, (PORT_FUNC)LCD_SEG_INIT_MODE);
  GPIO_PinWrite(SEG8_GPIO_PORT, SEG8_GPIO_PIN, LCD_SEG_INIT_VALUE);

  GPIO_SetPinDir(SEG9_GPIO_PORT, SEG9_GPIO_PIN, LCD_SEG_INIT_DIR);
  PORT_PinConfigure(SEG9_GPIO_PORT, SEG9_GPIO_PIN, (PORT_FUNC)LCD_SEG_INIT_MODE);
  GPIO_PinWrite(SEG9_GPIO_PORT, SEG9_GPIO_PIN, LCD_SEG_INIT_VALUE);

  GPIO_SetPinDir(SEG10_GPIO_PORT, SEG10_GPIO_PIN, LCD_SEG_INIT_DIR);
  PORT_PinConfigure(SEG10_GPIO_PORT, SEG10_GPIO_PIN, (PORT_FUNC)LCD_SEG_INIT_MODE);
  GPIO_PinWrite(SEG10_GPIO_PORT, SEG10_GPIO_PIN, LCD_SEG_INIT_VALUE);

  GPIO_SetPinDir(SEG11_GPIO_PORT, SEG11_GPIO_PIN, LCD_SEG_INIT_DIR);
  PORT_PinConfigure(SEG11_GPIO_PORT, SEG11_GPIO_PIN, (PORT_FUNC)LCD_SEG_INIT_MODE);
  GPIO_PinWrite(SEG11_GPIO_PORT, SEG11_GPIO_PIN, LCD_SEG_INIT_VALUE);

  GPIO_SetPinDir(SEG12_GPIO_PORT, SEG12_GPIO_PIN, LCD_SEG_INIT_DIR);
  PORT_PinConfigure(SEG12_GPIO_PORT, SEG12_GPIO_PIN, (PORT_FUNC)LCD_SEG_INIT_MODE);
  GPIO_PinWrite(SEG12_GPIO_PORT, SEG12_GPIO_PIN, LCD_SEG_INIT_VALUE);
}

// **********************************************************************
// LCD 电平控制函数 - COM 通道 (1~6)
// **********************************************************************

// -------------------------- COM1 --------------------------
// LCD_COM_VOLT_0V
void COM1_Set0V(void) {
  GPIO_SetPinDir(COM1_GPIO_PORT, COM1_GPIO_PIN, LCD_COM_VOLT_0V_GPIO_DIR);
  PORT_PinConfigure(COM1_GPIO_PORT, COM1_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_0V_GPIO_MODE);
  GPIO_PinWrite(COM1_GPIO_PORT, COM1_GPIO_PIN, LCD_COM_VOLT_0V_GPIO_VALUE);
}
// LCD_COM_VOLT_1_3V
void COM1_Set1_3V(void) {
  GPIO_SetPinDir(COM1_GPIO_PORT, COM1_GPIO_PIN, LCD_COM_VOLT_1_3V_GPIO_DIR);
  PORT_PinConfigure(COM1_GPIO_PORT, COM1_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_1_3V_GPIO_MODE);
  GPIO_PinWrite(COM1_GPIO_PORT, COM1_GPIO_PIN, LCD_COM_VOLT_1_3V_GPIO_VALUE);
}
// LCD_COM_VOLT_2_3V
void COM1_Set2_3V(void) {
  GPIO_SetPinDir(COM1_GPIO_PORT, COM1_GPIO_PIN, LCD_COM_VOLT_2_3V_GPIO_DIR);
  PORT_PinConfigure(COM1_GPIO_PORT, COM1_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_2_3V_GPIO_MODE);
  GPIO_PinWrite(COM1_GPIO_PORT, COM1_GPIO_PIN, LCD_COM_VOLT_2_3V_GPIO_VALUE);
}
// LCD_COM_VOLT_FULLV
void COM1_SetFullV(void) {
  GPIO_SetPinDir(COM1_GPIO_PORT, COM1_GPIO_PIN, LCD_COM_VOLT_FULLV_GPIO_DIR);
  PORT_PinConfigure(COM1_GPIO_PORT, COM1_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_FULLV_GPIO_MODE);
  GPIO_PinWrite(COM1_GPIO_PORT, COM1_GPIO_PIN, LCD_COM_VOLT_FULLV_GPIO_VALUE);
}

// -------------------------- COM2 --------------------------
void COM2_Set0V(void) {
  GPIO_SetPinDir(COM2_GPIO_PORT, COM2_GPIO_PIN, LCD_COM_VOLT_0V_GPIO_DIR);
  PORT_PinConfigure(COM2_GPIO_PORT, COM2_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_0V_GPIO_MODE);
  GPIO_PinWrite(COM2_GPIO_PORT, COM2_GPIO_PIN, LCD_COM_VOLT_0V_GPIO_VALUE);
}
void COM2_Set1_3V(void) {
  GPIO_SetPinDir(COM2_GPIO_PORT, COM2_GPIO_PIN, LCD_COM_VOLT_1_3V_GPIO_DIR);
  PORT_PinConfigure(COM2_GPIO_PORT, COM2_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_1_3V_GPIO_MODE);
  GPIO_PinWrite(COM2_GPIO_PORT, COM2_GPIO_PIN, LCD_COM_VOLT_1_3V_GPIO_VALUE);
}
void COM2_Set2_3V(void) {
  GPIO_SetPinDir(COM2_GPIO_PORT, COM2_GPIO_PIN, LCD_COM_VOLT_2_3V_GPIO_DIR);
  PORT_PinConfigure(COM2_GPIO_PORT, COM2_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_2_3V_GPIO_MODE);
  GPIO_PinWrite(COM2_GPIO_PORT, COM2_GPIO_PIN, LCD_COM_VOLT_2_3V_GPIO_VALUE);
}
void COM2_SetFullV(void) {
  GPIO_SetPinDir(COM2_GPIO_PORT, COM2_GPIO_PIN, LCD_COM_VOLT_FULLV_GPIO_DIR);
  PORT_PinConfigure(COM2_GPIO_PORT, COM2_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_FULLV_GPIO_MODE);
  GPIO_PinWrite(COM2_GPIO_PORT, COM2_GPIO_PIN, LCD_COM_VOLT_FULLV_GPIO_VALUE);
}

// -------------------------- COM3 --------------------------
void COM3_Set0V(void) {
  GPIO_SetPinDir(COM3_GPIO_PORT, COM3_GPIO_PIN, LCD_COM_VOLT_0V_GPIO_DIR);
  PORT_PinConfigure(COM3_GPIO_PORT, COM3_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_0V_GPIO_MODE);
  GPIO_PinWrite(COM3_GPIO_PORT, COM3_GPIO_PIN, LCD_COM_VOLT_0V_GPIO_VALUE);
}
void COM3_Set1_3V(void) {
  GPIO_SetPinDir(COM3_GPIO_PORT, COM3_GPIO_PIN, LCD_COM_VOLT_1_3V_GPIO_DIR);
  PORT_PinConfigure(COM3_GPIO_PORT, COM3_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_1_3V_GPIO_MODE);
  GPIO_PinWrite(COM3_GPIO_PORT, COM3_GPIO_PIN, LCD_COM_VOLT_1_3V_GPIO_VALUE);
}
void COM3_Set2_3V(void) {
  GPIO_SetPinDir(COM3_GPIO_PORT, COM3_GPIO_PIN, LCD_COM_VOLT_2_3V_GPIO_DIR);
  PORT_PinConfigure(COM3_GPIO_PORT, COM3_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_2_3V_GPIO_MODE);
  GPIO_PinWrite(COM3_GPIO_PORT, COM3_GPIO_PIN, LCD_COM_VOLT_2_3V_GPIO_VALUE);
}
void COM3_SetFullV(void) {
  GPIO_SetPinDir(COM3_GPIO_PORT, COM3_GPIO_PIN, LCD_COM_VOLT_FULLV_GPIO_DIR);
  PORT_PinConfigure(COM3_GPIO_PORT, COM3_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_FULLV_GPIO_MODE);
  GPIO_PinWrite(COM3_GPIO_PORT, COM3_GPIO_PIN, LCD_COM_VOLT_FULLV_GPIO_VALUE);
}

// -------------------------- COM4 --------------------------
void COM4_Set0V(void) {
  GPIO_SetPinDir(COM4_GPIO_PORT, COM4_GPIO_PIN, LCD_COM_VOLT_0V_GPIO_DIR);
  PORT_PinConfigure(COM4_GPIO_PORT, COM4_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_0V_GPIO_MODE);
  GPIO_PinWrite(COM4_GPIO_PORT, COM4_GPIO_PIN, LCD_COM_VOLT_0V_GPIO_VALUE);
}
void COM4_Set1_3V(void) {
  GPIO_SetPinDir(COM4_GPIO_PORT, COM4_GPIO_PIN, LCD_COM_VOLT_1_3V_GPIO_DIR);
  PORT_PinConfigure(COM4_GPIO_PORT, COM4_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_1_3V_GPIO_MODE);
  GPIO_PinWrite(COM4_GPIO_PORT, COM4_GPIO_PIN, LCD_COM_VOLT_1_3V_GPIO_VALUE);
}
void COM4_Set2_3V(void) {
  GPIO_SetPinDir(COM4_GPIO_PORT, COM4_GPIO_PIN, LCD_COM_VOLT_2_3V_GPIO_DIR);
  PORT_PinConfigure(COM4_GPIO_PORT, COM4_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_2_3V_GPIO_MODE);
  GPIO_PinWrite(COM4_GPIO_PORT, COM4_GPIO_PIN, LCD_COM_VOLT_2_3V_GPIO_VALUE);
}
void COM4_SetFullV(void) {
  GPIO_SetPinDir(COM4_GPIO_PORT, COM4_GPIO_PIN, LCD_COM_VOLT_FULLV_GPIO_DIR);
  PORT_PinConfigure(COM4_GPIO_PORT, COM4_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_FULLV_GPIO_MODE);
  GPIO_PinWrite(COM4_GPIO_PORT, COM4_GPIO_PIN, LCD_COM_VOLT_FULLV_GPIO_VALUE);
}

// -------------------------- COM5 --------------------------
void COM5_Set0V(void) {
  GPIO_SetPinDir(COM5_GPIO_PORT, COM5_GPIO_PIN, LCD_COM_VOLT_0V_GPIO_DIR);
  PORT_PinConfigure(COM5_GPIO_PORT, COM5_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_0V_GPIO_MODE);
  GPIO_PinWrite(COM5_GPIO_PORT, COM5_GPIO_PIN, LCD_COM_VOLT_0V_GPIO_VALUE);
}
void COM5_Set1_3V(void) {
  GPIO_SetPinDir(COM5_GPIO_PORT, COM5_GPIO_PIN, LCD_COM_VOLT_1_3V_GPIO_DIR);
  PORT_PinConfigure(COM5_GPIO_PORT, COM5_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_1_3V_GPIO_MODE);
  GPIO_PinWrite(COM5_GPIO_PORT, COM5_GPIO_PIN, LCD_COM_VOLT_1_3V_GPIO_VALUE);
}
void COM5_Set2_3V(void) {
  GPIO_SetPinDir(COM5_GPIO_PORT, COM5_GPIO_PIN, LCD_COM_VOLT_2_3V_GPIO_DIR);
  PORT_PinConfigure(COM5_GPIO_PORT, COM5_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_2_3V_GPIO_MODE);
  GPIO_PinWrite(COM5_GPIO_PORT, COM5_GPIO_PIN, LCD_COM_VOLT_2_3V_GPIO_VALUE);
}
void COM5_SetFullV(void) {
  GPIO_SetPinDir(COM5_GPIO_PORT, COM5_GPIO_PIN, LCD_COM_VOLT_FULLV_GPIO_DIR);
  PORT_PinConfigure(COM5_GPIO_PORT, COM5_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_FULLV_GPIO_MODE);
  GPIO_PinWrite(COM5_GPIO_PORT, COM5_GPIO_PIN, LCD_COM_VOLT_FULLV_GPIO_VALUE);
}

// -------------------------- COM6 --------------------------
void COM6_Set0V(void) {
  GPIO_SetPinDir(COM6_GPIO_PORT, COM6_GPIO_PIN, LCD_COM_VOLT_0V_GPIO_DIR);
  PORT_PinConfigure(COM6_GPIO_PORT, COM6_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_0V_GPIO_MODE);
  GPIO_PinWrite(COM6_GPIO_PORT, COM6_GPIO_PIN, LCD_COM_VOLT_0V_GPIO_VALUE);
}
void COM6_Set1_3V(void) {
  GPIO_SetPinDir(COM6_GPIO_PORT, COM6_GPIO_PIN, LCD_COM_VOLT_1_3V_GPIO_DIR);
  PORT_PinConfigure(COM6_GPIO_PORT, COM6_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_1_3V_GPIO_MODE);
  GPIO_PinWrite(COM6_GPIO_PORT, COM6_GPIO_PIN, LCD_COM_VOLT_1_3V_GPIO_VALUE);
}
void COM6_Set2_3V(void) {
  GPIO_SetPinDir(COM6_GPIO_PORT, COM6_GPIO_PIN, LCD_COM_VOLT_2_3V_GPIO_DIR);
  PORT_PinConfigure(COM6_GPIO_PORT, COM6_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_2_3V_GPIO_MODE);
  GPIO_PinWrite(COM6_GPIO_PORT, COM6_GPIO_PIN, LCD_COM_VOLT_2_3V_GPIO_VALUE);
}
void COM6_SetFullV(void) {
  GPIO_SetPinDir(COM6_GPIO_PORT, COM6_GPIO_PIN, LCD_COM_VOLT_FULLV_GPIO_DIR);
  PORT_PinConfigure(COM6_GPIO_PORT, COM6_GPIO_PIN, (PORT_FUNC)LCD_COM_VOLT_FULLV_GPIO_MODE);
  GPIO_PinWrite(COM6_GPIO_PORT, COM6_GPIO_PIN, LCD_COM_VOLT_FULLV_GPIO_VALUE);
}

// **********************************************************************
// LCD 电平控制函数 - SEG 通道 (1~12)
// **********************************************************************

// -------------------------- SEG1 --------------------------
void SEG1_Set0V(void) {
  GPIO_SetPinDir(SEG1_GPIO_PORT, SEG1_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_DIR);
  PORT_PinConfigure(SEG1_GPIO_PORT, SEG1_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_0V_GPIO_MODE);
  GPIO_PinWrite(SEG1_GPIO_PORT, SEG1_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_VALUE);
}
void SEG1_Set1_3V(void) {
  GPIO_SetPinDir(SEG1_GPIO_PORT, SEG1_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_DIR);
  PORT_PinConfigure(SEG1_GPIO_PORT, SEG1_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_1_3V_GPIO_MODE);
  GPIO_PinWrite(SEG1_GPIO_PORT, SEG1_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_VALUE);
}
void SEG1_Set2_3V(void) {
  GPIO_SetPinDir(SEG1_GPIO_PORT, SEG1_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_DIR);
  PORT_PinConfigure(SEG1_GPIO_PORT, SEG1_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_2_3V_GPIO_MODE);
  GPIO_PinWrite(SEG1_GPIO_PORT, SEG1_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_VALUE);
}
void SEG1_SetFullV(void) {
  GPIO_SetPinDir(SEG1_GPIO_PORT, SEG1_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_DIR);
  PORT_PinConfigure(SEG1_GPIO_PORT, SEG1_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_FULLV_GPIO_MODE);
  GPIO_PinWrite(SEG1_GPIO_PORT, SEG1_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_VALUE);
}

// -------------------------- SEG2 --------------------------
void SEG2_Set0V(void) {
  GPIO_SetPinDir(SEG2_GPIO_PORT, SEG2_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_DIR);
  PORT_PinConfigure(SEG2_GPIO_PORT, SEG2_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_0V_GPIO_MODE);
  GPIO_PinWrite(SEG2_GPIO_PORT, SEG2_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_VALUE);
}
void SEG2_Set1_3V(void) {
  GPIO_SetPinDir(SEG2_GPIO_PORT, SEG2_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_DIR);
  PORT_PinConfigure(SEG2_GPIO_PORT, SEG2_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_1_3V_GPIO_MODE);
  GPIO_PinWrite(SEG2_GPIO_PORT, SEG2_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_VALUE);
}
void SEG2_Set2_3V(void) {
  GPIO_SetPinDir(SEG2_GPIO_PORT, SEG2_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_DIR);
  PORT_PinConfigure(SEG2_GPIO_PORT, SEG2_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_2_3V_GPIO_MODE);
  GPIO_PinWrite(SEG2_GPIO_PORT, SEG2_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_VALUE);
}
void SEG2_SetFullV(void) {
  GPIO_SetPinDir(SEG2_GPIO_PORT, SEG2_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_DIR);
  PORT_PinConfigure(SEG2_GPIO_PORT, SEG2_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_FULLV_GPIO_MODE);
  GPIO_PinWrite(SEG2_GPIO_PORT, SEG2_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_VALUE);
}

// -------------------------- SEG3 --------------------------
void SEG3_Set0V(void) {
  GPIO_SetPinDir(SEG3_GPIO_PORT, SEG3_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_DIR);
  PORT_PinConfigure(SEG3_GPIO_PORT, SEG3_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_0V_GPIO_MODE);
  GPIO_PinWrite(SEG3_GPIO_PORT, SEG3_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_VALUE);
}
void SEG3_Set1_3V(void) {
  GPIO_SetPinDir(SEG3_GPIO_PORT, SEG3_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_DIR);
  PORT_PinConfigure(SEG3_GPIO_PORT, SEG3_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_1_3V_GPIO_MODE);
  GPIO_PinWrite(SEG3_GPIO_PORT, SEG3_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_VALUE);
}
void SEG3_Set2_3V(void) {
  GPIO_SetPinDir(SEG3_GPIO_PORT, SEG3_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_DIR);
  PORT_PinConfigure(SEG3_GPIO_PORT, SEG3_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_2_3V_GPIO_MODE);
  GPIO_PinWrite(SEG3_GPIO_PORT, SEG3_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_VALUE);
}
void SEG3_SetFullV(void) {
  GPIO_SetPinDir(SEG3_GPIO_PORT, SEG3_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_DIR);
  PORT_PinConfigure(SEG3_GPIO_PORT, SEG3_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_FULLV_GPIO_MODE);
  GPIO_PinWrite(SEG3_GPIO_PORT, SEG3_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_VALUE);
}

// -------------------------- SEG4 --------------------------
void SEG4_Set0V(void) {
  GPIO_SetPinDir(SEG4_GPIO_PORT, SEG4_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_DIR);
  PORT_PinConfigure(SEG4_GPIO_PORT, SEG4_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_0V_GPIO_MODE);
  GPIO_PinWrite(SEG4_GPIO_PORT, SEG4_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_VALUE);
}
void SEG4_Set1_3V(void) {
  GPIO_SetPinDir(SEG4_GPIO_PORT, SEG4_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_DIR);
  PORT_PinConfigure(SEG4_GPIO_PORT, SEG4_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_1_3V_GPIO_MODE);
  GPIO_PinWrite(SEG4_GPIO_PORT, SEG4_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_VALUE);
}
void SEG4_Set2_3V(void) {
  GPIO_SetPinDir(SEG4_GPIO_PORT, SEG4_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_DIR);
  PORT_PinConfigure(SEG4_GPIO_PORT, SEG4_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_2_3V_GPIO_MODE);
  GPIO_PinWrite(SEG4_GPIO_PORT, SEG4_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_VALUE);
}
void SEG4_SetFullV(void) {
  GPIO_SetPinDir(SEG4_GPIO_PORT, SEG4_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_DIR);
  PORT_PinConfigure(SEG4_GPIO_PORT, SEG4_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_FULLV_GPIO_MODE);
  GPIO_PinWrite(SEG4_GPIO_PORT, SEG4_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_VALUE);
}

// -------------------------- SEG5 --------------------------
void SEG5_Set0V(void) {
  GPIO_SetPinDir(SEG5_GPIO_PORT, SEG5_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_DIR);
  PORT_PinConfigure(SEG5_GPIO_PORT, SEG5_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_0V_GPIO_MODE);
  GPIO_PinWrite(SEG5_GPIO_PORT, SEG5_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_VALUE);
}
void SEG5_Set1_3V(void) {
  GPIO_SetPinDir(SEG5_GPIO_PORT, SEG5_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_DIR);
  PORT_PinConfigure(SEG5_GPIO_PORT, SEG5_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_1_3V_GPIO_MODE);
  GPIO_PinWrite(SEG5_GPIO_PORT, SEG5_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_VALUE);
}
void SEG5_Set2_3V(void) {
  GPIO_SetPinDir(SEG5_GPIO_PORT, SEG5_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_DIR);
  PORT_PinConfigure(SEG5_GPIO_PORT, SEG5_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_2_3V_GPIO_MODE);
  GPIO_PinWrite(SEG5_GPIO_PORT, SEG5_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_VALUE);
}
void SEG5_SetFullV(void) {
  GPIO_SetPinDir(SEG5_GPIO_PORT, SEG5_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_DIR);
  PORT_PinConfigure(SEG5_GPIO_PORT, SEG5_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_FULLV_GPIO_MODE);
  GPIO_PinWrite(SEG5_GPIO_PORT, SEG5_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_VALUE);
}

// -------------------------- SEG6 --------------------------
void SEG6_Set0V(void) {
  GPIO_SetPinDir(SEG6_GPIO_PORT, SEG6_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_DIR);
  PORT_PinConfigure(SEG6_GPIO_PORT, SEG6_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_0V_GPIO_MODE);
  GPIO_PinWrite(SEG6_GPIO_PORT, SEG6_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_VALUE);
}
void SEG6_Set1_3V(void) {
  GPIO_SetPinDir(SEG6_GPIO_PORT, SEG6_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_DIR);
  PORT_PinConfigure(SEG6_GPIO_PORT, SEG6_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_1_3V_GPIO_MODE);
  GPIO_PinWrite(SEG6_GPIO_PORT, SEG6_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_VALUE);
}
void SEG6_Set2_3V(void) {
  GPIO_SetPinDir(SEG6_GPIO_PORT, SEG6_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_DIR);
  PORT_PinConfigure(SEG6_GPIO_PORT, SEG6_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_2_3V_GPIO_MODE);
  GPIO_PinWrite(SEG6_GPIO_PORT, SEG6_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_VALUE);
}
void SEG6_SetFullV(void) {
  GPIO_SetPinDir(SEG6_GPIO_PORT, SEG6_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_DIR);
  PORT_PinConfigure(SEG6_GPIO_PORT, SEG6_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_FULLV_GPIO_MODE);
  GPIO_PinWrite(SEG6_GPIO_PORT, SEG6_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_VALUE);
}

// -------------------------- SEG7 --------------------------
void SEG7_Set0V(void) {
  GPIO_SetPinDir(SEG7_GPIO_PORT, SEG7_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_DIR);
  PORT_PinConfigure(SEG7_GPIO_PORT, SEG7_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_0V_GPIO_MODE);
  GPIO_PinWrite(SEG7_GPIO_PORT, SEG7_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_VALUE);
}
void SEG7_Set1_3V(void) {
  GPIO_SetPinDir(SEG7_GPIO_PORT, SEG7_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_DIR);
  PORT_PinConfigure(SEG7_GPIO_PORT, SEG7_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_1_3V_GPIO_MODE);
  GPIO_PinWrite(SEG7_GPIO_PORT, SEG7_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_VALUE);
}
void SEG7_Set2_3V(void) {
  GPIO_SetPinDir(SEG7_GPIO_PORT, SEG7_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_DIR);
  PORT_PinConfigure(SEG7_GPIO_PORT, SEG7_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_2_3V_GPIO_MODE);
  GPIO_PinWrite(SEG7_GPIO_PORT, SEG7_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_VALUE);
}
void SEG7_SetFullV(void) {
  GPIO_SetPinDir(SEG7_GPIO_PORT, SEG7_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_DIR);
  PORT_PinConfigure(SEG7_GPIO_PORT, SEG7_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_FULLV_GPIO_MODE);
  GPIO_PinWrite(SEG7_GPIO_PORT, SEG7_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_VALUE);
}

// -------------------------- SEG8 --------------------------
void SEG8_Set0V(void) {
  GPIO_SetPinDir(SEG8_GPIO_PORT, SEG8_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_DIR);
  PORT_PinConfigure(SEG8_GPIO_PORT, SEG8_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_0V_GPIO_MODE);
  GPIO_PinWrite(SEG8_GPIO_PORT, SEG8_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_VALUE);
}
void SEG8_Set1_3V(void) {
  GPIO_SetPinDir(SEG8_GPIO_PORT, SEG8_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_DIR);
  PORT_PinConfigure(SEG8_GPIO_PORT, SEG8_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_1_3V_GPIO_MODE);
  GPIO_PinWrite(SEG8_GPIO_PORT, SEG8_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_VALUE);
}
void SEG8_Set2_3V(void) {
  GPIO_SetPinDir(SEG8_GPIO_PORT, SEG8_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_DIR);
  PORT_PinConfigure(SEG8_GPIO_PORT, SEG8_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_2_3V_GPIO_MODE);
  GPIO_PinWrite(SEG8_GPIO_PORT, SEG8_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_VALUE);
}
void SEG8_SetFullV(void) {
  GPIO_SetPinDir(SEG8_GPIO_PORT, SEG8_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_DIR);
  PORT_PinConfigure(SEG8_GPIO_PORT, SEG8_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_FULLV_GPIO_MODE);
  GPIO_PinWrite(SEG8_GPIO_PORT, SEG8_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_VALUE);
}

// -------------------------- SEG9 --------------------------
void SEG9_Set0V(void) {
  GPIO_SetPinDir(SEG9_GPIO_PORT, SEG9_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_DIR);
  PORT_PinConfigure(SEG9_GPIO_PORT, SEG9_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_0V_GPIO_MODE);
  GPIO_PinWrite(SEG9_GPIO_PORT, SEG9_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_VALUE);
}
void SEG9_Set1_3V(void) {
  GPIO_SetPinDir(SEG9_GPIO_PORT, SEG9_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_DIR);
  PORT_PinConfigure(SEG9_GPIO_PORT, SEG9_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_1_3V_GPIO_MODE);
  GPIO_PinWrite(SEG9_GPIO_PORT, SEG9_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_VALUE);
}
void SEG9_Set2_3V(void) {
  GPIO_SetPinDir(SEG9_GPIO_PORT, SEG9_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_DIR);
  PORT_PinConfigure(SEG9_GPIO_PORT, SEG9_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_2_3V_GPIO_MODE);
  GPIO_PinWrite(SEG9_GPIO_PORT, SEG9_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_VALUE);
}
void SEG9_SetFullV(void) {
  GPIO_SetPinDir(SEG9_GPIO_PORT, SEG9_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_DIR);
  PORT_PinConfigure(SEG9_GPIO_PORT, SEG9_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_FULLV_GPIO_MODE);
  GPIO_PinWrite(SEG9_GPIO_PORT, SEG9_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_VALUE);
}

// -------------------------- SEG10 --------------------------
void SEG10_Set0V(void) {
  GPIO_SetPinDir(SEG10_GPIO_PORT, SEG10_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_DIR);
  PORT_PinConfigure(SEG10_GPIO_PORT, SEG10_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_0V_GPIO_MODE);
  GPIO_PinWrite(SEG10_GPIO_PORT, SEG10_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_VALUE);
}
void SEG10_Set1_3V(void) {
  GPIO_SetPinDir(SEG10_GPIO_PORT, SEG10_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_DIR);
  PORT_PinConfigure(SEG10_GPIO_PORT, SEG10_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_1_3V_GPIO_MODE);
  GPIO_PinWrite(SEG10_GPIO_PORT, SEG10_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_VALUE);
}
void SEG10_Set2_3V(void) {
  GPIO_SetPinDir(SEG10_GPIO_PORT, SEG10_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_DIR);
  PORT_PinConfigure(SEG10_GPIO_PORT, SEG10_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_2_3V_GPIO_MODE);
  GPIO_PinWrite(SEG10_GPIO_PORT, SEG10_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_VALUE);
}
void SEG10_SetFullV(void) {
  GPIO_SetPinDir(SEG10_GPIO_PORT, SEG10_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_DIR);
  PORT_PinConfigure(SEG10_GPIO_PORT, SEG10_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_FULLV_GPIO_MODE);
  GPIO_PinWrite(SEG10_GPIO_PORT, SEG10_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_VALUE);
}

// -------------------------- SEG11 --------------------------
void SEG11_Set0V(void) {
  GPIO_SetPinDir(SEG11_GPIO_PORT, SEG11_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_DIR);
  PORT_PinConfigure(SEG11_GPIO_PORT, SEG11_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_0V_GPIO_MODE);
  GPIO_PinWrite(SEG11_GPIO_PORT, SEG11_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_VALUE);
}
void SEG11_Set1_3V(void) {
  GPIO_SetPinDir(SEG11_GPIO_PORT, SEG11_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_DIR);
  PORT_PinConfigure(SEG11_GPIO_PORT, SEG11_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_1_3V_GPIO_MODE);
  GPIO_PinWrite(SEG11_GPIO_PORT, SEG11_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_VALUE);
}
void SEG11_Set2_3V(void) {
  GPIO_SetPinDir(SEG11_GPIO_PORT, SEG11_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_DIR);
  PORT_PinConfigure(SEG11_GPIO_PORT, SEG11_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_2_3V_GPIO_MODE);
  GPIO_PinWrite(SEG11_GPIO_PORT, SEG11_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_VALUE);
}
void SEG11_SetFullV(void) {
  GPIO_SetPinDir(SEG11_GPIO_PORT, SEG11_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_DIR);
  PORT_PinConfigure(SEG11_GPIO_PORT, SEG11_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_FULLV_GPIO_MODE);
  GPIO_PinWrite(SEG11_GPIO_PORT, SEG11_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_VALUE);
}

// -------------------------- SEG12 --------------------------
void SEG12_Set0V(void) {
  GPIO_SetPinDir(SEG12_GPIO_PORT, SEG12_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_DIR);
  PORT_PinConfigure(SEG12_GPIO_PORT, SEG12_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_0V_GPIO_MODE);
  GPIO_PinWrite(SEG12_GPIO_PORT, SEG12_GPIO_PIN, LCD_SEG_VOLT_0V_GPIO_VALUE);
}
void SEG12_Set1_3V(void) {
  GPIO_SetPinDir(SEG12_GPIO_PORT, SEG12_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_DIR);
  PORT_PinConfigure(SEG12_GPIO_PORT, SEG12_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_1_3V_GPIO_MODE);
  GPIO_PinWrite(SEG12_GPIO_PORT, SEG12_GPIO_PIN, LCD_SEG_VOLT_1_3V_GPIO_VALUE);
}
void SEG12_Set2_3V(void) {
  GPIO_SetPinDir(SEG12_GPIO_PORT, SEG12_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_DIR);
  PORT_PinConfigure(SEG12_GPIO_PORT, SEG12_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_2_3V_GPIO_MODE);
  GPIO_PinWrite(SEG12_GPIO_PORT, SEG12_GPIO_PIN, LCD_SEG_VOLT_2_3V_GPIO_VALUE);
}
void SEG12_SetFullV(void) {
  GPIO_SetPinDir(SEG12_GPIO_PORT, SEG12_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_DIR);
  PORT_PinConfigure(SEG12_GPIO_PORT, SEG12_GPIO_PIN, (PORT_FUNC)LCD_SEG_VOLT_FULLV_GPIO_MODE);
  GPIO_PinWrite(SEG12_GPIO_PORT, SEG12_GPIO_PIN, LCD_SEG_VOLT_FULLV_GPIO_VALUE);
}

// LCD 电平函数表定义
lcd_level_table_t lcd_level_table = {
    // COM 通道 [6][4]
    .com =
        {
            {COM1_Set0V, COM1_Set1_3V, COM1_Set2_3V, COM1_SetFullV},
            {COM2_Set0V, COM2_Set1_3V, COM2_Set2_3V, COM2_SetFullV},
            {COM3_Set0V, COM3_Set1_3V, COM3_Set2_3V, COM3_SetFullV},
            {COM4_Set0V, COM4_Set1_3V, COM4_Set2_3V, COM4_SetFullV},
            {COM5_Set0V, COM5_Set1_3V, COM5_Set2_3V, COM5_SetFullV},
            {COM6_Set0V, COM6_Set1_3V, COM6_Set2_3V, COM6_SetFullV},
        },
    // SEG 通道 [12][4]
    .seg =
        {
            {SEG1_Set0V, SEG1_Set1_3V, SEG1_Set2_3V, SEG1_SetFullV},
            {SEG2_Set0V, SEG2_Set1_3V, SEG2_Set2_3V, SEG2_SetFullV},
            {SEG3_Set0V, SEG3_Set1_3V, SEG3_Set2_3V, SEG3_SetFullV},
            {SEG4_Set0V, SEG4_Set1_3V, SEG4_Set2_3V, SEG4_SetFullV},
            {SEG5_Set0V, SEG5_Set1_3V, SEG5_Set2_3V, SEG5_SetFullV},
            {SEG6_Set0V, SEG6_Set1_3V, SEG6_Set2_3V, SEG6_SetFullV},
            {SEG7_Set0V, SEG7_Set1_3V, SEG7_Set2_3V, SEG7_SetFullV},
            {SEG8_Set0V, SEG8_Set1_3V, SEG8_Set2_3V, SEG8_SetFullV},
            {SEG9_Set0V, SEG9_Set1_3V, SEG9_Set2_3V, SEG9_SetFullV},
            {SEG10_Set0V, SEG10_Set1_3V, SEG10_Set2_3V, SEG10_SetFullV},
            {SEG11_Set0V, SEG11_Set1_3V, SEG11_Set2_3V, SEG11_SetFullV},
            {SEG12_Set0V, SEG12_Set1_3V, SEG12_Set2_3V, SEG12_SetFullV},
        },
};

lcd_device_t lcd_dev = {
    .is_init = false,
    .init = xl1981_lcd_gpio_init,
    .level_table = &lcd_level_table,
    .current_com = 0U,
    .set_pixel = lcd_set_pixel,
    .set_level = lcd_set_level,
    .refresh = lcd_refresh,
    .clear = lcd_clear,

    .disp_buf = {0},
};

// LCD显示缓存（兼容原有逻辑，与设备对象缓存联动）
// static uint8_t lcd_buf[LCD_COM_MAX][LCD_SEG_MAX] = {0};

// -------------------------- 私有方法实现 --------------------------
/**
 * @brief 清屏（所有像素熄灭）
 */
static void lcd_clear(lcd_device_t *dev) {
  if (dev == NULL)
    return;

  // 清空设备缓存
  for (uint8_t com = 0U; com < LCD_COM_NUM; com++) {
    for (uint8_t seg = 0U; seg < LCD_SEG_NUM; seg++) {
      dev->disp_buf[com][seg] = LCD_PIXEL_OFF;
      //   lcd_buf[com][seg] = LCD_PIXEL_OFF; // 同步清空兼容缓存
    }
  }
}

/**
 * @brief 设置单个像素状态
 */
static void lcd_set_pixel(lcd_device_t *dev, uint8_t com, uint8_t seg, lcd_pixel_state_e state) {
  // 入参合法性检查
  if (dev == NULL || !dev->is_init)
    return;
  if (com >= LCD_COM_NUM || seg >= LCD_SEG_NUM)
    return;

  // 更新双缓存（保证数据一致性）
  dev->disp_buf[com][seg] = state;
  //   lcd_buf[com][seg] = state;
}

/**
 * @brief LCD电平设置（硬件层适配接口）
 */
static void lcd_set_level(lcd_device_t *dev, lcd_channel_type_e ch_type, uint8_t index, lcd_volt_level_e level) {
  if (dev == NULL || level >= LCD_1_3BIAS_VOLT_LEVELS)
    return;

  switch (ch_type) {
  case LCD_CH_COM:
    if (index < LCD_COM_NUM && dev->level_table->com[index][level] != NULL) {
      dev->level_table->com[index][level](); // 调用COM电平设置函数
    }
    break;

  case LCD_CH_SEG:
    if (index < LCD_SEG_NUM && dev->level_table->seg[index][level] != NULL) {
      dev->level_table->seg[index][level](); // 调用SEG电平设置函数
    }
    break;

  default:
    break;
  }
}

/**
 * @brief LCD刷新（定时器中断回调函数）
 */
static void lcd_refresh(lcd_device_t *dev) {
  // 入参&状态校验
  if (dev == NULL || !dev->is_init || dev->set_level == NULL)
    return;

  // 计算当前扫描的COM编号和极性
  uint8_t current_com_idx = dev->current_com / 2; // 当前驱动的COM编号(0~5)
  uint8_t com_polarity = dev->current_com % 2;    // COM极性：0=FULLV，1=0V

  // 边界保护
  if (current_com_idx >= LCD_COM_NUM) {
    current_com_idx = LCD_COM_NUM - 1;
  }

  // 配置当前选通COM的电平
  dev->set_level(dev, LCD_CH_COM, current_com_idx, (com_polarity == 0) ? LCD_VOLT_FULLV : LCD_VOLT_0V);

  // 配置非选通COM的电平（1/3 Bias核心逻辑）
  for (uint8_t i = 0; i < LCD_COM_NUM; i++) {
    if (i == current_com_idx)
      continue;

    if (com_polarity == 0) {
      dev->set_level(dev, LCD_CH_COM, i, LCD_VOLT_2_3V);
    } else {
      dev->set_level(dev, LCD_CH_COM, i, LCD_VOLT_1_3V);
    }
  }

  // 配置SEG电平（根据像素状态）
  for (uint8_t i = 0; i < LCD_SEG_NUM; i++) {
    if (dev->disp_buf[current_com_idx][i] == LCD_PIXEL_ON) {
      // 点亮像素：电压差=3.3V
      dev->set_level(dev, LCD_CH_SEG, i, (com_polarity == 0) ? LCD_VOLT_0V : LCD_VOLT_FULLV);
    } else {
      // 熄灭像素：电压差=1.1V
      dev->set_level(dev, LCD_CH_SEG, i, (com_polarity == 0) ? LCD_VOLT_2_3V : LCD_VOLT_1_3V);
    }
  }

  // 更新下一次扫描的COM索引（循环）
  dev->current_com = (dev->current_com + 1U) % (LCD_COM_NUM * 2);
}
// static void lcd_refresh(lcd_device_t *dev) {
//   // 入参&状态校验
//   if (dev == NULL || !dev->is_init || dev->set_level == NULL)
//     return;

//   // 计算当前扫描的COM编号和极性
//   uint8_t current_com_idx = dev->current_com / 2;
//   uint8_t com_polarity = dev->current_com % 2;

//   // 边界保护
//   if (current_com_idx >= LCD_COM_NUM) {
//     current_com_idx = LCD_COM_NUM - 1;
//   }

//   // === 预计算电压等级（加入帧反转） ===
//   uint8_t com_active, com_inactive;
//   uint8_t seg_on, seg_off;

//   // 根据帧反转标志翻转极性
//   uint8_t effective_polarity = com_polarity ^ dev->frame_invert;

//   if (effective_polarity == 0) {
//     com_active = LCD_VOLT_FULLV;
//     com_inactive = LCD_VOLT_2_3V;
//     seg_on = LCD_VOLT_0V;
//     seg_off = LCD_VOLT_2_3V;
//   } else {
//     com_active = LCD_VOLT_0V;
//     com_inactive = LCD_VOLT_1_3V;
//     seg_on = LCD_VOLT_FULLV;
//     seg_off = LCD_VOLT_1_3V;
//   }

//   // === 配置COM电平 ===
//   dev->set_level(dev, LCD_CH_COM, current_com_idx, com_active);

//   for (uint8_t i = 0; i < LCD_COM_NUM; i++) {
//     if (i != current_com_idx) {
//       dev->set_level(dev, LCD_CH_COM, i, com_inactive);
//     }
//   }

//   // === 配置SEG电平 ===
//   uint8_t *row_buf = dev->disp_buf[current_com_idx];

//   for (uint8_t i = 0; i < LCD_SEG_NUM; i++) {
//     dev->set_level(dev, LCD_CH_SEG, i, (row_buf[i] == LCD_PIXEL_ON) ? seg_on : seg_off);
//   }

//   // 更新下一次扫描的COM索引
//   dev->current_com = (dev->current_com + 1U) % (LCD_COM_NUM * 2);

//   // === 帧反转：每完成一帧扫描，翻转一次 ===
//   if (dev->current_com == 0) {
//     dev->frame_invert ^= 0x01;
//   }
// }
// -------------------------- 通用LCD操作函数 --------------------------
/**
 * @brief 清空指定位置的段码（仅清空指定slot，保留其他位置）
 * @param slot 位置编号(1~8)
 */
void lcd_clear_slot(lcd_device_t *dev, uint8_t slot) {
  if (slot < 1 || slot > 8)
    return;

  // 每个slot对应的段坐标表
  uint16_t slots_segs[8][7] = {
      {
          LCD_SLOT_1_A,
          LCD_SLOT_1_B,
          LCD_SLOT_1_C,
          LCD_SLOT_1_D,
          LCD_SLOT_1_E,
          LCD_SLOT_1_F,
          LCD_SLOT_1_G,
      },
      {
          LCD_SLOT_2_A,
          LCD_SLOT_2_B,
          LCD_SLOT_2_C,
          LCD_SLOT_2_D,
          LCD_SLOT_2_E,
          LCD_SLOT_2_F,
          LCD_SLOT_2_G,
      },
      {
          LCD_SLOT_3_A,
          LCD_SLOT_3_B,
          LCD_SLOT_3_C,
          LCD_SLOT_3_D,
          LCD_SLOT_3_E,
          LCD_SLOT_3_F,
          LCD_SLOT_3_G,
      },
      {
          LCD_SLOT_4_A,
          LCD_SLOT_4_B,
          LCD_SLOT_4_C,
          LCD_SLOT_4_D,
          LCD_SLOT_4_E,
          LCD_SLOT_4_F,
          LCD_SLOT_4_G,
      },
      {
          LCD_SLOT_5_A,
          LCD_SLOT_5_B,
          LCD_SLOT_5_C,
          LCD_SLOT_5_D,
          LCD_SLOT_5_E,
          LCD_SLOT_5_F,
          LCD_SLOT_5_G,
      },
      {
          LCD_SLOT_6_A,
          LCD_SLOT_6_B,
          LCD_SLOT_6_C,
          LCD_SLOT_6_D,
          LCD_SLOT_6_E,
          LCD_SLOT_6_F,
          LCD_SLOT_6_G,
      },
      {
          LCD_SLOT_7_A,
          LCD_SLOT_7_B,
          LCD_SLOT_7_C,
          LCD_SLOT_7_D,
          LCD_SLOT_7_E,
          LCD_SLOT_7_F,
          LCD_SLOT_7_G,
      },
      {
          LCD_SLOT_8_A,
          LCD_SLOT_8_B,
          LCD_SLOT_8_C,
          LCD_SLOT_8_D,
          LCD_SLOT_8_E,
          LCD_SLOT_8_F,
          LCD_SLOT_8_G,
      },
  };

  // 清空指定slot的所有段
  for (int i = 0; i < 7; i++) {
    uint8_t com = GET_COM(slots_segs[slot - 1][i]);
    uint8_t seg = GET_SEG(slots_segs[slot - 1][i]);
    if (com < LCD_COM_MAX && seg < LCD_SEG_MAX) {
      //   lcd_buf[com][seg] = LCD_PIXEL_OFF;
      dev->disp_buf[com][seg] = LCD_PIXEL_OFF; // 同步到设备缓存
    }
  }
}

/**
 * @brief 清空整个LCD缓存（所有段熄灭）
 */
void lcd_clear_buf(lcd_device_t *dev) {
  //   memset(lcd_buf, 0, sizeof(lcd_buf));
  lcd_clear(dev); // 同步清空设备缓存
}

/**
 * @brief 设置单个段码的点亮/熄灭状态
 * @param com COM行(0~5)
 * @param seg SEG列(0~11)
 * @param state 0=熄灭，1=点亮
 */
void lcd_set_segment(lcd_device_t *dev, uint8_t com, uint8_t seg, uint8_t state) {
  if (com < LCD_COM_MAX && seg < LCD_SEG_MAX) {
    // lcd_buf[com][seg] = (state ? LCD_PIXEL_ON : LCD_PIXEL_OFF);
    lcd_set_pixel(dev, com, seg, (lcd_pixel_state_e)(state ? LCD_PIXEL_ON : LCD_PIXEL_OFF));
  }
}

/**
 * @brief 在指定位置显示0~9的数字
 * @param slot 显示位置(1~7)
 * @param num 要显示的数字(0~9)
 */
void lcd_display_number(lcd_device_t *dev, uint8_t slot, uint8_t num) {
  // 入参合法性检查
  if (num > 9 || slot > 8)
    return;

  // 先清空该位置原有显示
  lcd_clear_slot(dev, slot);

  // 数字段码表：0=熄灭，1=点亮 (段顺序：A,B,C,D,E,F,G)
  const uint8_t num_segs[10][7] = {
      {1, 1, 1, 1, 1, 1, 0}, // 0
      {0, 1, 1, 0, 0, 0, 0}, // 1
      {1, 1, 0, 1, 1, 0, 1}, // 2
      {1, 1, 1, 1, 0, 0, 1}, // 3
      {0, 1, 1, 0, 0, 1, 1}, // 4
      {1, 0, 1, 1, 0, 1, 1}, // 5
      {1, 0, 1, 1, 1, 1, 1}, // 6
      {1, 1, 1, 0, 0, 0, 0}, // 7
      {1, 1, 1, 1, 1, 1, 1}, // 8
      {1, 1, 1, 1, 0, 1, 1}  // 9
  };

  // 根据位置设置对应段码
  switch (slot) {
  case 1:
    lcd_set_segment(dev, GET_COM(LCD_SLOT_1_A), GET_SEG(LCD_SLOT_1_A), num_segs[num][0]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_1_B), GET_SEG(LCD_SLOT_1_B), num_segs[num][1]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_1_C), GET_SEG(LCD_SLOT_1_C), num_segs[num][2]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_1_D), GET_SEG(LCD_SLOT_1_D), num_segs[num][3]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_1_E), GET_SEG(LCD_SLOT_1_E), num_segs[num][4]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_1_F), GET_SEG(LCD_SLOT_1_F), num_segs[num][5]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_1_G), GET_SEG(LCD_SLOT_1_G), num_segs[num][6]);
    break;

  case 2:
    lcd_set_segment(dev, GET_COM(LCD_SLOT_2_A), GET_SEG(LCD_SLOT_2_A), num_segs[num][0]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_2_B), GET_SEG(LCD_SLOT_2_B), num_segs[num][1]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_2_C), GET_SEG(LCD_SLOT_2_C), num_segs[num][2]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_2_D), GET_SEG(LCD_SLOT_2_D), num_segs[num][3]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_2_E), GET_SEG(LCD_SLOT_2_E), num_segs[num][4]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_2_F), GET_SEG(LCD_SLOT_2_F), num_segs[num][5]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_2_G), GET_SEG(LCD_SLOT_2_G), num_segs[num][6]);
    break;

  case 3:
    lcd_set_segment(dev, GET_COM(LCD_SLOT_3_A), GET_SEG(LCD_SLOT_3_A), num_segs[num][0]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_3_B), GET_SEG(LCD_SLOT_3_B), num_segs[num][1]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_3_C), GET_SEG(LCD_SLOT_3_C), num_segs[num][2]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_3_D), GET_SEG(LCD_SLOT_3_D), num_segs[num][3]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_3_E), GET_SEG(LCD_SLOT_3_E), num_segs[num][4]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_3_F), GET_SEG(LCD_SLOT_3_F), num_segs[num][5]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_3_G), GET_SEG(LCD_SLOT_3_G), num_segs[num][6]);
    break;

  case 4:
    lcd_set_segment(dev, GET_COM(LCD_SLOT_4_A), GET_SEG(LCD_SLOT_4_A), num_segs[num][0]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_4_B), GET_SEG(LCD_SLOT_4_B), num_segs[num][1]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_4_C), GET_SEG(LCD_SLOT_4_C), num_segs[num][2]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_4_D), GET_SEG(LCD_SLOT_4_D), num_segs[num][3]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_4_E), GET_SEG(LCD_SLOT_4_E), num_segs[num][4]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_4_F), GET_SEG(LCD_SLOT_4_F), num_segs[num][5]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_4_G), GET_SEG(LCD_SLOT_4_G), num_segs[num][6]);
    break;

  case 5:
    lcd_set_segment(dev, GET_COM(LCD_SLOT_5_A), GET_SEG(LCD_SLOT_5_A), num_segs[num][0]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_5_B), GET_SEG(LCD_SLOT_5_B), num_segs[num][1]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_5_C), GET_SEG(LCD_SLOT_5_C), num_segs[num][2]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_5_D), GET_SEG(LCD_SLOT_5_D), num_segs[num][3]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_5_E), GET_SEG(LCD_SLOT_5_E), num_segs[num][4]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_5_F), GET_SEG(LCD_SLOT_5_F), num_segs[num][5]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_5_G), GET_SEG(LCD_SLOT_5_G), num_segs[num][6]);
    break;

  case 6:
    lcd_set_segment(dev, GET_COM(LCD_SLOT_6_A), GET_SEG(LCD_SLOT_6_A), num_segs[num][0]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_6_B), GET_SEG(LCD_SLOT_6_B), num_segs[num][1]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_6_C), GET_SEG(LCD_SLOT_6_C), num_segs[num][2]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_6_D), GET_SEG(LCD_SLOT_6_D), num_segs[num][3]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_6_E), GET_SEG(LCD_SLOT_6_E), num_segs[num][4]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_6_F), GET_SEG(LCD_SLOT_6_F), num_segs[num][5]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_6_G), GET_SEG(LCD_SLOT_6_G), num_segs[num][6]);
    break;

  case 7:
    lcd_set_segment(dev, GET_COM(LCD_SLOT_7_A), GET_SEG(LCD_SLOT_7_A), num_segs[num][0]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_7_B), GET_SEG(LCD_SLOT_7_B), num_segs[num][1]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_7_C), GET_SEG(LCD_SLOT_7_C), num_segs[num][2]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_7_D), GET_SEG(LCD_SLOT_7_D), num_segs[num][3]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_7_E), GET_SEG(LCD_SLOT_7_E), num_segs[num][4]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_7_F), GET_SEG(LCD_SLOT_7_F), num_segs[num][5]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_7_G), GET_SEG(LCD_SLOT_7_G), num_segs[num][6]);
    break;
  case 8:
    lcd_set_segment(dev, GET_COM(LCD_SLOT_8_A), GET_SEG(LCD_SLOT_8_A), num_segs[num][0]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_8_B), GET_SEG(LCD_SLOT_8_B), num_segs[num][1]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_8_C), GET_SEG(LCD_SLOT_8_C), num_segs[num][2]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_8_D), GET_SEG(LCD_SLOT_8_D), num_segs[num][3]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_8_E), GET_SEG(LCD_SLOT_8_E), num_segs[num][4]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_8_F), GET_SEG(LCD_SLOT_8_F), num_segs[num][5]);
    lcd_set_segment(dev, GET_COM(LCD_SLOT_8_G), GET_SEG(LCD_SLOT_8_G), num_segs[num][6]);
    break;

  default:
    break;
  }
}

// 显示符号函数（完整switch全量生成）
void lcd_display_symble(lcd_device_t *dev, lcd_symble_slot_e symble_slot) {
  switch (symble_slot) {
  case LCD_SYMBLE_SLOT_P1:
    lcd_set_segment(dev, GET_COM(LCD_SYMBLE_P1), GET_SEG(LCD_SYMBLE_P1), 1);
    break;

  case LCD_SYMBLE_SLOT_P2:
    lcd_set_segment(dev, GET_COM(LCD_SYMBLE_P2), GET_SEG(LCD_SYMBLE_P2), 1);
    break;

  case LCD_SYMBLE_SLOT_P3:
    lcd_set_segment(dev, GET_COM(LCD_SYMBLE_P3), GET_SEG(LCD_SYMBLE_P3), 1);
    break;

  case LCD_SYMBLE_SLOT_P4:
    lcd_set_segment(dev, GET_COM(LCD_SYMBLE_P4), GET_SEG(LCD_SYMBLE_P4), 1);
    break;

  case LCD_SYMBLE_SLOT_P5:
    lcd_set_segment(dev, GET_COM(LCD_SYMBLE_P5), GET_SEG(LCD_SYMBLE_P5), 1);
    break;

  case LCD_SYMBLE_SLOT_P6:
    lcd_set_segment(dev, GET_COM(LCD_SYMBLE_P6), GET_SEG(LCD_SYMBLE_P6), 1);
    break;

  case LCD_SYMBLE_SLOT_P7:
    lcd_set_segment(dev, GET_COM(LCD_SYMBLE_P7), GET_SEG(LCD_SYMBLE_P7), 1);
    break;

  case LCD_SYMBLE_SLOT_S1:
    lcd_set_segment(dev, GET_COM(LCD_SYMBLE_S1), GET_SEG(LCD_SYMBLE_S1), 1);
    break;

  case LCD_SYMBLE_SLOT_S2:
    lcd_set_segment(dev, GET_COM(LCD_SYMBLE_S2), GET_SEG(LCD_SYMBLE_S2), 1);
    break;

  case LCD_SYMBLE_SLOT_S3:
    lcd_set_segment(dev, GET_COM(LCD_SYMBLE_S3), GET_SEG(LCD_SYMBLE_S3), 1);
    break;

  case LCD_SYMBLE_SLOT_S4:
    lcd_set_segment(dev, GET_COM(LCD_SYMBLE_S4), GET_SEG(LCD_SYMBLE_S4), 1);
    break;

  case LCD_SYMBLE_SLOT_S5:
    lcd_set_segment(dev, GET_COM(LCD_SYMBLE_S5), GET_SEG(LCD_SYMBLE_S5), 1);
    break;

  case LCD_SYMBLE_SLOT_S6:
    lcd_set_segment(dev, GET_COM(LCD_SYMBLE_S6), GET_SEG(LCD_SYMBLE_S6), 1);
    break;

  case LCD_SYMBLE_SLOT_S7:
    lcd_set_segment(dev, GET_COM(LCD_SYMBLE_S7), GET_SEG(LCD_SYMBLE_S7), 1);
    break;

  case LCD_SYMBLE_SLOT_S8:
    lcd_set_segment(dev, GET_COM(LCD_SYMBLE_S8), GET_SEG(LCD_SYMBLE_S8), 1);
    break;

  case LCD_SYMBLE_SLOT_S9:
    lcd_set_segment(dev, GET_COM(LCD_SYMBLE_S9), GET_SEG(LCD_SYMBLE_S9), 1);
    break;

  default:
    break;
  }
}

/**
 * @brief LCD初始化
 */
static void lcd_init(lcd_device_t *dev) {
  if (dev == NULL)
    return;

  // 初始化状态重置
  dev->is_init = false;
  dev->current_com = 0U;

  dev->init(dev);

  // 标记初始化完成
  dev->is_init = true;
  dev->frame_invert = 0;

  // 清屏
  lcd_clear(dev);
  // memset(dev->disp_buf,1,sizeof(dev->disp_buf));

  // lcd_display_number(dev, 1, 8);
  // lcd_display_number(dev, 2, 8);
  // lcd_display_number(dev, 3, 8);
  // lcd_display_number(dev, 4, 8);
  // lcd_display_number(dev, 5, 8);
  // lcd_display_number(dev, 6, 8);
  // lcd_display_number(dev, 7, 8);
}

typedef enum {
  TOU_BEGIN = 0,
  TOU_TOTAL,  // 总电量
  TOU_SHARP,  // 尖时段（电价最高）
  TOU_PEAK,   // 峰时段（电价较高）
  TOU_FLAT,   // 平时段（电价中等）
  TOU_TROUGH, // 谷时段（电价最低）
} lcd_tou_state_e;

static uint32_t lcd_cycle = 0;
static lcd_tou_state_e lcd_tou_state = TOU_BEGIN;

static uint8_t lcd_get_display_count(uint32_t value) {
  uint8_t result = 4;
  if (value > 10000) {
    result += 1;
  }
  if (value > 100000) {
    result += 1;
  }
  if (value > 1000000) {
    result += 1;
  }
  if (value > 10000000) {
    result += 1;
  }
  return result;
}

uint32_t lcd_pow10(uint8_t n) {
  uint32_t result = 1;
  for (uint8_t i = 0; i < n; i++) {
    result *= 10;
  }
  return result;
}

static void lcd_fresh(void) {
  if (lcd_cycle == 0) {
    // 清空
    uint32_t energy;
    lcd_clear(&lcd_dev);
    lcd_display_symble(&lcd_dev, LCD_SYMBLE_SLOT_P4);
    lcd_display_symble(&lcd_dev, LCD_SYMBLE_SLOT_S9);
    switch (lcd_tou_state) {

    case TOU_BEGIN: {
      lcd_tou_state = TOU_TOTAL;
      lcd_display_symble(&lcd_dev, LCD_SYMBLE_SLOT_S1);
      energy = (uint32_t)(g_rn8209_instance.processed_pwr_data[METER_CHIP_TARIFF_TOTAL].forward_active_energy * 1000.0);
    } break;
    case TOU_TOTAL: {
      lcd_tou_state = TOU_SHARP;
      lcd_display_symble(&lcd_dev, LCD_SYMBLE_SLOT_S3);
      energy = (uint32_t)(g_rn8209_instance.processed_pwr_data[METER_CHIP_TARIFF_TIP].forward_active_energy * 1000.0);
    } break;
    case TOU_SHARP: {
      lcd_tou_state = TOU_PEAK;
      lcd_display_symble(&lcd_dev, LCD_SYMBLE_SLOT_S4);
      energy = (uint32_t)(g_rn8209_instance.processed_pwr_data[METER_CHIP_TARIFF_PEAK].forward_active_energy * 1000.0);
    } break;
    case TOU_PEAK: {
      lcd_tou_state = TOU_FLAT;
      lcd_display_symble(&lcd_dev, LCD_SYMBLE_SLOT_S5);
      energy = (uint32_t)(g_rn8209_instance.processed_pwr_data[METER_CHIP_TARIFF_FLAT].forward_active_energy * 1000.0);
    } break;
    case TOU_FLAT: {
      lcd_tou_state = TOU_TROUGH;
      lcd_display_symble(&lcd_dev, LCD_SYMBLE_SLOT_S6);
      energy = (uint32_t)(g_rn8209_instance.processed_pwr_data[METER_CHIP_TARIFF_VALLEY].forward_active_energy * 1000.0);
    } break;
    case TOU_TROUGH: {
      lcd_tou_state = TOU_TOTAL;
      lcd_display_symble(&lcd_dev, LCD_SYMBLE_SLOT_S1);
      energy = (uint32_t)(g_rn8209_instance.processed_pwr_data[METER_CHIP_TARIFF_TOTAL].forward_active_energy * 1000.0);
    } break;
    }
    // display
    uint8_t display_count = lcd_get_display_count(energy);
    for (uint8_t i = 0; i < display_count; i++) {
      // uint32_t divisor = lcd_pow10(display_count - 1 - i);

      uint8_t digit = energy % 10;
      energy /= 10;
      lcd_display_number(&lcd_dev, 8 - i, digit);
    }
  }
  lcd_cycle++;
  if (lcd_cycle >= 10000) {
    // 大概5秒
    lcd_cycle = 0;
  }
  lcd_dev.refresh(&lcd_dev);
}

static TimerParameterTypdef lcd_param = {
    BSP_TIMER_1,
    25000, // 20ns × 25000 = 5ms
    lcd_fresh,
};

void lcd_hw_init() {
  lcd_init(&lcd_dev);
  TimerOpen((TimerParameterTypdef *)&lcd_param);
  TimerWrite(lcd_param.Timer, TIMER_SET_START);
}

void ushell_setfreq(int argc, char *argv[]) {
  if (argc != 2) {
    pu_printf("参数数量错误");
  }

  int timer_waittime = atoi(argv[1]);
  if (timer_waittime <= 0) {
    return;
  }

  lcd_param.TimerSlot20ns = timer_waittime * 1000;
  pu_printf("定时器休眠时间调整为 %ld", lcd_param.TimerSlot20ns);
  TimerClose(lcd_param.Timer);
  TimerOpen((TimerParameterTypdef *)&lcd_param);
  TimerWrite(lcd_param.Timer, TIMER_SET_START);
}
