[其他ST产品] STM32L053驱动段码液晶

[复制链接]
 楼主| 梵蒂冈是神uy 发表于 2022-12-25 14:07 | 显示全部楼层 |阅读模式
断码液晶驱动原理:
1. 第一步:

段码液晶屏最重要的参数:占空比、工作电压、偏压比。这三个参数都是非常重要的,都必须要满足。

2. 第二步:

驱动的方式:我们根据 LCD 的驱动原理可以知道,LCD的像素点上面只能够加上 AC的电压,LCD显示器的对比度则是由 COM脚上的电压值减去 SEG 脚上的电压值来决定,当这个电压差在大于 LCD 饱和电压时就能够打开像素点,小于 LCD 时就能关闭像素点了,LCD 型的MCU 已经由内建的 LCD 驱动电路自动产生出LCD驱动信号了,因此只需要 I/O 口能仿真输出该驱动的信号,就能够完成 LCD 的驱动了。
  段码液晶屏主要是有两种引脚,COM和SEG,和数码管比较像,但是,压差必须要是交替变化的,例:第一时刻是正向的3V,那么第二时刻就必须要是反向的3V,注意一点,如果你给段码液晶屏通直流电,那么不用多久这个屏幕就会报废,所以千万要注意。
  我们以1/4D,1/2B为例子
  在COM的输出较高的时候,如果要屏幕亮,那么SEG就要输出低,那么在COM输出低的时候,SEG就要输出高了,保证COM和SEG的压差大于1/2B工作电压就可以正常显示了







————————————————
版权声明:本文为CSDN博主「火红色祥云」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43739167/article/details/107978485

 楼主| 梵蒂冈是神uy 发表于 2022-12-25 14:08 | 显示全部楼层
控制方式
在LCD的参数中有几个重要参数,duty,bias,driver voltage。duty表示扫描周期一般为与com引脚个数有关,bias表示偏压,偏压1/3表示把VDD分三份,电压差越大越亮,bias与com引脚个数也有关系,因为com脚越多周期越短,为了保持亮度一致,需要提高选通和不选通的电压差。需要分更多份电压。。。
 楼主| 梵蒂冈是神uy 发表于 2022-12-25 14:09 | 显示全部楼层
LCD屏幕引脚定义:
(注:上面的蓝色数字是硬件连接的段)
4446163a7e8e6ee420.png
 楼主| 梵蒂冈是神uy 发表于 2022-12-25 14:11 | 显示全部楼层
LCD驱动编写注意事项:

显示冲突
HAL_LCD_Write(LCD_HandleTypeDef *hlcd, uint32_t RAMRegisterIndex, uint32_t RAMRegisterMask, uint32_t Data)函数中的RAMRegisterMask掩码是为了解决LCD显示冲突的问题,32位中只有该位为0则会对该位进行操作。
举个栗子:
如果掩码为:0xFFFFFFFE,也就是对段0进行操作
更新显示后,
然后再对掩码为:0xFFFFFFFD,也就是要对段1进行操作,
更新显示后,则对上一次的显示无影响
但是如果第二次的掩码为:0xFFFFFFFC,则第二次操作就是对段0和段1两位进行更新
如果第一次让段0显示,第二次让段0不显示,则在掩码为0xFFFFFFFC的第二次更新后会覆盖第一次的操作
简单来说,如果要想把所有的段分开操作,后续操作不影响上次操作,那么在更新LCD显示的时候就一定要只对要操作的段就行操作,也就是掩码 要取正确。
 楼主| 梵蒂冈是神uy 发表于 2022-12-25 14:12 | 显示全部楼层
初始化问题
hlcd.Init.VoltageSource = LCD_VOLTAGESOURCE_INTERNAL;
hlcd.Init.Contrast = LCD_CONTRASTLEVEL_5;
CubeMX生成驱动的时候,网上说电压源要选择外部电压源,选择内部电压源可能会初始化卡死,
那是因为hlcd.Init.Contrast = LCD_CONTRASTLEVEL_5;的值设置的小了,不足够驱动LCD显示,只要把这个值变大,内部电压源足够驱动LCD时就可以选择内部电压源了。
 楼主| 梵蒂冈是神uy 发表于 2022-12-25 14:12 | 显示全部楼层
CubeMX生成源码注意事项:
5396263a7e9be6a088.png
 楼主| 梵蒂冈是神uy 发表于 2022-12-25 14:13 | 显示全部楼层
LCD的时钟源和RTC公用同一个时钟源,所以初始化时要把RTC时钟激活,如下图
8135363a7ea0e20230.png
 楼主| 梵蒂冈是神uy 发表于 2022-12-25 14:51 | 显示全部楼层
按照ST官网的例程配置的LCD如下图:
9519963a7f302f30e4.png
 楼主| 梵蒂冈是神uy 发表于 2022-12-25 14:52 | 显示全部楼层
源码版本V.01
内容:显示华氏度,摄氏度、图标等(部分掩码计算错误,导致部分图标显示冲突,V1.2已解决显示冲突的问题)
  1. extern LCD_HandleTypeDef hlcd;

  2. typedef enum
  3. {
  4.     Temp_C,
  5.     Temp_F,
  6.     Buzzer,
  7.     Body,
  8.     WuTi,
  9.     BLUE,
  10.         **
  11. }ICON;

  12. //COM口定义
  13. #define COM1                                LCD_RAM_REGISTER4
  14. #define COM2                                LCD_RAM_REGISTER2
  15. #define COM3                                LCD_RAM_REGISTER0
  16. #define COM4                                LCD_RAM_REGISTER6
  17. //段定义
  18. #define SEG_Temp_C          15
  19. #define SEG_Temp_F          15
  20. #define SEG_Buzzer          15
  21. #define SEG_Body            21
  22. #define SEG_WuTi            4
  23. #define SEG_BLUE            21
  24. #define SEG_Battery1        21
  25. #define SEG_Battery2        21
  26. #define SEG_Battery3        10
  27. #define SEG_Battery         15
  28. #define SEG_**            5
  29. #define SEG_B               0
  30. #define SEG_S               2
  31. #define SEG_G               10
  32. #define SEG_P               12
  33. //COM口定义
  34. #define COM_Temp_C          COM4
  35. #define COM_Temp_F          COM3
  36. #define COM_Buzzer          COM2
  37. #define COM_Body            COM2
  38. #define COM_WuTi            COM1
  39. #define COM_BLUE            COM1
  40. #define COM_Battery1        COM4
  41. #define COM_Battery2        COM3
  42. #define COM_Battery3        COM1
  43. #define COM_Battery         COM1
  44. #define COM_**            COM1
  45. //掩码定义
  46. #define Mask_Temp_C         0xFFFF7FFF
  47. #define Mask_Temp_F         0xFFFF7FFF
  48. #define Mask_Buzzer         0xFFFF7FFF
  49. #define Mask_Body           0xFFDFFFFF
  50. #define Mask_WuTi           0xFFFFFFEF
  51. #define Mask_BLUE           0xFFDFFFFF
  52. #define Mask_Battery1       0xFFDFFFFF
  53. #define Mask_Battery2       0xFFDFFFFF
  54. #define Mask_Battery3       0xFFFFFBFF
  55. #define Mask_Battery        0xFFFF7FFF
  56. #define Mask_**           0xFFFFFFEF
  57. #define Mask_B              0xFFFFFFFC
  58. #define Mask_S              0xFFFFFFF3
  59. #define Mask_G              0xFFFFF2FF
  60. #define Mask_P              0xFFFF5FFF
  61. #define Mask_Point          0xFFFFEFFF

  62. void lcd_temp_set(uint32_t temp);
  63. void lcd_uint_set(uint32_t unit);
  64. void lcd_bat_set(uint32_t bat_level);
  65. void lcd_voice_set(uint32_t voice);

  66. void lcd_temp_state_set(uint8_t en);
  67. void lcd_unit_state_set(uint8_t en);
  68. void lcd_bat_state_set(uint8_t en);
  69. void lcd_voice_state_set(uint8_t en);

  70. void MX_LCD_Init(void);
  71. void HAL_LCD_MspInit(LCD_HandleTypeDef* lcdHandle);
  72. void Display_Temp_C(float tempC);
  73. void Display_Temp_F(float tempF);
  74. void Display_Power(uint8_t grade);
  75. void Diaplay_Icon(ICON icon,uint8_t status);
  76. void Disp_BW(uint8_t num);
 楼主| 梵蒂冈是神uy 发表于 2022-12-25 14:52 | 显示全部楼层
/*
LCD_RAM_REGISTER0——>COM3
LCD_RAM_REGISTER2——>COM2
LCD_RAM_REGISTER4——>COM1
LCD_RAM_REGISTER6——>COM4
*/

/* USER CODE BEGIN 0 */




/* USER CODE END 0 */

LCD_HandleTypeDef hlcd;

/* LCD init function */
void MX_LCD_Init(void)
{

  hlcd.Instance = LCD;
  hlcd.Init.Prescaler = LCD_PRESCALER_2;
  hlcd.Init.Divider = LCD_DIVIDER_31;
  hlcd.Init.Duty = LCD_DUTY_1_4;
  hlcd.Init.Bias = LCD_BIAS_1_3;
  hlcd.Init.VoltageSource = LCD_VOLTAGESOURCE_INTERNAL;
  hlcd.Init.Contrast = LCD_CONTRASTLEVEL_5;
  hlcd.Init.DeadTime = LCD_DEADTIME_2;
  hlcd.Init.PulseOnDuration = LCD_PULSEONDURATION_7;
  hlcd.Init.HighDrive = LCD_HIGHDRIVE_0;
  hlcd.Init.BlinkMode = LCD_BLINKMODE_OFF;
  hlcd.Init.BlinkFrequency = LCD_BLINKFREQUENCY_DIV8;
  hlcd.Init.MuxSegment = LCD_MUXSEGMENT_DISABLE;
  if (HAL_LCD_Init(&hlcd) != HAL_OK)
  {
    Error_Handler();
  }

}

void HAL_LCD_MspInit(LCD_HandleTypeDef* lcdHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(lcdHandle->Instance==LCD)
  {
  /* USER CODE BEGIN LCD_MspInit 0 */

  /* USER CODE END LCD_MspInit 0 */
    /* LCD clock enable */
    __HAL_RCC_LCD_CLK_ENABLE();
  
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**LCD GPIO Configuration   
    PC3     ------> LCD_SEG21
    PA1     ------> LCD_SEG0
    PA2     ------> LCD_SEG1
    PA3     ------> LCD_SEG2
    PA6     ------> LCD_SEG3
    PA7     ------> LCD_SEG4
    PC4     ------> LCD_SEG22
    PB0     ------> LCD_SEG5
    PB1     ------> LCD_SEG6
    PB10     ------> LCD_SEG10
    PB11     ------> LCD_SEG11
    PB12     ------> LCD_SEG12
    PB14     ------> LCD_SEG14
    PB15     ------> LCD_SEG15
    PA8     ------> LCD_COM0
    PA9     ------> LCD_COM1
    PA10     ------> LCD_COM2
    PB9     ------> LCD_COM3
    */
    GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF1_LCD;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6
                          |GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF1_LCD;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11
                          |GPIO_PIN_12|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF1_LCD;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /* USER CODE BEGIN LCD_MspInit 1 */

  /* USER CODE END LCD_MspInit 1 */
  }
}

void HAL_LCD_MspDeInit(LCD_HandleTypeDef* lcdHandle)
{

  if(lcdHandle->Instance==LCD)
  {
  /* USER CODE BEGIN LCD_MspDeInit 0 */

  /* USER CODE END LCD_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_LCD_CLK_DISABLE();
  
    /**LCD GPIO Configuration   
    PC3     ------> LCD_SEG21
    PA1     ------> LCD_SEG0
    PA2     ------> LCD_SEG1
    PA3     ------> LCD_SEG2
    PA6     ------> LCD_SEG3
    PA7     ------> LCD_SEG4
    PC4     ------> LCD_SEG22
    PB0     ------> LCD_SEG5
    PB1     ------> LCD_SEG6
    PB10     ------> LCD_SEG10
    PB11     ------> LCD_SEG11
    PB12     ------> LCD_SEG12
    PB14     ------> LCD_SEG14
    PB15     ------> LCD_SEG15
    PA8     ------> LCD_COM0
    PA9     ------> LCD_COM1
    PA10     ------> LCD_COM2
    PB9     ------> LCD_COM3
    */
    HAL_GPIO_DeInit(GPIOC, GPIO_PIN_3|GPIO_PIN_4);

    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6
                          |GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10);

    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11
                          |GPIO_PIN_12|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_9);

  /* USER CODE BEGIN LCD_MspDeInit 1 */

  /* USER CODE END LCD_MspDeInit 1 */
  }
}

/* USER CODE BEGIN 1 */


/*******************************************************************************
* Function Name   : ConvertNum
* Description     : 查找输入参数对应的字符编码
* Inputs          : InputNum--显示字符
* Outputs         : None
* Return          : None
* Notes           : None
*******************************************************************************/
const uint16_t mask[4]={0xF000,0x0F00,0x00F0,0x000F};
const uint8_t offset[4]={12,8,4,0};
const uint16_t Num_Map[10]={0x2323,0x0220,0x2132,0x2232,0x0231,0x2213,0x2313,0x0223,0x2333,0x2233};

//以0为例分析
void ConvertNum(uint8_t buff[4],int InputNum)
{
uint16_t Num, tmp = 0;
uint8_t i;

if((InputNum>=0)&&(InputNum<=9))//InputNum=0
  {
        Num=Num_Map[InputNum];//Num=0x2323
  }
  else
  {
    Num=0;//Num=0x0000;
  }
  for(i = 0;i < 4; i++)
  {
    tmp = Num & mask[i];                                                                        //tmp=0x2000,tmp=0x0300,tmp=0x0020,tmp=0x0003
    buff[i] = (uint8_t)(tmp >> offset[i]);//buff[0]=0x02,buff[1]=0x03,buff[0]=0x02,buff[0]=0x03
  }
}
/*******************************************************************************
* Function Name   : Disp_BW(uint8_t num)
* Description     : 显示百位数字
* Inputs          : 数字
* Outputs         : None
* Return          : None
* Notes           : None
*******************************************************************************/
void Disp_BW(uint8_t num)
{
        uint8_t num_buf[4];
        ConvertNum(num_buf,num);
   
        HAL_LCD_Write(&hlcd, COM1, Mask_B, num_buf[0]<<SEG_B);//0x0001 0000 0000 0000
        HAL_LCD_Write(&hlcd, COM2, Mask_B, num_buf[1]<<SEG_B);//0x0100 1000 0000 1000
        HAL_LCD_Write(&hlcd, COM3, Mask_B, num_buf[2]<<SEG_B);//0x0100 1000 0000 1000
        HAL_LCD_Write(&hlcd, COM4, Mask_B, num_buf[3]<<SEG_B);//0x0000 0000 0000 0000
       
        HAL_LCD_UpdateDisplayRequest(&hlcd);
}


/*******************************************************************************
* Function Name   : Display_Temp_C(float temp)
* Description     : 显示小数类型温度,摄氏度
* Inputs          : 温度
* Outputs         : None
* Return          : None
* Notes           : None
*******************************************************************************/
void Display_Temp_C(float tempC)
{
    /*
    1.提取temp的每一位
    2.把每一位转换为数组
    3.将每一位显示出来
    #define SEG_S     3
    #define SEG_G     5
    #define SEG_P     7
    RAM0写入的数据为:Buff_S[0]<<SEG_S|Buff_G[0]<<SEG_G|Buff_P[0]<<SEG_P
    RAM2写入的数据为:Buff_S[1]<<SEG_S|Buff_G[1]<<SEG_G|Buff_P[1]<<SEG_P
    RAM4写入的数据为:Buff_S[2]<<SEG_S|Buff_G[2]<<SEG_G|Buff_P[2]<<SEG_P
    RAM6写入的数据为:Buff_S[3]<<SEG_S|Buff_G[3]<<SEG_G|Buff_P[3]<<SEG_P
    */
    uint8_t Buff_S[4],Buff_G[4],Buff_P[4];
    int Temp=0;
    uint8_t Shi=0,Ge=0,Point=0;
                uint8_t Num_For_Point=0;//再次处理十分位数据所用
    Temp=tempC*10;         //将带一位小数的float类型的温度转换为三位数的int型变量
   
    Point=Temp%10;                          //去温度的小数位
    Ge=Temp%100/10;                         //去温度的个位
    Shi=Temp/100;                               //取温度的十位
   
    ConvertNum(Buff_P,Point);
    ConvertNum(Buff_G,Ge);
    ConvertNum(Buff_S,Shi);         //将三位数字转化为可以显示的数组
   
                /*由于十分位的两个段并不是连续的,所以在此再次对十分位要显示的数据进行处理*/
                for(Num_For_Point=0;Num_For_Point<4;Num_For_Point++)
                {
                        if(Buff_P[Num_For_Point]==0x03)
                        {
                                Buff_P[Num_For_Point]=0x05;
                        }
                        else if(Buff_P[Num_For_Point]==0x02)
                        {
                                Buff_P[Num_For_Point]=0x04;
                        }
                }
                /**************************************************************************/
               
    HAL_LCD_Clear(&hlcd);
               
    //显示整数
    HAL_LCD_Write(&hlcd, COM1, Mask_S&Mask_G&Mask_P, Buff_S[0]<<SEG_S|Buff_G[0]<<SEG_G|Buff_P[0]<<SEG_P|1<<12);
    HAL_LCD_Write(&hlcd, COM2, Mask_S&Mask_G&Mask_P, Buff_S[1]<<SEG_S|Buff_G[1]<<SEG_G|Buff_P[1]<<SEG_P);
    HAL_LCD_Write(&hlcd, COM3, Mask_S&Mask_G&Mask_P, Buff_S[2]<<SEG_S|Buff_G[2]<<SEG_G|Buff_P[2]<<SEG_P);
    HAL_LCD_Write(&hlcd, COM4, Mask_S&Mask_G&Mask_P, Buff_S[3]<<SEG_S|Buff_G[3]<<SEG_G|Buff_P[3]<<SEG_P);
               
    HAL_LCD_UpdateDisplayRequest(&hlcd);
}

/*******************************************************************************
* Function Name   : Display_Temp_F(float temp)
* Description     : 显示小数类型温度,华氏度
* Inputs          : 摄氏度温度
* Outputs         : None
* Return          : None
* Notes           : 摄氏度 = (华氏度 - 32°F) ÷ 1.8
*******************************************************************************/

void Display_Temp_F(float tempF)
{
    /*
    1.提取temp的每一位
    2.把每一位转换为数组
    3.将每一位显示出来
    #define SEG_S     3
    #define SEG_G     5
    #define SEG_P     7
    RAM0写入的数据为:Buff_S[0]<<SEG_S|Buff_G[0]<<SEG_G|Buff_P[0]<<SEG_P
    RAM2写入的数据为:Buff_S[1]<<SEG_S|Buff_G[1]<<SEG_G|Buff_P[1]<<SEG_P
    RAM4写入的数据为:Buff_S[2]<<SEG_S|Buff_G[2]<<SEG_G|Buff_P[2]<<SEG_P
    RAM6写入的数据为:Buff_S[3]<<SEG_S|Buff_G[3]<<SEG_G|Buff_P[3]<<SEG_P
    */
    uint8_t Buff_S[4],Buff_G[4],Buff_P[4];
    int TempF=0;
    uint8_t Bai=0,Shi=0,Ge=0,Point=0;
                uint8_t Num_For_Point=0;//再次处理十分位数据所用

    TempF=((int)(tempF*18)+320);         //将带一位小数的float类型的温度转换为三位数的int型变量
       
                if(TempF>1000||TempF==1000)
                {
                        Point=TempF%10;                          //去温度的小数位
                        Ge=TempF%100/10;                         //去温度的个位
                        Shi=TempF%1000/100;
                        Bai=TempF/1000;                       //取温度的最高位
                }
                else
                {
                        Point=TempF%10;                          //去温度的小数位
                        Ge=TempF%100/10;                         //去温度的个位
                        Shi=TempF/100;                               //取温度的十位
                }
   
   
    ConvertNum(Buff_P,Point);
    ConvertNum(Buff_G,Ge);
    ConvertNum(Buff_S,Shi);         //将三位数字转化为可以显示的数组
   
                /*由于十分位的两个段并不是连续的,所以在此再次对十分位要显示的数据进行处理*/
                for(Num_For_Point=0;Num_For_Point<4;Num_For_Point++)
                {
                        if(Buff_P[Num_For_Point]==0x03)
                        {
                                Buff_P[Num_For_Point]=0x05;
                        }
                        else if(Buff_P[Num_For_Point]==0x02)
                        {
                                Buff_P[Num_For_Point]=0x04;
                        }
                }
                /**************************************************************************/
               
    HAL_LCD_Clear(&hlcd);
               
    //显示整数
    HAL_LCD_Write(&hlcd, COM1, Mask_S&Mask_G&Mask_P, Buff_S[0]<<SEG_S|Buff_G[0]<<SEG_G|Buff_P[0]<<SEG_P|1<<12);
    HAL_LCD_Write(&hlcd, COM2, Mask_S&Mask_G&Mask_P, Buff_S[1]<<SEG_S|Buff_G[1]<<SEG_G|Buff_P[1]<<SEG_P);
    HAL_LCD_Write(&hlcd, COM3, Mask_S&Mask_G&Mask_P, Buff_S[2]<<SEG_S|Buff_G[2]<<SEG_G|Buff_P[2]<<SEG_P);
    HAL_LCD_Write(&hlcd, COM4, Mask_S&Mask_G&Mask_P, Buff_S[3]<<SEG_S|Buff_G[3]<<SEG_G|Buff_P[3]<<SEG_P);
               
    HAL_LCD_UpdateDisplayRequest(&hlcd);
                if(Bai)
                        Disp_BW(Bai);
}

/*******************************************************************************
* Function Name   : Diaplay_Icon(ICON icon)
* Description     : 显示图标
* Inputs          : 枚举类型ICON中的图标名称
* Outputs         : None
* Return          : None
* Notes           : None
*******************************************************************************/
void Diaplay_Icon(ICON icon,uint8_t status)
{
    if(icon==Temp_C)
    {
        HAL_LCD_Write(&hlcd, COM_Temp_C, Mask_Temp_C, status<<SEG_Temp_C);//0x0000 0000 0000 0011
        HAL_LCD_UpdateDisplayRequest(&hlcd);
    }
    else if(icon==Temp_F)
    {
        HAL_LCD_Write(&hlcd, COM_Temp_F, Mask_Temp_F, status<<SEG_Temp_F);//0x0000 0000 0000 0011
        HAL_LCD_UpdateDisplayRequest(&hlcd);
    }
    else if(icon==Buzzer)
    {
        HAL_LCD_Write(&hlcd, COM_Buzzer, Mask_Buzzer, status<<SEG_Buzzer);//0x0000 0000 0000 0011
        HAL_LCD_UpdateDisplayRequest(&hlcd);
    }
    else if(icon==Body)
    {
        HAL_LCD_Write(&hlcd, COM_Body, Mask_Body, status<<SEG_Body);//0x0000 0000 0000 0011
        HAL_LCD_UpdateDisplayRequest(&hlcd);
    }
    else if(icon==WuTi)
    {
        HAL_LCD_Write(&hlcd, COM_WuTi, Mask_WuTi, status<<SEG_WuTi);//0x0000 0000 0000 0011
        HAL_LCD_UpdateDisplayRequest(&hlcd);
    }
    else if(icon==BLUE)
    {
        HAL_LCD_Write(&hlcd, COM_BLUE, Mask_BLUE, status<<SEG_BLUE);//0x0000 0000 0000 0011
        HAL_LCD_UpdateDisplayRequest(&hlcd);
    }
                else if(icon==**)
    {
        HAL_LCD_Write(&hlcd, COM_**, Mask_**, status<<SEG_**);//0x0000 0000 0000 0011
        HAL_LCD_UpdateDisplayRequest(&hlcd);
    }
}

/*******************************************************************************
* Function Name   : Diaplay_Icon(ICON icon)
* Description     : 显示图标
* Inputs          : 电量等级:0/1/2/3
* Outputs         : None
* Return          : None
* Notes           : None
*******************************************************************************/
void Display_Power(uint8_t grade)
{
    switch(grade)
    {
        case 0:
            HAL_LCD_Write(&hlcd, COM_Battery, Mask_Battery, 1<<SEG_Battery);//0x0000 0000 0000 0011
            HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 0<<SEG_Battery1);//0x0000 0000 0000 0011
            HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 0<<SEG_Battery2);//0x0000 0000 0000 0011
            HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 0<<SEG_Battery3);//0x0000 0000 0000 0011
            HAL_LCD_UpdateDisplayRequest(&hlcd);
            break;
        case 1:
                                                HAL_LCD_Write(&hlcd, COM_Battery, Mask_Battery, 1<<SEG_Battery);//0x0000 0000 0000 0011
            HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 1<<SEG_Battery1);//0x0000 0000 0000 0011
            HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 0<<SEG_Battery2);//0x0000 0000 0000 0011
            HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 0<<SEG_Battery3);//0x0000 0000 0000 0011
            HAL_LCD_UpdateDisplayRequest(&hlcd);
            break;
        case 2:
                                                HAL_LCD_Write(&hlcd, COM_Battery, Mask_Battery, 1<<SEG_Battery);//0x0000 0000 0000 0011
            HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 1<<SEG_Battery1);//0x0000 0000 0000 0011
            HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 1<<SEG_Battery2);//0x0000 0000 0000 0011
            HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 0<<SEG_Battery3);//0x0000 0000 0000 0011
            HAL_LCD_UpdateDisplayRequest(&hlcd);
            break;
        case 3:
                                                HAL_LCD_Write(&hlcd, COM_Battery, Mask_Battery, 1<<SEG_Battery);//0x0000 0000 0000 0011
            HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 1<<SEG_Battery1);//0x0000 0000 0000 0011
            HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 1<<SEG_Battery2);//0x0000 0000 0000 0011
            HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 1<<SEG_Battery3);//0x0000 0000 0000 0011
            HAL_LCD_UpdateDisplayRequest(&hlcd);
            break;
        default:
            break;
    }
}
 楼主| 梵蒂冈是神uy 发表于 2022-12-25 14:53 | 显示全部楼层
  1. /*
  2. LCD_RAM_REGISTER0——>COM3
  3. LCD_RAM_REGISTER2——>COM2
  4. LCD_RAM_REGISTER4——>COM1
  5. LCD_RAM_REGISTER6——>COM4
  6. */

  7. /* USER CODE BEGIN 0 */




  8. /* USER CODE END 0 */

  9. LCD_HandleTypeDef hlcd;

  10. /* LCD init function */
  11. void MX_LCD_Init(void)
  12. {

  13.   hlcd.Instance = LCD;
  14.   hlcd.Init.Prescaler = LCD_PRESCALER_2;
  15.   hlcd.Init.Divider = LCD_DIVIDER_31;
  16.   hlcd.Init.Duty = LCD_DUTY_1_4;
  17.   hlcd.Init.Bias = LCD_BIAS_1_3;
  18.   hlcd.Init.VoltageSource = LCD_VOLTAGESOURCE_INTERNAL;
  19.   hlcd.Init.Contrast = LCD_CONTRASTLEVEL_5;
  20.   hlcd.Init.DeadTime = LCD_DEADTIME_2;
  21.   hlcd.Init.PulseOnDuration = LCD_PULSEONDURATION_7;
  22.   hlcd.Init.HighDrive = LCD_HIGHDRIVE_0;
  23.   hlcd.Init.BlinkMode = LCD_BLINKMODE_OFF;
  24.   hlcd.Init.BlinkFrequency = LCD_BLINKFREQUENCY_DIV8;
  25.   hlcd.Init.MuxSegment = LCD_MUXSEGMENT_DISABLE;
  26.   if (HAL_LCD_Init(&hlcd) != HAL_OK)
  27.   {
  28.     Error_Handler();
  29.   }

  30. }

  31. void HAL_LCD_MspInit(LCD_HandleTypeDef* lcdHandle)
  32. {

  33.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  34.   if(lcdHandle->Instance==LCD)
  35.   {
  36.   /* USER CODE BEGIN LCD_MspInit 0 */

  37.   /* USER CODE END LCD_MspInit 0 */
  38.     /* LCD clock enable */
  39.     __HAL_RCC_LCD_CLK_ENABLE();
  40.   
  41.     __HAL_RCC_GPIOC_CLK_ENABLE();
  42.     __HAL_RCC_GPIOA_CLK_ENABLE();
  43.     __HAL_RCC_GPIOB_CLK_ENABLE();
  44.     /**LCD GPIO Configuration   
  45.     PC3     ------> LCD_SEG21
  46.     PA1     ------> LCD_SEG0
  47.     PA2     ------> LCD_SEG1
  48.     PA3     ------> LCD_SEG2
  49.     PA6     ------> LCD_SEG3
  50.     PA7     ------> LCD_SEG4
  51.     PC4     ------> LCD_SEG22
  52.     PB0     ------> LCD_SEG5
  53.     PB1     ------> LCD_SEG6
  54.     PB10     ------> LCD_SEG10
  55.     PB11     ------> LCD_SEG11
  56.     PB12     ------> LCD_SEG12
  57.     PB14     ------> LCD_SEG14
  58.     PB15     ------> LCD_SEG15
  59.     PA8     ------> LCD_COM0
  60.     PA9     ------> LCD_COM1
  61.     PA10     ------> LCD_COM2
  62.     PB9     ------> LCD_COM3
  63.     */
  64.     GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4;
  65.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  66.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  67.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  68.     GPIO_InitStruct.Alternate = GPIO_AF1_LCD;
  69.     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  70.     GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6
  71.                           |GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
  72.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  73.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  74.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  75.     GPIO_InitStruct.Alternate = GPIO_AF1_LCD;
  76.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  77.     GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11
  78.                           |GPIO_PIN_12|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_9;
  79.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  80.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  81.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  82.     GPIO_InitStruct.Alternate = GPIO_AF1_LCD;
  83.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  84.   /* USER CODE BEGIN LCD_MspInit 1 */

  85.   /* USER CODE END LCD_MspInit 1 */
  86.   }
  87. }

  88. void HAL_LCD_MspDeInit(LCD_HandleTypeDef* lcdHandle)
  89. {

  90.   if(lcdHandle->Instance==LCD)
  91.   {
  92.   /* USER CODE BEGIN LCD_MspDeInit 0 */

  93.   /* USER CODE END LCD_MspDeInit 0 */
  94.     /* Peripheral clock disable */
  95.     __HAL_RCC_LCD_CLK_DISABLE();
  96.   
  97.     /**LCD GPIO Configuration   
  98.     PC3     ------> LCD_SEG21
  99.     PA1     ------> LCD_SEG0
  100.     PA2     ------> LCD_SEG1
  101.     PA3     ------> LCD_SEG2
  102.     PA6     ------> LCD_SEG3
  103.     PA7     ------> LCD_SEG4
  104.     PC4     ------> LCD_SEG22
  105.     PB0     ------> LCD_SEG5
  106.     PB1     ------> LCD_SEG6
  107.     PB10     ------> LCD_SEG10
  108.     PB11     ------> LCD_SEG11
  109.     PB12     ------> LCD_SEG12
  110.     PB14     ------> LCD_SEG14
  111.     PB15     ------> LCD_SEG15
  112.     PA8     ------> LCD_COM0
  113.     PA9     ------> LCD_COM1
  114.     PA10     ------> LCD_COM2
  115.     PB9     ------> LCD_COM3
  116.     */
  117.     HAL_GPIO_DeInit(GPIOC, GPIO_PIN_3|GPIO_PIN_4);

  118.     HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6
  119.                           |GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10);

  120.     HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11
  121.                           |GPIO_PIN_12|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_9);

  122.   /* USER CODE BEGIN LCD_MspDeInit 1 */

  123.   /* USER CODE END LCD_MspDeInit 1 */
  124.   }
  125. }

  126. /* USER CODE BEGIN 1 */


  127. /*******************************************************************************
  128. * Function Name   : ConvertNum
  129. * Description     : 查找输入参数对应的字符编码
  130. * Inputs          : InputNum--显示字符
  131. * Outputs         : None
  132. * Return          : None
  133. * Notes           : None
  134. *******************************************************************************/
  135. const uint16_t mask[4]={0xF000,0x0F00,0x00F0,0x000F};
  136. const uint8_t offset[4]={12,8,4,0};
  137. const uint16_t Num_Map[10]={0x2323,0x0220,0x2132,0x2232,0x0231,0x2213,0x2313,0x0223,0x2333,0x2233};

  138. //以0为例分析
  139. void ConvertNum(uint8_t buff[4],int InputNum)
  140. {
  141. uint16_t Num, tmp = 0;
  142. uint8_t i;

  143. if((InputNum>=0)&&(InputNum<=9))//InputNum=0
  144.   {
  145.         Num=Num_Map[InputNum];//Num=0x2323
  146.   }
  147.   else
  148.   {
  149.     Num=0;//Num=0x0000;
  150.   }
  151.   for(i = 0;i < 4; i++)
  152.   {
  153.     tmp = Num & mask[i];                                                                        //tmp=0x2000,tmp=0x0300,tmp=0x0020,tmp=0x0003
  154.     buff[i] = (uint8_t)(tmp >> offset[i]);//buff[0]=0x02,buff[1]=0x03,buff[0]=0x02,buff[0]=0x03
  155.   }
  156. }
  157. /*******************************************************************************
  158. * Function Name   : Disp_BW(uint8_t num)
  159. * Description     : 显示百位数字
  160. * Inputs          : 数字
  161. * Outputs         : None
  162. * Return          : None
  163. * Notes           : None
  164. *******************************************************************************/
  165. void Disp_BW(uint8_t num)
  166. {
  167.         uint8_t num_buf[4];
  168.         ConvertNum(num_buf,num);
  169.    
  170.         HAL_LCD_Write(&hlcd, COM1, Mask_B, num_buf[0]<<SEG_B);//0x0001 0000 0000 0000
  171.         HAL_LCD_Write(&hlcd, COM2, Mask_B, num_buf[1]<<SEG_B);//0x0100 1000 0000 1000
  172.         HAL_LCD_Write(&hlcd, COM3, Mask_B, num_buf[2]<<SEG_B);//0x0100 1000 0000 1000
  173.         HAL_LCD_Write(&hlcd, COM4, Mask_B, num_buf[3]<<SEG_B);//0x0000 0000 0000 0000
  174.        
  175.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  176. }


  177. /*******************************************************************************
  178. * Function Name   : Display_Temp_C(float temp)
  179. * Description     : 显示小数类型温度,摄氏度
  180. * Inputs          : 温度
  181. * Outputs         : None
  182. * Return          : None
  183. * Notes           : None
  184. *******************************************************************************/
  185. void Display_Temp_C(float tempC)
  186. {
  187.     /*
  188.     1.提取temp的每一位
  189.     2.把每一位转换为数组
  190.     3.将每一位显示出来
  191.     #define SEG_S     3
  192.     #define SEG_G     5
  193.     #define SEG_P     7
  194.     RAM0写入的数据为:Buff_S[0]<<SEG_S|Buff_G[0]<<SEG_G|Buff_P[0]<<SEG_P
  195.     RAM2写入的数据为:Buff_S[1]<<SEG_S|Buff_G[1]<<SEG_G|Buff_P[1]<<SEG_P
  196.     RAM4写入的数据为:Buff_S[2]<<SEG_S|Buff_G[2]<<SEG_G|Buff_P[2]<<SEG_P
  197.     RAM6写入的数据为:Buff_S[3]<<SEG_S|Buff_G[3]<<SEG_G|Buff_P[3]<<SEG_P
  198.     */
  199.     uint8_t Buff_S[4],Buff_G[4],Buff_P[4];
  200.     int Temp=0;
  201.     uint8_t Shi=0,Ge=0,Point=0;
  202.                 uint8_t Num_For_Point=0;//再次处理十分位数据所用
  203.     Temp=tempC*10;         //将带一位小数的float类型的温度转换为三位数的int型变量
  204.    
  205.     Point=Temp%10;                          //去温度的小数位
  206.     Ge=Temp%100/10;                         //去温度的个位
  207.     Shi=Temp/100;                               //取温度的十位
  208.    
  209.     ConvertNum(Buff_P,Point);
  210.     ConvertNum(Buff_G,Ge);
  211.     ConvertNum(Buff_S,Shi);         //将三位数字转化为可以显示的数组
  212.    
  213.                 /*由于十分位的两个段并不是连续的,所以在此再次对十分位要显示的数据进行处理*/
  214.                 for(Num_For_Point=0;Num_For_Point<4;Num_For_Point++)
  215.                 {
  216.                         if(Buff_P[Num_For_Point]==0x03)
  217.                         {
  218.                                 Buff_P[Num_For_Point]=0x05;
  219.                         }
  220.                         else if(Buff_P[Num_For_Point]==0x02)
  221.                         {
  222.                                 Buff_P[Num_For_Point]=0x04;
  223.                         }
  224.                 }
  225.                 /**************************************************************************/
  226.                
  227.     HAL_LCD_Clear(&hlcd);
  228.                
  229.     //显示整数
  230.     HAL_LCD_Write(&hlcd, COM1, Mask_S&Mask_G&Mask_P, Buff_S[0]<<SEG_S|Buff_G[0]<<SEG_G|Buff_P[0]<<SEG_P|1<<12);
  231.     HAL_LCD_Write(&hlcd, COM2, Mask_S&Mask_G&Mask_P, Buff_S[1]<<SEG_S|Buff_G[1]<<SEG_G|Buff_P[1]<<SEG_P);
  232.     HAL_LCD_Write(&hlcd, COM3, Mask_S&Mask_G&Mask_P, Buff_S[2]<<SEG_S|Buff_G[2]<<SEG_G|Buff_P[2]<<SEG_P);
  233.     HAL_LCD_Write(&hlcd, COM4, Mask_S&Mask_G&Mask_P, Buff_S[3]<<SEG_S|Buff_G[3]<<SEG_G|Buff_P[3]<<SEG_P);
  234.                
  235.     HAL_LCD_UpdateDisplayRequest(&hlcd);
  236. }

  237. /*******************************************************************************
  238. * Function Name   : Display_Temp_F(float temp)
  239. * Description     : 显示小数类型温度,华氏度
  240. * Inputs          : 摄氏度温度
  241. * Outputs         : None
  242. * Return          : None
  243. * Notes           : 摄氏度 = (华氏度 - 32°F) ÷ 1.8
  244. *******************************************************************************/

  245. void Display_Temp_F(float tempF)
  246. {
  247.     /*
  248.     1.提取temp的每一位
  249.     2.把每一位转换为数组
  250.     3.将每一位显示出来
  251.     #define SEG_S     3
  252.     #define SEG_G     5
  253.     #define SEG_P     7
  254.     RAM0写入的数据为:Buff_S[0]<<SEG_S|Buff_G[0]<<SEG_G|Buff_P[0]<<SEG_P
  255.     RAM2写入的数据为:Buff_S[1]<<SEG_S|Buff_G[1]<<SEG_G|Buff_P[1]<<SEG_P
  256.     RAM4写入的数据为:Buff_S[2]<<SEG_S|Buff_G[2]<<SEG_G|Buff_P[2]<<SEG_P
  257.     RAM6写入的数据为:Buff_S[3]<<SEG_S|Buff_G[3]<<SEG_G|Buff_P[3]<<SEG_P
  258.     */
  259.     uint8_t Buff_S[4],Buff_G[4],Buff_P[4];
  260.     int TempF=0;
  261.     uint8_t Bai=0,Shi=0,Ge=0,Point=0;
  262.                 uint8_t Num_For_Point=0;//再次处理十分位数据所用

  263.     TempF=((int)(tempF*18)+320);         //将带一位小数的float类型的温度转换为三位数的int型变量
  264.        
  265.                 if(TempF>1000||TempF==1000)
  266.                 {
  267.                         Point=TempF%10;                          //去温度的小数位
  268.                         Ge=TempF%100/10;                         //去温度的个位
  269.                         Shi=TempF%1000/100;
  270.                         Bai=TempF/1000;                       //取温度的最高位
  271.                 }
  272.                 else
  273.                 {
  274.                         Point=TempF%10;                          //去温度的小数位
  275.                         Ge=TempF%100/10;                         //去温度的个位
  276.                         Shi=TempF/100;                               //取温度的十位
  277.                 }
  278.    
  279.    
  280.     ConvertNum(Buff_P,Point);
  281.     ConvertNum(Buff_G,Ge);
  282.     ConvertNum(Buff_S,Shi);         //将三位数字转化为可以显示的数组
  283.    
  284.                 /*由于十分位的两个段并不是连续的,所以在此再次对十分位要显示的数据进行处理*/
  285.                 for(Num_For_Point=0;Num_For_Point<4;Num_For_Point++)
  286.                 {
  287.                         if(Buff_P[Num_For_Point]==0x03)
  288.                         {
  289.                                 Buff_P[Num_For_Point]=0x05;
  290.                         }
  291.                         else if(Buff_P[Num_For_Point]==0x02)
  292.                         {
  293.                                 Buff_P[Num_For_Point]=0x04;
  294.                         }
  295.                 }
  296.                 /**************************************************************************/
  297.                
  298.     HAL_LCD_Clear(&hlcd);
  299.                
  300.     //显示整数
  301.     HAL_LCD_Write(&hlcd, COM1, Mask_S&Mask_G&Mask_P, Buff_S[0]<<SEG_S|Buff_G[0]<<SEG_G|Buff_P[0]<<SEG_P|1<<12);
  302.     HAL_LCD_Write(&hlcd, COM2, Mask_S&Mask_G&Mask_P, Buff_S[1]<<SEG_S|Buff_G[1]<<SEG_G|Buff_P[1]<<SEG_P);
  303.     HAL_LCD_Write(&hlcd, COM3, Mask_S&Mask_G&Mask_P, Buff_S[2]<<SEG_S|Buff_G[2]<<SEG_G|Buff_P[2]<<SEG_P);
  304.     HAL_LCD_Write(&hlcd, COM4, Mask_S&Mask_G&Mask_P, Buff_S[3]<<SEG_S|Buff_G[3]<<SEG_G|Buff_P[3]<<SEG_P);
  305.                
  306.     HAL_LCD_UpdateDisplayRequest(&hlcd);
  307.                 if(Bai)
  308.                         Disp_BW(Bai);
  309. }

  310. /*******************************************************************************
  311. * Function Name   : Diaplay_Icon(ICON icon)
  312. * Description     : 显示图标
  313. * Inputs          : 枚举类型ICON中的图标名称
  314. * Outputs         : None
  315. * Return          : None
  316. * Notes           : None
  317. *******************************************************************************/
  318. void Diaplay_Icon(ICON icon,uint8_t status)
  319. {
  320.     if(icon==Temp_C)
  321.     {
  322.         HAL_LCD_Write(&hlcd, COM_Temp_C, Mask_Temp_C, status<<SEG_Temp_C);//0x0000 0000 0000 0011
  323.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  324.     }
  325.     else if(icon==Temp_F)
  326.     {
  327.         HAL_LCD_Write(&hlcd, COM_Temp_F, Mask_Temp_F, status<<SEG_Temp_F);//0x0000 0000 0000 0011
  328.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  329.     }
  330.     else if(icon==Buzzer)
  331.     {
  332.         HAL_LCD_Write(&hlcd, COM_Buzzer, Mask_Buzzer, status<<SEG_Buzzer);//0x0000 0000 0000 0011
  333.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  334.     }
  335.     else if(icon==Body)
  336.     {
  337.         HAL_LCD_Write(&hlcd, COM_Body, Mask_Body, status<<SEG_Body);//0x0000 0000 0000 0011
  338.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  339.     }
  340.     else if(icon==WuTi)
  341.     {
  342.         HAL_LCD_Write(&hlcd, COM_WuTi, Mask_WuTi, status<<SEG_WuTi);//0x0000 0000 0000 0011
  343.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  344.     }
  345.     else if(icon==BLUE)
  346.     {
  347.         HAL_LCD_Write(&hlcd, COM_BLUE, Mask_BLUE, status<<SEG_BLUE);//0x0000 0000 0000 0011
  348.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  349.     }
  350.                 else if(icon==**)
  351.     {
  352.         HAL_LCD_Write(&hlcd, COM_**, Mask_**, status<<SEG_**);//0x0000 0000 0000 0011
  353.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  354.     }
  355. }

  356. /*******************************************************************************
  357. * Function Name   : Diaplay_Icon(ICON icon)
  358. * Description     : 显示图标
  359. * Inputs          : 电量等级:0/1/2/3
  360. * Outputs         : None
  361. * Return          : None
  362. * Notes           : None
  363. *******************************************************************************/
  364. void Display_Power(uint8_t grade)
  365. {
  366.     switch(grade)
  367.     {
  368.         case 0:
  369.             HAL_LCD_Write(&hlcd, COM_Battery, Mask_Battery, 1<<SEG_Battery);//0x0000 0000 0000 0011
  370.             HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 0<<SEG_Battery1);//0x0000 0000 0000 0011
  371.             HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 0<<SEG_Battery2);//0x0000 0000 0000 0011
  372.             HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 0<<SEG_Battery3);//0x0000 0000 0000 0011
  373.             HAL_LCD_UpdateDisplayRequest(&hlcd);
  374.             break;
  375.         case 1:
  376.                                                 HAL_LCD_Write(&hlcd, COM_Battery, Mask_Battery, 1<<SEG_Battery);//0x0000 0000 0000 0011
  377.             HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 1<<SEG_Battery1);//0x0000 0000 0000 0011
  378.             HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 0<<SEG_Battery2);//0x0000 0000 0000 0011
  379.             HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 0<<SEG_Battery3);//0x0000 0000 0000 0011
  380.             HAL_LCD_UpdateDisplayRequest(&hlcd);
  381.             break;
  382.         case 2:
  383.                                                 HAL_LCD_Write(&hlcd, COM_Battery, Mask_Battery, 1<<SEG_Battery);//0x0000 0000 0000 0011
  384.             HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 1<<SEG_Battery1);//0x0000 0000 0000 0011
  385.             HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 1<<SEG_Battery2);//0x0000 0000 0000 0011
  386.             HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 0<<SEG_Battery3);//0x0000 0000 0000 0011
  387.             HAL_LCD_UpdateDisplayRequest(&hlcd);
  388.             break;
  389.         case 3:
  390.                                                 HAL_LCD_Write(&hlcd, COM_Battery, Mask_Battery, 1<<SEG_Battery);//0x0000 0000 0000 0011
  391.             HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 1<<SEG_Battery1);//0x0000 0000 0000 0011
  392.             HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 1<<SEG_Battery2);//0x0000 0000 0000 0011
  393.             HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 1<<SEG_Battery3);//0x0000 0000 0000 0011
  394.             HAL_LCD_UpdateDisplayRequest(&hlcd);
  395.             break;
  396.         default:
  397.             break;
  398.     }
  399. }
 楼主| 梵蒂冈是神uy 发表于 2022-12-25 14:54 | 显示全部楼层
改版完善:(V1.2)
修改内容:

去掉摄氏度、华氏度显示函数,改为显示数字
修改计算错误的掩码(错误的掩码将导致显示冲突,也就是后显示的会把之前要显示的内容覆盖掉)
加入显示LO、HI、‘----字样
 楼主| 梵蒂冈是神uy 发表于 2022-12-25 14:55 | 显示全部楼层
  1. /*
  2. LCD_RAM_REGISTER0——>COM3
  3. LCD_RAM_REGISTER2——>COM2
  4. LCD_RAM_REGISTER4——>COM1
  5. LCD_RAM_REGISTER6——>COM4
  6. */

  7. /* USER CODE BEGIN 0 */
  8. static void ConvertNum(uint8_t buff[4],int InputNum);
  9. static void Disp_PW(uint8_t num);
  10. static void Disp_GW(uint8_t num);
  11. static void Disp_SW(uint8_t num);
  12. static void Disp_BW(uint8_t num);
  13. /* USER CODE END 0 */

  14. LCD_HandleTypeDef hlcd;
  15. /* LCD init function */
  16. void MX_LCD_Init(void)
  17. {

  18.   hlcd.Instance = LCD;
  19.   hlcd.Init.Prescaler = LCD_PRESCALER_2;
  20.   hlcd.Init.Divider = LCD_DIVIDER_31;
  21.   hlcd.Init.Duty = LCD_DUTY_1_4;
  22.   hlcd.Init.Bias = LCD_BIAS_1_3;
  23.   hlcd.Init.VoltageSource = LCD_VOLTAGESOURCE_INTERNAL;
  24.   hlcd.Init.Contrast = LCD_CONTRASTLEVEL_5;
  25.   hlcd.Init.DeadTime = LCD_DEADTIME_2;
  26.   hlcd.Init.PulseOnDuration = LCD_PULSEONDURATION_7;
  27.   hlcd.Init.HighDrive = LCD_HIGHDRIVE_0;
  28.   hlcd.Init.BlinkMode = LCD_BLINKMODE_OFF;
  29.   hlcd.Init.BlinkFrequency = LCD_BLINKFREQUENCY_DIV8;
  30.   hlcd.Init.MuxSegment = LCD_MUXSEGMENT_DISABLE;
  31.   if (HAL_LCD_Init(&hlcd) != HAL_OK)
  32.   {
  33.     Error_Handler();
  34.   }

  35. }

  36. void HAL_LCD_MspInit(LCD_HandleTypeDef* lcdHandle)
  37. {

  38.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  39.   if(lcdHandle->Instance==LCD)
  40.   {
  41.   /* USER CODE BEGIN LCD_MspInit 0 */

  42.   /* USER CODE END LCD_MspInit 0 */
  43.     /* LCD clock enable */
  44.     __HAL_RCC_LCD_CLK_ENABLE();
  45.   
  46.     __HAL_RCC_GPIOC_CLK_ENABLE();
  47.     __HAL_RCC_GPIOA_CLK_ENABLE();
  48.     __HAL_RCC_GPIOB_CLK_ENABLE();
  49.     /**LCD GPIO Configuration   
  50.     PC3     ------> LCD_SEG21
  51.     PA1     ------> LCD_SEG0
  52.     PA2     ------> LCD_SEG1
  53.     PA3     ------> LCD_SEG2
  54.     PA6     ------> LCD_SEG3
  55.     PA7     ------> LCD_SEG4
  56.     PC4     ------> LCD_SEG22
  57.     PB0     ------> LCD_SEG5
  58.     PB1     ------> LCD_SEG6
  59.     PB10     ------> LCD_SEG10
  60.     PB11     ------> LCD_SEG11
  61.     PB12     ------> LCD_SEG12
  62.     PB14     ------> LCD_SEG14
  63.     PB15     ------> LCD_SEG15
  64.     PA8     ------> LCD_COM0
  65.     PA9     ------> LCD_COM1
  66.     PA10     ------> LCD_COM2
  67.     PB9     ------> LCD_COM3
  68.     */
  69.     GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4;
  70.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  71.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  72.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  73.     GPIO_InitStruct.Alternate = GPIO_AF1_LCD;
  74.     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  75.     GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6
  76.                           |GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
  77.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  78.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  79.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  80.     GPIO_InitStruct.Alternate = GPIO_AF1_LCD;
  81.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  82.     GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11
  83.                           |GPIO_PIN_12|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_9;
  84.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  85.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  86.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  87.     GPIO_InitStruct.Alternate = GPIO_AF1_LCD;
  88.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  89.   /* USER CODE BEGIN LCD_MspInit 1 */

  90.   /* USER CODE END LCD_MspInit 1 */
  91.   }
  92. }

  93. void HAL_LCD_MspDeInit(LCD_HandleTypeDef* lcdHandle)
  94. {

  95.   if(lcdHandle->Instance==LCD)
  96.   {
  97.   /* USER CODE BEGIN LCD_MspDeInit 0 */

  98.   /* USER CODE END LCD_MspDeInit 0 */
  99.     /* Peripheral clock disable */
  100.     __HAL_RCC_LCD_CLK_DISABLE();
  101.   
  102.     /**LCD GPIO Configuration   
  103.     PC3     ------> LCD_SEG21
  104.     PA1     ------> LCD_SEG0
  105.     PA2     ------> LCD_SEG1
  106.     PA3     ------> LCD_SEG2
  107.     PA6     ------> LCD_SEG3
  108.     PA7     ------> LCD_SEG4
  109.     PC4     ------> LCD_SEG22
  110.     PB0     ------> LCD_SEG5
  111.     PB1     ------> LCD_SEG6
  112.     PB10     ------> LCD_SEG10
  113.     PB11     ------> LCD_SEG11
  114.     PB12     ------> LCD_SEG12
  115.     PB14     ------> LCD_SEG14
  116.     PB15     ------> LCD_SEG15
  117.     PA8     ------> LCD_COM0
  118.     PA9     ------> LCD_COM1
  119.     PA10     ------> LCD_COM2
  120.     PB9     ------> LCD_COM3
  121.     */
  122.     HAL_GPIO_DeInit(GPIOC, GPIO_PIN_3|GPIO_PIN_4);

  123.     HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6
  124.                           |GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10);

  125.     HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11
  126.                           |GPIO_PIN_12|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_9);

  127.   /* USER CODE BEGIN LCD_MspDeInit 1 */

  128.   /* USER CODE END LCD_MspDeInit 1 */
  129.   }
  130. }

  131. /* USER CODE BEGIN 1 */

  132. const uint16_t mask[4]={0xF000,0x0F00,0x00F0,0x000F};
  133. const uint8_t offset[4]={12,8,4,0};
  134. const uint16_t Num_Map[15]={0x2323,0x0220,0x2132,0x2232,0x0231,0x2213,0x2313,0x0222,0x2333,0x2233,0x0010,0x0331,0x0200,0x2101,0x2310};
  135. //                           0      1      2      3      4      5      6      7      8      9      ----   H
  136. /*******************************************************************************
  137. * Function Name   : ConvertNum
  138. * Description     : 查找输入参数对应的字符编码
  139. * Inputs          : InputNum--显示字符
  140. * Outputs         : None
  141. * Return          : None
  142. * Notes           : None
  143. *******************************************************************************/

  144. static void ConvertNum(uint8_t buff[4],int InputNum)
  145. {
  146. uint16_t Num, tmp = 0;
  147. uint8_t i;

  148. if((InputNum>=0)&&(InputNum<=15))
  149.   {
  150.         Num=Num_Map[InputNum];
  151.   }
  152.   else
  153.   {
  154.     Num=0;
  155.   }
  156.   for(i = 0;i < 4; i++)
  157.   {
  158.     tmp = Num & mask[i];                                    
  159.     buff[i] = (uint8_t)(tmp >> offset[i]);
  160.   }
  161. }
  162. /*******************************************************************************
  163. * Function Name   : Disp_BW(uint8_t num)
  164. * Description     : 显示百位数字
  165. * Inputs          : 数字
  166. * Outputs         : None
  167. * Return          : None
  168. * Notes           : None
  169. *******************************************************************************/
  170. static void Disp_BW(uint8_t num)
  171. {
  172.     uint8_t num_buf[4];
  173.     ConvertNum(num_buf,num);
  174.    
  175.     HAL_LCD_Write(&hlcd, COM1, Mask_B, num_buf[0]<<SEG_B);
  176.     HAL_LCD_Write(&hlcd, COM2, Mask_B, num_buf[1]<<SEG_B);
  177.     HAL_LCD_Write(&hlcd, COM3, Mask_B, num_buf[2]<<SEG_B);
  178.     HAL_LCD_Write(&hlcd, COM4, Mask_B, num_buf[3]<<SEG_B);
  179.    
  180.     HAL_LCD_UpdateDisplayRequest(&hlcd);
  181. }

  182. /*******************************************************************************
  183. * Function Name   : Disp_SW(uint8_t num)
  184. * Description     : 显示十位数字
  185. * Inputs          : 数字
  186. * Outputs         : None
  187. * Return          : None
  188. * Notes           : None
  189. *******************************************************************************/
  190. static void Disp_SW(uint8_t num)
  191. {
  192.     uint8_t num_buf[4];
  193.     ConvertNum(num_buf,num);
  194.    
  195.     HAL_LCD_Write(&hlcd, COM1, Mask_S, num_buf[0]<<SEG_S);
  196.     HAL_LCD_Write(&hlcd, COM2, Mask_S, num_buf[1]<<SEG_S);
  197.     HAL_LCD_Write(&hlcd, COM3, Mask_S, num_buf[2]<<SEG_S);
  198.     HAL_LCD_Write(&hlcd, COM4, Mask_S, num_buf[3]<<SEG_S);
  199.    
  200.     HAL_LCD_UpdateDisplayRequest(&hlcd);
  201. }

  202. /*******************************************************************************
  203. * Function Name   : Disp_GW(uint8_t num)
  204. * Description     : 显示个位数字
  205. * Inputs          : 数字
  206. * Outputs         : None
  207. * Return          : None
  208. * Notes           : 由于BT3和个位显示有冲突,所以在此处理
  209. *******************************************************************************/
  210. static void Disp_GW(uint8_t num)
  211. {
  212.     uint8_t num_buf[4];
  213.     ConvertNum(num_buf,num);
  214.        
  215.                 HAL_LCD_Write(&hlcd, COM1, Mask_G|Mask_Battery3, num_buf[0]<<SEG_G);
  216.                 HAL_LCD_Write(&hlcd, COM2, Mask_G|Mask_Battery3, num_buf[1]<<SEG_G);
  217.                 HAL_LCD_Write(&hlcd, COM3, Mask_G|Mask_Battery3, num_buf[2]<<SEG_G);
  218.                 HAL_LCD_Write(&hlcd, COM4, Mask_G|Mask_Battery3, num_buf[3]<<SEG_G);
  219.        
  220.     HAL_LCD_UpdateDisplayRequest(&hlcd);
  221. }
  222. /*******************************************************************************
  223. * Function Name   : Disp_PW(uint8_t num)
  224. * Description     : 显示十分位数字
  225. * Inputs          : 数字
  226. * Outputs         : None
  227. * Return          : None
  228. * Notes           : 由于十分位的两个段并不是连续的,所以在此再次对十分位要显示的数据进行处理
  229. *******************************************************************************/
  230. static void Disp_PW(uint8_t num)
  231. {
  232.     uint8_t num_buf[4];
  233.                 uint8_t Num_For_Point=0;//再次处理十分位数据所用
  234.     ConvertNum(num_buf,num);
  235.   
  236.                 /*由于十分位的两个段并不是连续的,所以在此再次对十分位要显示的数据进行处理*/
  237.                 for(Num_For_Point=0;Num_For_Point<4;Num_For_Point++)
  238.                 {
  239.                                 if(num_buf[Num_For_Point]==0x3)
  240.                                 {
  241.                                                 num_buf[Num_For_Point]=0x5;
  242.                                 }
  243.                                 else if(num_buf[Num_For_Point]==0x2)
  244.                                 {
  245.                                                 num_buf[Num_For_Point]=0x4;
  246.                                 }
  247.                 }  
  248.        
  249.     HAL_LCD_Write(&hlcd, COM1, Mask_P, num_buf[0]<<SEG_P);
  250.     HAL_LCD_Write(&hlcd, COM2, Mask_P, num_buf[1]<<SEG_P);
  251.     HAL_LCD_Write(&hlcd, COM3, Mask_P, num_buf[2]<<SEG_P);
  252.     HAL_LCD_Write(&hlcd, COM4, Mask_P, num_buf[3]<<SEG_P);
  253.    
  254.     HAL_LCD_UpdateDisplayRequest(&hlcd);
  255. }

  256. /*******************************************************************************
  257. * Function Name   : Display_Num(float temp)
  258. * Description     : 显示小数
  259. * Inputs          : 小数
  260. * Outputs         : None
  261. * Return          : None
  262. * Notes           :
  263. *******************************************************************************/

  264. void Display_Num(float temp)
  265. {
  266.         uint16_t Num=0;
  267.         uint8_t Bai=0,Shi=0,Ge=0,Point=0;
  268.         Num=(int)(temp*10.0);
  269.         if(Num<1000)
  270.         {
  271.                 Shi=Num/100;
  272.                 Ge=Num%100/10;
  273.                 Point=Num%10;
  274.                 Disp_SW(Shi);
  275.                 Disp_GW(Ge);
  276.                 Disp_PW(Point);
  277.                 Diaplay_Icon(POINT,1);//显示小数点
  278.         }
  279.         else
  280.         {
  281.                 Bai=Num/1000;
  282.                 Shi=Num%1000/100;
  283.                 Ge=Num%100/10;
  284.                 Point=Num%10;
  285.                 Disp_BW(Bai);
  286.                 Disp_SW(Shi);
  287.                 Disp_GW(Ge);
  288.                 Disp_PW(Point);
  289.                 Diaplay_Icon(POINT,1);//显示小数点
  290.         }
  291. }

  292. /*******************************************************************************
  293. * Function Name   : Diaplay_Icon(ICON icon)
  294. * Description     : 显示图标
  295. * icon            : 枚举类型ICON中的图标名称
  296. * status          : 枚举类型ICON中的图标显示状态
  297. * Outputs         : None
  298. * Return          : None
  299. * Notes           : None
  300. *******************************************************************************/
  301. void Diaplay_Icon(ICON icon,uint8_t status)
  302. {
  303.     if(icon==Temp_C)
  304.     {
  305.         HAL_LCD_Write(&hlcd, COM_Temp_C, Mask_Temp_C, status<<SEG_Temp_C);
  306.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  307.     }
  308.     else if(icon==Temp_F)
  309.     {
  310.         HAL_LCD_Write(&hlcd, COM_Temp_F, Mask_Temp_F, status<<SEG_Temp_F);
  311.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  312.     }
  313.     else if(icon==Buzzer)
  314.     {
  315.         HAL_LCD_Write(&hlcd, COM_Buzzer, Mask_Buzzer, status<<SEG_Buzzer);
  316.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  317.     }
  318.     else if(icon==Body)
  319.     {
  320.         HAL_LCD_Write(&hlcd, COM_Body, Mask_Body, status<<SEG_Body);
  321.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  322.     }
  323.     else if(icon==WuTi)
  324.     {
  325.         HAL_LCD_Write(&hlcd, COM_WuTi, Mask_WuTi, status<<SEG_WuTi);
  326.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  327.     }
  328.     else if(icon==BLUE)
  329.     {
  330.         HAL_LCD_Write(&hlcd, COM_BLUE, Mask_BLUE, status<<SEG_BLUE);
  331.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  332.     }
  333.     else if(icon==**)
  334.     {
  335.         HAL_LCD_Write(&hlcd, COM_**, Mask_**, status<<SEG_**);
  336.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  337.     }
  338.                 else if(icon==POINT)
  339.                 {
  340.                                 HAL_LCD_Write(&hlcd, COM_POINT, Mask_Point, status<<SEG_Point);
  341.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  342.                 }
  343.                 else if(icon==HIGH)
  344.     {
  345.         if(status)
  346.                                 {
  347.                                         Disp_SW(11);//显示H
  348.                                         Disp_GW(12);//显示I
  349.                                 }
  350.                                 else
  351.                                 {
  352.                                         Disp_SW(21);//清除显示HI
  353.                                         Disp_GW(22);
  354.                                 }
  355.     }
  356.                 else if(icon==LOW)
  357.     {
  358.       if(status)
  359.                         {
  360.                                 Disp_SW(13);//显示L
  361.                                 Disp_GW(14);//显示O
  362.                         }
  363.                         else
  364.                         {
  365.                                 Disp_SW(21);//清除显示LO
  366.                                 Disp_GW(22);
  367.                         }
  368.     }
  369. }

  370. /*******************************************************************************
  371. * Function Name   : Diaplay_Icon(ICON icon)
  372. * Description     : 显示图标
  373. * Inputs          : 电量等级:0/1/2/3
  374. * Outputs         : None
  375. * Return          : None
  376. * Notes           : None
  377. *******************************************************************************/
  378. void Display_Power(uint8_t grade)
  379. {
  380.     switch(grade)
  381.     {
  382.         case 0:
  383.             HAL_LCD_Write(&hlcd, COM_Battery,  Mask_Battery, 1<<SEG_Battery);
  384.             HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 0<<SEG_Battery1);
  385.             HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 0<<SEG_Battery2);
  386.             HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 0<<SEG_Battery3);
  387.             HAL_LCD_UpdateDisplayRequest(&hlcd);
  388.             break;
  389.         case 1:
  390.             HAL_LCD_Write(&hlcd, COM_Battery,  Mask_Battery,  1<<SEG_Battery);
  391.             HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 1<<SEG_Battery1);
  392.             HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 0<<SEG_Battery2);
  393.             HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 0<<SEG_Battery3);
  394.             HAL_LCD_UpdateDisplayRequest(&hlcd);
  395.             break;
  396.         case 2:
  397.             HAL_LCD_Write(&hlcd, COM_Battery,  Mask_Battery,  1<<SEG_Battery);
  398.             HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 1<<SEG_Battery1);
  399.             HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 1<<SEG_Battery2);
  400.             HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 0<<SEG_Battery3);
  401.             HAL_LCD_UpdateDisplayRequest(&hlcd);
  402.             break;
  403.         case 3:
  404.             HAL_LCD_Write(&hlcd, COM_Battery,  Mask_Battery,  1<<SEG_Battery);
  405.             HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 1<<SEG_Battery1);
  406.             HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 1<<SEG_Battery2);
  407.             HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 1<<SEG_Battery3);
  408.             HAL_LCD_UpdateDisplayRequest(&hlcd);
  409.             break;
  410.                                 case 4:
  411.             HAL_LCD_Write(&hlcd, COM_Battery,  Mask_Battery,  0<<SEG_Battery);
  412.             HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 0<<SEG_Battery1);
  413.             HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 0<<SEG_Battery2);
  414.             HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 0<<SEG_Battery3);
  415.             HAL_LCD_UpdateDisplayRequest(&hlcd);
  416.             break;
  417.         default:
  418.             break;
  419.     }
  420. }


  421. /*******************************************************************************
  422. * Function Name   : Clear_Temp_C(float temp)
  423. * Description     : 清除温度显示
  424. * Inputs          : None
  425. * Outputs         : None
  426. * Return          : None
  427. * Notes           : 传送非(0-10)的ID即显示为空,ID=10为"- - - -"
  428. *******************************************************************************/
  429. void Clear_Temp_C(void)
  430. {
  431.         Disp_BW(10);
  432.         Disp_SW(10);
  433.         Disp_GW(10);
  434.         Disp_PW(10);
  435. }

  436. /*******************************************************************************
  437. * Function Name   : Display_All(void)
  438. * Description     : 显示全屏
  439. * Inputs          : None
  440. * Outputs         : None
  441. * Return          : None
  442. * Notes           : NONE
  443. *******************************************************************************/
  444. void Display_All(void)
  445. {
  446.         Display_Power(3);//显示电量
  447.        
  448.         Diaplay_Icon(Temp_C,1);//显示所有图标
  449.         Diaplay_Icon(Temp_F,1);
  450.         Diaplay_Icon(Buzzer,1);
  451.         Diaplay_Icon(Body,1);
  452.         Diaplay_Icon(WuTi,1);
  453.         Diaplay_Icon(BLUE,1);
  454.         Diaplay_Icon(**,1);
  455.        
  456.         Disp_BW(8);                                                //显示四个8
  457.         Disp_SW(8);
  458.         Disp_GW(8);
  459.         Disp_PW(8);
  460. }

  461. void lcd_init(void)
  462. {
  463.         MX_LCD_Init();
  464.         HAL_LCD_MspInit(&hlcd);
  465. }
 楼主| 梵蒂冈是神uy 发表于 2022-12-25 14:56 | 显示全部楼层
  1. typedef enum
  2. {
  3.     Temp_C,
  4.     Temp_F,
  5.     Buzzer,
  6.     Body,
  7.     WuTi,
  8.     BLUE,
  9.     **,
  10.                 POINT,
  11.                 HIGH,
  12.                 LOW
  13. }ICON;

  14. //COM口定义
  15. #define COM1                                LCD_RAM_REGISTER4
  16. #define COM2                                LCD_RAM_REGISTER2
  17. #define COM3                                LCD_RAM_REGISTER0
  18. #define COM4                                LCD_RAM_REGISTER6
  19. //段定义
  20. #define SEG_Temp_C          15
  21. #define SEG_Temp_F          15
  22. #define SEG_Buzzer          15
  23. #define SEG_Body            21
  24. #define SEG_WuTi            4
  25. #define SEG_BLUE            21
  26. #define SEG_Battery1        21
  27. #define SEG_Battery2        21
  28. #define SEG_Battery3        10
  29. #define SEG_Battery         15
  30. #define SEG_**            5
  31. #define SEG_B               0
  32. #define SEG_S               2
  33. #define SEG_G               10
  34. #define SEG_P               12
  35. #define SEG_Point           12
  36. //COM口定义
  37. #define COM_Temp_C          COM4
  38. #define COM_Temp_F          COM3
  39. #define COM_Buzzer          COM2
  40. #define COM_Body            COM2
  41. #define COM_WuTi            COM1
  42. #define COM_BLUE            COM1
  43. #define COM_Battery1        COM4
  44. #define COM_Battery2        COM3
  45. #define COM_Battery3        COM1
  46. #define COM_Battery         COM1
  47. #define COM_**            COM1
  48. #define COM_POINT           COM1
  49. //掩码定义
  50. #define Mask_Temp_C         0xFFFF7FFF
  51. #define Mask_Temp_F         0xFFFF7FFF
  52. #define Mask_Buzzer         0xFFFF7FFF
  53. #define Mask_Body           0xFFDFFFFF
  54. #define Mask_WuTi           0xFFFFFFEF
  55. #define Mask_BLUE           0xFFDFFFFF
  56. #define Mask_Battery1       0xFFDFFFFF
  57. #define Mask_Battery2       0xFFDFFFFF
  58. #define Mask_Battery3       0xFFFFFEFF
  59. #define Mask_Battery        0xFFFF7FFF
  60. #define Mask_**           0xFFFFFFDF
  61. #define Mask_B              0xFFFFFFFC
  62. #define Mask_S              0xFFFFFFF3
  63. #define Mask_G              0xFFFFF3FF
  64. #define Mask_P              0xFFFFAFFF
  65. #define Mask_Point          0xFFFFEFFF

  66. void lcd_init(void);

  67. void Display_Num(float temp);
  68. void Display_Power(uint8_t grade);
  69. void Diaplay_Icon(ICON icon,uint8_t status);
  70. void Clear_Temp_C(void);
  71. void Display_All(void);
 楼主| 梵蒂冈是神uy 发表于 2022-12-25 14:57 | 显示全部楼层
再次优化V1.3
优化内容:

解决V1.2中BT3与个位数显示冲突问题
修改字符Map
生成单独的LCD驱动程序
  1. /**
  2.   ******************************************************************************
  3.   * File Name          : LCD.c
  4.   * Description        : This file provides code for the configuration
  5.   *                      of the LCD instances.
  6.   ******************************************************************************
  7.   * @attention
  8.   *
  9.   * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
  10.   * All rights reserved.</center></h2>
  11.   *
  12.   * This software component is licensed by ST under BSD 3-Clause license,
  13.   * the "License"; You may not use this file except in compliance with the
  14.   * License. You may obtain a copy of the License at:
  15.   *                        opensource.org/licenses/BSD-3-Clause
  16.   *
  17.   ******************************************************************************
  18.   */

  19. /* Includes ------------------------------------------------------------------*/
  20. #include "lcd.h"

  21. /* USER CODE BEGIN 0 */
  22. static void ConvertNum(uint8_t buff[4],int InputNum);
  23. static void Disp_PW(uint8_t num);
  24. static void Disp_GW(uint8_t num);
  25. static void Disp_SW(uint8_t num);
  26. static void Disp_BW(uint8_t num);
  27. /* USER CODE END 0 */

  28. LCD_HandleTypeDef hlcd;

  29. /* LCD init function */
  30. void MX_LCD_Init(void)
  31. {

  32.   hlcd.Instance = LCD;
  33.   hlcd.Init.Prescaler = LCD_PRESCALER_2;
  34.   hlcd.Init.Divider = LCD_DIVIDER_31;
  35.   hlcd.Init.Duty = LCD_DUTY_1_4;
  36.   hlcd.Init.Bias = LCD_BIAS_1_3;
  37.   hlcd.Init.VoltageSource = LCD_VOLTAGESOURCE_INTERNAL;
  38.   hlcd.Init.Contrast = LCD_CONTRASTLEVEL_5;
  39.   hlcd.Init.DeadTime = LCD_DEADTIME_2;
  40.   hlcd.Init.PulseOnDuration = LCD_PULSEONDURATION_7;
  41.   hlcd.Init.HighDrive = LCD_HIGHDRIVE_0;
  42.   hlcd.Init.BlinkMode = LCD_BLINKMODE_OFF;
  43.   hlcd.Init.BlinkFrequency = LCD_BLINKFREQUENCY_DIV8;
  44.   hlcd.Init.MuxSegment = LCD_MUXSEGMENT_DISABLE;
  45.   if (HAL_LCD_Init(&hlcd) != HAL_OK)
  46.   {
  47.     Error_Handler();
  48.   }

  49. }

  50. void HAL_LCD_MspInit(LCD_HandleTypeDef* lcdHandle)
  51. {

  52.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  53.   if(lcdHandle->Instance==LCD)
  54.   {
  55.   /* USER CODE BEGIN LCD_MspInit 0 */

  56.   /* USER CODE END LCD_MspInit 0 */
  57.     /* LCD clock enable */
  58.     __HAL_RCC_LCD_CLK_ENABLE();
  59.   
  60.     __HAL_RCC_GPIOC_CLK_ENABLE();
  61.     __HAL_RCC_GPIOA_CLK_ENABLE();
  62.     __HAL_RCC_GPIOB_CLK_ENABLE();
  63.     /**LCD GPIO Configuration   
  64.     PC3     ------> LCD_SEG21
  65.     PA1     ------> LCD_SEG0
  66.     PA2     ------> LCD_SEG1
  67.     PA3     ------> LCD_SEG2
  68.     PA6     ------> LCD_SEG3
  69.     PA7     ------> LCD_SEG4
  70.     PC4     ------> LCD_SEG22
  71.     PB0     ------> LCD_SEG5
  72.     PB1     ------> LCD_SEG6
  73.     PB10     ------> LCD_SEG10
  74.     PB11     ------> LCD_SEG11
  75.     PB12     ------> LCD_SEG12
  76.     PB14     ------> LCD_SEG14
  77.     PB15     ------> LCD_SEG15
  78.     PA8     ------> LCD_COM0
  79.     PA9     ------> LCD_COM1
  80.     PA10     ------> LCD_COM2
  81.     PB9     ------> LCD_COM3
  82.     */
  83.     GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4;
  84.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  85.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  86.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  87.     GPIO_InitStruct.Alternate = GPIO_AF1_LCD;
  88.     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  89.     GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6
  90.                           |GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
  91.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  92.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  93.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  94.     GPIO_InitStruct.Alternate = GPIO_AF1_LCD;
  95.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  96.     GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11
  97.                           |GPIO_PIN_12|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_9;
  98.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  99.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  100.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  101.     GPIO_InitStruct.Alternate = GPIO_AF1_LCD;
  102.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  103.   /* USER CODE BEGIN LCD_MspInit 1 */

  104.   /* USER CODE END LCD_MspInit 1 */
  105.   }
  106. }

  107. void HAL_LCD_MspDeInit(LCD_HandleTypeDef* lcdHandle)
  108. {

  109.   if(lcdHandle->Instance==LCD)
  110.   {
  111.   /* USER CODE BEGIN LCD_MspDeInit 0 */

  112.   /* USER CODE END LCD_MspDeInit 0 */
  113.     /* Peripheral clock disable */
  114.     __HAL_RCC_LCD_CLK_DISABLE();
  115.   
  116.     /**LCD GPIO Configuration   
  117.     PC3     ------> LCD_SEG21
  118.     PA1     ------> LCD_SEG0
  119.     PA2     ------> LCD_SEG1
  120.     PA3     ------> LCD_SEG2
  121.     PA6     ------> LCD_SEG3
  122.     PA7     ------> LCD_SEG4
  123.     PC4     ------> LCD_SEG22
  124.     PB0     ------> LCD_SEG5
  125.     PB1     ------> LCD_SEG6
  126.     PB10     ------> LCD_SEG10
  127.     PB11     ------> LCD_SEG11
  128.     PB12     ------> LCD_SEG12
  129.     PB14     ------> LCD_SEG14
  130.     PB15     ------> LCD_SEG15
  131.     PA8     ------> LCD_COM0
  132.     PA9     ------> LCD_COM1
  133.     PA10     ------> LCD_COM2
  134.     PB9     ------> LCD_COM3
  135.     */
  136.     HAL_GPIO_DeInit(GPIOC, GPIO_PIN_3|GPIO_PIN_4);

  137.     HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6
  138.                           |GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10);

  139.     HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11
  140.                           |GPIO_PIN_12|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_9);

  141.   /* USER CODE BEGIN LCD_MspDeInit 1 */

  142.   /* USER CODE END LCD_MspDeInit 1 */
  143.   }
  144. }

  145. /* USER CODE BEGIN 1 */
  146. const uint16_t mask[4]={0xF000,0x0F00,0x00F0,0x000F};
  147. const uint8_t offset[4]={12,8,4,0};
  148. const uint16_t Num_Map[15]={0x1323,0x0220,0x1132,0x1232,0x0231,0x1213,0x1313,0x0222,0x1333,0x1233,0x0010,0x0331,0x0200,0x1101,0x1310};
  149. //                           0      1      2      3      4      5      6      7      8      9      ----   H
  150. /*******************************************************************************
  151. * Function Name   : ConvertNum
  152. * Description     : 查找输入参数对应的字符编码
  153. * Inputs          : InputNum--显示字符
  154. * Outputs         : None
  155. * Return          : None
  156. * Notes           : None
  157. *******************************************************************************/

  158. static void ConvertNum(uint8_t buff[4],int InputNum)
  159. {
  160. uint16_t Num, tmp = 0;
  161. uint8_t i;

  162. if((InputNum>=0)&&(InputNum<=15))
  163.   {
  164.         Num=Num_Map[InputNum];
  165.   }
  166.   else
  167.   {
  168.     Num=0;
  169.   }
  170.   for(i = 0;i < 4; i++)
  171.   {
  172.     tmp = Num & mask[i];                                    
  173.     buff[i] = (uint8_t)(tmp >> offset[i]);
  174.   }
  175. }
  176. /*******************************************************************************
  177. * Function Name   : Disp_BW(uint8_t num)
  178. * Description     : 显示百位数字
  179. * Inputs          : 数字
  180. * Outputs         : None
  181. * Return          : None
  182. * Notes           : None
  183. *******************************************************************************/
  184. void Disp_BW(uint8_t num)
  185. {
  186.     uint8_t num_buf[4];
  187.     ConvertNum(num_buf,num);
  188.    
  189.     HAL_LCD_Write(&hlcd, COM1, Mask_B_COM1, num_buf[0]<<SEG_B_COM1);
  190.     HAL_LCD_Write(&hlcd, COM2, Mask_B, num_buf[1]<<SEG_B);
  191.     HAL_LCD_Write(&hlcd, COM3, Mask_B, num_buf[2]<<SEG_B);
  192.     HAL_LCD_Write(&hlcd, COM4, Mask_B, num_buf[3]<<SEG_B);
  193.    
  194.     HAL_LCD_UpdateDisplayRequest(&hlcd);
  195. }

  196. /*******************************************************************************
  197. * Function Name   : Disp_SW(uint8_t num)
  198. * Description     : 显示十位数字
  199. * Inputs          : 数字
  200. * Outputs         : None
  201. * Return          : None
  202. * Notes           : None
  203. *******************************************************************************/
  204. void Disp_SW(uint8_t num)
  205. {
  206.     uint8_t num_buf[4];
  207.     ConvertNum(num_buf,num);
  208.    
  209.     HAL_LCD_Write(&hlcd, COM1, Mask_S_COM1, num_buf[0]<<SEG_S_COM1);
  210.     HAL_LCD_Write(&hlcd, COM2, Mask_S, num_buf[1]<<SEG_S);
  211.     HAL_LCD_Write(&hlcd, COM3, Mask_S, num_buf[2]<<SEG_S);
  212.     HAL_LCD_Write(&hlcd, COM4, Mask_S, num_buf[3]<<SEG_S);
  213.    
  214.     HAL_LCD_UpdateDisplayRequest(&hlcd);
  215. }

  216. /*******************************************************************************
  217. * Function Name   : Disp_GW(uint8_t num)
  218. * Description     : 显示个位数字
  219. * Inputs          : 数字
  220. * Outputs         : None
  221. * Return          : None
  222. * Notes           : 由于BT3和个位显示有冲突,所以在此处理
  223. *******************************************************************************/
  224. void Disp_GW(uint8_t num)
  225. {
  226.     uint8_t num_buf[4];
  227.     ConvertNum(num_buf,num);
  228.        
  229.                 HAL_LCD_Write(&hlcd, COM1, Mask_G_COM1, num_buf[0]<<SEG_G_COM1);
  230.                 HAL_LCD_Write(&hlcd, COM2, Mask_G, num_buf[1]<<SEG_G);
  231.                 HAL_LCD_Write(&hlcd, COM3, Mask_G, num_buf[2]<<SEG_G);
  232.                 HAL_LCD_Write(&hlcd, COM4, Mask_G, num_buf[3]<<SEG_G);
  233.        
  234.     HAL_LCD_UpdateDisplayRequest(&hlcd);
  235. }
  236. /*******************************************************************************
  237. * Function Name   : Disp_PW(uint8_t num)
  238. * Description     : 显示十分位数字
  239. * Inputs          : 数字
  240. * Outputs         : None
  241. * Return          : None
  242. * Notes           : 由于十分位的两个段并不是连续的,所以在此再次对十分位要显示的数据进行处理
  243. *******************************************************************************/
  244. void Disp_PW(uint8_t num)
  245. {
  246.     uint8_t num_buf[4];
  247.                 uint8_t Num_For_Point=0;//再次处理十分位数据所用
  248.     ConvertNum(num_buf,num);
  249.   
  250.                 /*由于十分位的两个段并不是连续的,所以在此再次对十分位要显示的数据进行处理*/
  251.                 for(Num_For_Point=1;Num_For_Point<4;Num_For_Point++)
  252.                 {
  253.                                 if(num_buf[Num_For_Point]==0x3)
  254.                                 {
  255.                                                 num_buf[Num_For_Point]=0x5;
  256.                                 }
  257.                                 else if(num_buf[Num_For_Point]==0x2)
  258.                                 {
  259.                                                 num_buf[Num_For_Point]=0x4;
  260.                                 }
  261.                 }  
  262.        
  263.     HAL_LCD_Write(&hlcd, COM1, Mask_P_COM1, num_buf[0]<<SEG_P_COM1);
  264.     HAL_LCD_Write(&hlcd, COM2, Mask_P, num_buf[1]<<SEG_P);
  265.     HAL_LCD_Write(&hlcd, COM3, Mask_P, num_buf[2]<<SEG_P);
  266.     HAL_LCD_Write(&hlcd, COM4, Mask_P, num_buf[3]<<SEG_P);
  267.    
  268.     HAL_LCD_UpdateDisplayRequest(&hlcd);
  269. }

  270. /*******************************************************************************
  271. * Function Name   : Display_Num(float temp)
  272. * Description     : 显示小数
  273. * Inputs          : 小数
  274. * Outputs         : None
  275. * Return          : None
  276. * Notes           :
  277. *******************************************************************************/

  278. void Display_Num(float temp)
  279. {
  280.         uint16_t Num=0;
  281.         uint8_t Bai=0,Shi=0,Ge=0,Point=0;
  282.         Num=(int)(temp*10.0);
  283.         if(Num<1000)
  284.         {
  285.                 Shi=Num/100;
  286.                 Ge=Num%100/10;
  287.                 Point=Num%10;
  288.                 Disp_SW(Shi);
  289.                 Disp_GW(Ge);
  290.                 Disp_PW(Point);
  291.                 Diaplay_Icon(POINT,1);//显示小数点
  292.         }
  293.         else
  294.         {
  295.                 Bai=Num/1000;
  296.                 Shi=Num%1000/100;
  297.                 Ge=Num%100/10;
  298.                 Point=Num%10;
  299.                 Disp_BW(Bai);
  300.                 Disp_SW(Shi);
  301.                 Disp_GW(Ge);
  302.                 Disp_PW(Point);
  303.                 Diaplay_Icon(POINT,1);//显示小数点
  304.         }
  305. }

  306. /*******************************************************************************
  307. * Function Name   : Diaplay_Icon(ICON icon)
  308. * Description     : 显示图标
  309. * icon            : 枚举类型ICON中的图标名称
  310. * status          : 枚举类型ICON中的图标显示状态
  311. * Outputs         : None
  312. * Return          : None
  313. * Notes           : None
  314. *******************************************************************************/
  315. void Diaplay_Icon(ICON icon,uint8_t status)
  316. {
  317.     if(icon==Temp_C)
  318.     {
  319.         HAL_LCD_Write(&hlcd, COM_Temp_C, Mask_Temp_C, status<<SEG_Temp_C);
  320.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  321.     }
  322.     else if(icon==Temp_F)
  323.     {
  324.         HAL_LCD_Write(&hlcd, COM_Temp_F, Mask_Temp_F, status<<SEG_Temp_F);
  325.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  326.     }
  327.     else if(icon==Buzzer)
  328.     {
  329.         HAL_LCD_Write(&hlcd, COM_Buzzer, Mask_Buzzer, status<<SEG_Buzzer);
  330.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  331.     }
  332.     else if(icon==Body)
  333.     {
  334.         HAL_LCD_Write(&hlcd, COM_Body, Mask_Body, status<<SEG_Body);
  335.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  336.     }
  337.     else if(icon==WuTi)
  338.     {
  339.         HAL_LCD_Write(&hlcd, COM_WuTi, Mask_WuTi, status<<SEG_WuTi);
  340.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  341.     }
  342.     else if(icon==BLUE)
  343.     {
  344.         HAL_LCD_Write(&hlcd, COM_BLUE, Mask_BLUE, status<<SEG_BLUE);
  345.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  346.     }
  347.     else if(icon==**)
  348.     {
  349.         HAL_LCD_Write(&hlcd, COM_**, Mask_**, status<<SEG_**);
  350.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  351.     }
  352.                 else if(icon==POINT)
  353.                 {
  354.                                 HAL_LCD_Write(&hlcd, COM_POINT, Mask_Point, status<<SEG_Point);
  355.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  356.                 }
  357.                 else if(icon==HIGH)
  358.     {
  359.         if(status)
  360.                                 {
  361.                                         Disp_SW(11);//显示H
  362.                                         Disp_GW(12);//显示I
  363.                                 }
  364.                                 else
  365.                                 {
  366.                                         Disp_SW(21);//清除显示HI
  367.                                         Disp_GW(22);
  368.                                 }
  369.     }
  370.                 else if(icon==LOW)
  371.     {
  372.       if(status)
  373.                         {
  374.                                 Disp_SW(13);//显示L
  375.                                 Disp_GW(14);//显示O
  376.                         }
  377.                         else
  378.                         {
  379.                                 Disp_SW(21);//清除显示LO
  380.                                 Disp_GW(22);
  381.                         }
  382.     }
  383. }

  384. /*******************************************************************************
  385. * Function Name   : Diaplay_Icon(ICON icon)
  386. * Description     : 显示图标
  387. * Inputs          : 电量等级:0/1/2/3
  388. * Outputs         : None
  389. * Return          : None
  390. * Notes           : None
  391. *******************************************************************************/
  392. void Display_Power(uint8_t grade)
  393. {
  394.     switch(grade)
  395.     {
  396.         case 0:
  397.             HAL_LCD_Write(&hlcd, COM_Battery,  Mask_Battery, 1<<SEG_Battery);
  398.             HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 0<<SEG_Battery1);
  399.             HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 0<<SEG_Battery2);
  400.             HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 0<<SEG_Battery3);
  401.             HAL_LCD_UpdateDisplayRequest(&hlcd);
  402.             break;
  403.         case 1:
  404.             HAL_LCD_Write(&hlcd, COM_Battery,  Mask_Battery,  1<<SEG_Battery);
  405.             HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 1<<SEG_Battery1);
  406.             HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 0<<SEG_Battery2);
  407.             HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 0<<SEG_Battery3);
  408.             HAL_LCD_UpdateDisplayRequest(&hlcd);
  409.             break;
  410.         case 2:
  411.             HAL_LCD_Write(&hlcd, COM_Battery,  Mask_Battery,  1<<SEG_Battery);
  412.             HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 1<<SEG_Battery1);
  413.             HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 1<<SEG_Battery2);
  414.             HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 0<<SEG_Battery3);
  415.             HAL_LCD_UpdateDisplayRequest(&hlcd);
  416.             break;
  417.         case 3:
  418.             HAL_LCD_Write(&hlcd, COM_Battery,  Mask_Battery,  1<<SEG_Battery);
  419.             HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 1<<SEG_Battery1);
  420.             HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 1<<SEG_Battery2);
  421.             HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 1<<SEG_Battery3);
  422.             HAL_LCD_UpdateDisplayRequest(&hlcd);
  423.             break;
  424.                                 case 4:
  425.             HAL_LCD_Write(&hlcd, COM_Battery,  Mask_Battery,  0<<SEG_Battery);
  426.             HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 0<<SEG_Battery1);
  427.             HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 0<<SEG_Battery2);
  428.             HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 0<<SEG_Battery3);
  429.             HAL_LCD_UpdateDisplayRequest(&hlcd);
  430.             break;
  431.         default:
  432.             break;
  433.     }
  434. }


  435. /*******************************************************************************
  436. * Function Name   : Clear_Temp_C(float temp)
  437. * Description     : 清除温度显示
  438. * Inputs          : None
  439. * Outputs         : None
  440. * Return          : None
  441. * Notes           : 传送非(0-10)的ID即显示为空,ID=10为"- - - -"
  442. *******************************************************************************/
  443. void Clear_Temp_C(void)
  444. {
  445.         Disp_BW(20);
  446.         Disp_SW(20);
  447.         Disp_GW(20);
  448.         Disp_PW(20);
  449. }

  450. /*******************************************************************************
  451. * Function Name   : Display_All(void)
  452. * Description     : 显示全屏
  453. * Inputs          : None
  454. * Outputs         : None
  455. * Return          : None
  456. * Notes           : NONE
  457. *******************************************************************************/
  458. void Display_All(void)
  459. {
  460.         Display_Power(3);//显示电量
  461.        
  462.         Diaplay_Icon(Temp_C,1);//显示所有图标
  463.         Diaplay_Icon(Temp_F,1);
  464.         Diaplay_Icon(Buzzer,1);
  465.         Diaplay_Icon(Body,1);
  466.         Diaplay_Icon(WuTi,1);
  467.         Diaplay_Icon(BLUE,1);
  468.         Diaplay_Icon(**,1);
  469.        
  470.         Disp_BW(8);                                                //显示四个8
  471.         Disp_SW(8);
  472.         Disp_GW(8);
  473.         Disp_PW(8);
  474. }

  475. /* USER CODE END 1 */

  476. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

 楼主| 梵蒂冈是神uy 发表于 2022-12-25 15:00 | 显示全部楼层
  1. /**
  2.   ******************************************************************************
  3.   * File Name          : LCD.h
  4.   * Description        : This file provides code for the configuration
  5.   *                      of the LCD instances.
  6.   ******************************************************************************
  7.   * @attention
  8.   *
  9.   * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
  10.   * All rights reserved.</center></h2>
  11.   *
  12.   * This software component is licensed by ST under BSD 3-Clause license,
  13.   * the "License"; You may not use this file except in compliance with the
  14.   * License. You may obtain a copy of the License at:
  15.   *                        opensource.org/licenses/BSD-3-Clause
  16.   *
  17.   ******************************************************************************
  18.   */
  19. /* Define to prevent recursive inclusion -------------------------------------*/
  20. #ifndef __lcd_H
  21. #define __lcd_H
  22. #ifdef __cplusplus
  23. extern "C" {
  24. #endif

  25. /* Includes ------------------------------------------------------------------*/
  26. #include "main.h"

  27. /* USER CODE BEGIN Includes */

  28. /* USER CODE END Includes */

  29. extern LCD_HandleTypeDef hlcd;

  30. /* USER CODE BEGIN Private defines */
  31. typedef enum
  32. {
  33.     Temp_C,
  34.     Temp_F,
  35.     Buzzer,
  36.     Body,
  37.     WuTi,
  38.     BLUE,
  39.     **,
  40.                 POINT,
  41.                 HIGH,
  42.                 LOW
  43. }ICON;

  44. //COM口定义
  45. #define COM1                                LCD_RAM_REGISTER4
  46. #define COM2                                LCD_RAM_REGISTER2
  47. #define COM3                                LCD_RAM_REGISTER0
  48. #define COM4                                LCD_RAM_REGISTER6
  49. //段定义
  50. #define SEG_Temp_C          15
  51. #define SEG_Temp_F          15
  52. #define SEG_Buzzer          15
  53. #define SEG_Body            21
  54. #define SEG_WuTi            4
  55. #define SEG_BLUE            21
  56. #define SEG_Battery1        21
  57. #define SEG_Battery2        21
  58. #define SEG_Battery3        10
  59. #define SEG_Battery         15
  60. #define SEG_**            5
  61. #define SEG_B               0
  62. #define SEG_B_COM1          1
  63. #define SEG_S               2
  64. #define SEG_S_COM1          3
  65. #define SEG_G               10
  66. #define SEG_G_COM1          11
  67. #define SEG_P               12
  68. #define SEG_P_COM1          14
  69. #define SEG_Point           12
  70. //COM口定义
  71. #define COM_Temp_C          COM4
  72. #define COM_Temp_F          COM3
  73. #define COM_Buzzer          COM2
  74. #define COM_Body            COM2
  75. #define COM_WuTi            COM1
  76. #define COM_BLUE            COM1
  77. #define COM_Battery1        COM4
  78. #define COM_Battery2        COM3
  79. #define COM_Battery3        COM1
  80. #define COM_Battery         COM1
  81. #define COM_**            COM1
  82. #define COM_POINT           COM1
  83. //掩码定义
  84. #define Mask_Temp_C         0xFFFF7FFF
  85. #define Mask_Temp_F         0xFFFF7FFF
  86. #define Mask_Buzzer         0xFFFF7FFF
  87. #define Mask_Body           0xFFDFFFFF
  88. #define Mask_WuTi           0xFFFFFFEF
  89. #define Mask_BLUE           0xFFDFFFFF
  90. #define Mask_Battery1       0xFFDFFFFF
  91. #define Mask_Battery2       0xFFDFFFFF
  92. #define Mask_Battery3       0xFFFFFBFF
  93. #define Mask_Battery        0xFFFF7FFF
  94. #define Mask_**           0xFFFFFFDF
  95. #define Mask_B              0xFFFFFFFC
  96. #define Mask_B_COM1                                        0xFFFFFFFD
  97. #define Mask_S              0xFFFFFFF3
  98. #define Mask_S_COM1                                        0xFFFFFFF7
  99. #define Mask_G              0xFFFFF3FF
  100. #define Mask_G_COM1                                        0xFFFFF7FF
  101. #define Mask_P              0xFFFFAFFF
  102. #define Mask_P_COM1                                        0xFFFFBFFF
  103. #define Mask_Point          0xFFFFEFFF
  104. /* USER CODE END Private defines */

  105. void MX_LCD_Init(void);

  106. /* USER CODE BEGIN Prototypes */
  107. void Display_Num(float temp);
  108. void Display_Power(uint8_t grade);
  109. void Diaplay_Icon(ICON icon,uint8_t status);
  110. void Clear_Temp_C(void);
  111. void Display_All(void);
  112. /* USER CODE END Prototypes */

  113. #ifdef __cplusplus
  114. }
  115. #endif
  116. #endif /*__ lcd_H */

  117. /**
  118.   * @}
  119.   */

  120. /**
  121.   * @}
  122.   */

  123. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

 楼主| 梵蒂冈是神uy 发表于 2022-12-25 15:01 | 显示全部楼层
另一种显示方式:(更方便,彻底解决显示冲突的问题,不用考虑显示冲突的问题)
  1. /* USER CODE BEGIN 1 */
  2. uint8_t A=0,B=0,C=0,D=0,E=0,F=0,G=0;
  3. /*******************************************************************************
  4. * Function Name   : ConvertNum
  5. * Description     : 根据输入的数字将对应的段进行操作,点亮或者熄灭
  6. * Inputs          : 输入的数字
  7. * Outputs         : None
  8. * Return          : None
  9. * Notes           : None
  10. *******************************************************************************/
  11. static void ConvertNum(uint8_t InputNum)
  12. {
  13.     switch(InputNum)
  14.         {
  15.             case 0://显示0
  16.                 A=B=C=D=E=F=1;
  17.                 G=0;
  18.                 break;
  19.             case 1://显示1
  20.                 B=C=1;
  21.                 A=D=E=F=G=0;
  22.                 break;
  23.             case 2://显示2
  24.                 C=F=0;
  25.                 A=B=D=E=G=1;
  26.                 break;
  27.             case 3://显示3
  28.                 E=F=0;
  29.                 A=B=C=D=G=1;
  30.                 break;
  31.             case 4://显示4
  32.                 A=E=D=0;
  33.                 B=C=F=G=1;
  34.                 break;
  35.             case 5://显示5
  36.                 B=E=0;
  37.                 A=C=D=F=G=1;
  38.                 break;
  39.             case 6://显示6
  40.                 B=0;
  41.                 A=C=D=E=F=G=1;
  42.                 break;
  43.             case 7://显示7
  44.                 E=D=G=F=0;
  45.                 A=B=C=1;
  46.                 break;
  47.             case 8://显示8
  48.                 A=B=C=D=E=F=G=1;
  49.                 break;
  50.             case 9://显示9
  51.                 E=0;
  52.                 A=B=C=D=F=G=1;
  53.                 break;
  54.             case 10://显示H
  55.                 A=D=0;
  56.                 B=C=E=F=G=1;
  57.                 break;
  58.             case 11://显示I
  59.                 C=1;
  60.                 A=B=D=E=F=G=0;
  61.                 break;
  62.             case 12://显示L
  63.                 D=E=F=1;
  64.                 A=B=C=G=0;
  65.                 break;
  66.             case 13://显示O
  67.                 A=B=F=0;
  68.                 C=D=G=1;
  69.                 break;
  70.             case 14://显示-
  71.                 G=1;
  72.                 A=B=C=D=E=F=0;
  73.                 break;
  74.             case 15://显示为空,即不显示
  75.                 A=B=C=D=E=F=G=0;
  76.                 break;
  77.             case 16://全部显示
  78.                 A=B=C=D=E=F=G=1;
  79.                 break;
  80.             default:
  81.                 A=B=C=D=E=F=G=0;
  82.             break;
  83.         }
  84. }
  85. /*******************************************************************************
  86. * Function Name   : Disp_BW(void)
  87. * Description     : 非零数据则百位显示1,如果输入0则不显示
  88. * Inputs          : 数字
  89. * Outputs         : None
  90. * Return          : None
  91. * Notes           : None
  92. *******************************************************************************/
  93. void Disp_BW(uint8_t num)
  94. {
  95.     if(num)
  96.     {
  97.         HAL_LCD_Write(&hlcd, COM1, Mask_B, 1<<SEG_B);
  98.     }
  99.     else
  100.     {
  101.         HAL_LCD_Write(&hlcd, COM1, Mask_B, 0<<SEG_B);
  102.     }

  103.     HAL_LCD_UpdateDisplayRequest(&hlcd);
  104. }

  105. /*******************************************************************************
  106. * Function Name   : Disp_SW(uint8_t num)
  107. * Description     : 显示十位数字
  108. * Inputs          : 数字
  109. * Outputs         : None
  110. * Return          : None
  111. * Notes           : None
  112. *******************************************************************************/
  113. void Disp_SW(uint8_t num)
  114. {
  115.     ConvertNum(num);
  116.    
  117.     HAL_LCD_Write(&hlcd, COM1, Mask_S_COM1, A<<SEG_S_COM1);
  118.     HAL_LCD_Write(&hlcd, COM2, Mask_S, F<<SEG_S|B<<SEG_S_COM1);
  119.     HAL_LCD_Write(&hlcd, COM3, Mask_S, G<<SEG_S|C<<SEG_S_COM1);
  120.     HAL_LCD_Write(&hlcd, COM4, Mask_S, E<<SEG_S|D<<SEG_S_COM1);
  121.    
  122.   HAL_LCD_UpdateDisplayRequest(&hlcd);
  123. }

  124. /*******************************************************************************
  125. * Function Name   : Disp_GW(uint8_t num)
  126. * Description     : 显示个位数字
  127. * Inputs          : 数字
  128. * Outputs         : None
  129. * Return          : None
  130. * Notes           : 由于BT3和个位显示有冲突,所以在此处理
  131. *******************************************************************************/
  132. void Disp_GW(uint8_t num)
  133. {
  134.     ConvertNum(num);
  135.    
  136.         HAL_LCD_Write(&hlcd, COM1, Mask_G_COM1, A<<SEG_G_COM1);
  137.         HAL_LCD_Write(&hlcd, COM2, Mask_G, F<<SEG_G|B<<SEG_G_COM1);
  138.         HAL_LCD_Write(&hlcd, COM3, Mask_G, G<<SEG_G|C<<SEG_G_COM1);
  139.         HAL_LCD_Write(&hlcd, COM4, Mask_G, E<<SEG_G|D<<SEG_G_COM1);
  140.    
  141.     HAL_LCD_UpdateDisplayRequest(&hlcd);
  142. }
  143. /*******************************************************************************
  144. * Function Name   : Disp_PW(uint8_t num)
  145. * Description     : 显示十分位数字
  146. * Inputs          : 数字
  147. * Outputs         : None
  148. * Return          : None
  149. * Notes           : None
  150. *******************************************************************************/
  151. void Disp_PW(uint8_t num)
  152. {
  153.     ConvertNum(num);
  154.    
  155.         HAL_LCD_Write(&hlcd, COM1, Mask_P_COM1, A<<SEG_P_COM1);
  156.         HAL_LCD_Write(&hlcd, COM2, Mask_P, F<<SEG_P|B<<SEG_P_COM1);
  157.         HAL_LCD_Write(&hlcd, COM3, Mask_P, G<<SEG_P|C<<SEG_P_COM1);
  158.         HAL_LCD_Write(&hlcd, COM4, Mask_P, E<<SEG_P|D<<SEG_P_COM1);
  159.    
  160.     HAL_LCD_UpdateDisplayRequest(&hlcd);
  161. }

  162. /*******************************************************************************
  163. * Function Name   : Diaplay_Icon(ICON icon)
  164. * Description     : 显示图标
  165. * icon            : 枚举类型ICON中的图标名称
  166. * status          : 枚举类型ICON中的图标显示状态
  167. * Outputs         : None
  168. * Return          : None
  169. * Notes           : None
  170. *******************************************************************************/
  171. void Diaplay_Icon(ICON icon,uint8_t status)
  172. {
  173.     if(icon==Temp_C)
  174.     {
  175.         HAL_LCD_Write(&hlcd, COM_Temp_C, Mask_Temp_C, status<<SEG_Temp_C);
  176.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  177.     }
  178.     else if(icon==Temp_F)
  179.     {
  180.         HAL_LCD_Write(&hlcd, COM_Temp_F, Mask_Temp_F, status<<SEG_Temp_F);
  181.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  182.     }
  183.     else if(icon==Buzzer)
  184.     {
  185.         HAL_LCD_Write(&hlcd, COM_Buzzer, Mask_Buzzer, status<<SEG_Buzzer);
  186.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  187.     }
  188.     else if(icon==Body)
  189.     {
  190.         HAL_LCD_Write(&hlcd, COM_Body, Mask_Body, status<<SEG_Body);
  191.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  192.     }
  193.     else if(icon==TiWen)
  194.     {
  195.         HAL_LCD_Write(&hlcd, COM_TiWen, Mask_TiWen, status<<SEG_TiWen);
  196.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  197.     }
  198.     else if(icon==POINT)
  199.     {
  200.         HAL_LCD_Write(&hlcd, COM_Point, Mask_Point, status<<SEG_Point);
  201.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  202.     }
  203.         else if(icon==Mode)
  204.     {
  205.         HAL_LCD_Write(&hlcd, COM_Mode, Mask_Mode, status<<SEG_Mode);
  206.         HAL_LCD_UpdateDisplayRequest(&hlcd);
  207.     }
  208.     else if(icon==HIGH)
  209.     {
  210.         Disp_BW(0);
  211.         Disp_SW(15);//清除显示(显示为空)
  212.         if(status)
  213.         {
  214.             Disp_GW(10);//显示H
  215.             Disp_PW(11);//显示I
  216.         }
  217.         else
  218.         {
  219.             Disp_BW(0);
  220.                         Disp_SW(15);//清除显示(显示为空)
  221.         }
  222.     }
  223.     else if(icon==LOW)
  224.     {
  225.         Disp_BW(0);
  226.         Disp_SW(15);//清除显示(显示为空)
  227.         if(status)
  228.         {
  229.             Disp_GW(12);//显示L
  230.             Disp_PW(13);//显示O
  231.         }
  232.         else
  233.         {
  234.             Disp_BW(0);
  235.                         Disp_SW(15);//清除显示(显示为空)
  236.         }
  237.     }
  238. }

  239. /*******************************************************************************
  240. * Function Name   : Display_Num(float temp)
  241. * Description     : 显示小数
  242. * Inputs          : 小数
  243. * Outputs         : None
  244. * Return          : None
  245. * Notes           :
  246. *******************************************************************************/
  247. void Display_Num(float InputNum)
  248. {
  249.     uint16_t DispNum=0;
  250.     uint8_t Bai=0,Shi=0,Ge=0,Point=0;
  251.    
  252.     DispNum=(int)(InputNum*10);
  253.     if(DispNum<1000)
  254.     {
  255.         Bai=0;
  256.         Shi=DispNum/100;
  257.         Ge=DispNum%100/10;
  258.         Point=DispNum%10;
  259.     }
  260.     else
  261.     {
  262.         Bai=DispNum/1000;
  263.         Shi=DispNum%1000/100;
  264.         Ge=DispNum%100/10;
  265.         Point=DispNum%10;
  266.     }
  267.     Disp_BW(Bai);
  268.     Disp_SW(Shi);
  269.     Disp_GW(Ge);
  270.     Disp_PW(Point);
  271.     Diaplay_Icon(POINT,1);//显示小数点
  272. }



  273. /*******************************************************************************
  274. * Function Name   : Diaplay_Icon(ICON icon)
  275. * Description     : 显示图标
  276. * Inputs          : 电量等级:1/2/3
  277. * Outputs         : None
  278. * Return          : None
  279. * Notes           : None
  280. *******************************************************************************/
  281. void Display_Power(uint8_t grade)
  282. {
  283.     switch(grade)
  284.     {
  285.         case 1:
  286.             HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 1<<SEG_Battery1);
  287.             HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 0<<SEG_Battery2);
  288.             HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 0<<SEG_Battery3);
  289.             break;
  290.         case 2:
  291.             HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 1<<SEG_Battery1);
  292.             HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 1<<SEG_Battery2);
  293.             HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 0<<SEG_Battery3);
  294.             break;
  295.         case 3:
  296.             HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 1<<SEG_Battery1);
  297.             HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 1<<SEG_Battery2);
  298.             HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 1<<SEG_Battery3);
  299.             break;
  300.         case 4:
  301.             HAL_LCD_Write(&hlcd, COM_Battery1, Mask_Battery1, 0<<SEG_Battery1);
  302.             HAL_LCD_Write(&hlcd, COM_Battery2, Mask_Battery2, 0<<SEG_Battery2);
  303.             HAL_LCD_Write(&hlcd, COM_Battery3, Mask_Battery3, 0<<SEG_Battery3);
  304.             break;
  305.         default:
  306.             break;
  307.     }
  308.     HAL_LCD_UpdateDisplayRequest(&hlcd);
  309. }

  310. /*******************************************************************************
  311. * Function Name   : Clear_Temp_C(float temp)
  312. * Description     : 清除温度显示
  313. * Inputs          : None
  314. * Outputs         : None
  315. * Return          : None
  316. * Notes           : 传送非(0-10)的ID即显示为空,ID=10为"- - - -"
  317. *******************************************************************************/
  318. void Clear_Temp_C(void)
  319. {
  320.     Disp_BW(0);
  321.     Disp_SW(15);
  322.     Disp_GW(15);
  323.     Disp_PW(15);
  324.     Diaplay_Icon(POINT,0);//不显示小数点
  325. }

  326. // "- - - -"
  327. void lcd_temp_invalid(void)
  328. {
  329.     Disp_BW(0);
  330.     Disp_SW(14);
  331.     Disp_GW(14);
  332.     Disp_PW(14);
  333. }
  334. /* USER CODE END 1 */
 楼主| 梵蒂冈是神uy 发表于 2022-12-25 15:03 | 显示全部楼层
  1. typedef enum
  2. {
  3.     Temp_C,
  4.     Temp_F,
  5.     Buzzer,
  6.     Body,
  7.     TiWen,
  8.     Mode,
  9.     POINT,
  10.     HIGH,
  11.     LOW,

  12. }ICON;

  13. //COM口定义
  14. #define COM1                LCD_RAM_REGISTER0
  15. #define COM2                LCD_RAM_REGISTER2
  16. #define COM3                LCD_RAM_REGISTER4
  17. #define COM4                LCD_RAM_REGISTER6
  18. //段定义
  19. #define SEG_Temp_C          7
  20. #define SEG_Temp_F          7
  21. #define SEG_Buzzer          8
  22. #define SEG_Body            24
  23. #define SEG_TiWen           7
  24. #define SEG_Battery1        8
  25. #define SEG_Battery2        8
  26. #define SEG_Battery3        8
  27. #define SEG_Mode            7

  28. #define SEG_B               9
  29. #define SEG_S               9
  30. #define SEG_S_COM1          25
  31. #define SEG_G               24
  32. #define SEG_G_COM1          15
  33. #define SEG_P               14
  34. #define SEG_P_COM1          12

  35. #define SEG_Point           14
  36. //COM口定义
  37. #define COM_Temp_C          COM2
  38. #define COM_Temp_F          COM3
  39. #define COM_Buzzer          COM1
  40. #define COM_Body            COM1
  41. #define COM_TiWen           COM1
  42. #define COM_Battery1        COM2
  43. #define COM_Battery2        COM4
  44. #define COM_Battery3        COM3
  45. #define COM_Mode            COM4
  46. #define COM_Point           COM1

  47. //掩码定义
  48. #define Mask_Temp_C         0xFFFFFF7F//第7位为掩码(只对第7位操作)
  49. #define Mask_Temp_F         0xFFFFFF7F//第7位为掩码(只对第7位操作)
  50. #define Mask_Buzzer         0xFFFFFEFF//第8位为掩码(只对第8位操作)
  51. #define Mask_Body           0xFEFFFFFF//第24位为掩码(只对第24位操作)
  52. #define Mask_TiWen          0xFFFFFF7F//第7位为掩码(只对第7位操作)
  53. #define Mask_Battery1       0xFFFFFEFF//第8位为掩码(只对第8位操作)
  54. #define Mask_Battery2       0xFFFFFEFF//第8位为掩码(只对第8位操作)
  55. #define Mask_Battery3       0xFFFFFEFF//第8位为掩码(只对第8位操作)
  56. #define Mask_Mode           0xFFFFFF7F//第7位为掩码(只对第7位操作)
  57. #define Mask_B              0xFFFFFDFF//第9位为掩码(只对第9位操作)
  58. #define Mask_S              0xFDFFFDFF//第25、9位为掩码(只对第25、9位操作)
  59. #define Mask_S_COM1         0xFDFFFFFF//第25位为掩码(只对第25位操作)
  60. #define Mask_G              0xFEFF7FFF//第15、24位为掩码(只对第25、24位操作)
  61. #define Mask_G_COM1         0xFFFF7FFF//第15位为掩码(只对第15位操作)
  62. #define Mask_P              0xFFFFAFFF//第14、12位为掩码(只对第14、12位操作)
  63. #define Mask_P_COM1         0xFFFFEFFF//第12位为掩码(只对第12位操作)
  64. #define Mask_Point          0xFFFFBFFF//第14位为掩码(只对第14位操作)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

735

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部