返回列表 发新帖我要提问本帖赏金: 60.00元(功能说明)

[MM32生态] 基于MM32实现的通用段码液晶显示屏程序架构

[复制链接]
3491|7
 楼主| xld0932 发表于 2024-8-5 12:18 | 显示全部楼层 |阅读模式
本帖最后由 xld0932 于 2024-8-5 12:20 编辑

#申请原创#   @21小跑堂

1.概述
从之前分享的《解析SLCD例程设计思路,加速终端产品应用开发》一文中得到启发,在产品功能需求丰富的情况下,我们可以选择/评估MM32L0130这个集成了SLCD段码液晶显示屏驱动的系列MCU;但对于功能简单,对芯片成本要求又比较高时,选择分立器件或者是一个不错的选择;MM32推出的高性价比的MCU如MM32G0001系列,超值系列的MM32F0010\MM32F0020都是一个不错的选择;再结合当前SLCD显示驱动芯片的价格优势,整体成本可以做到1块钱以内。市面主比较应用的SLCD驱动芯片品牌有合泰的、深圳天微、无锡中微的等等,客户可以依据自己的功能需要,选择性价高的驱动芯片型号。

针对不同厂家的SLCD段码液晶显示屏的驱动芯片,其控制原理及接线方式都大同小异;为了方便程序移植、实现方便,我们基于MM32上面介绍到的3款芯片实现了一个通用的段码液晶显示屏程序架构,下面我们一起来详细的讲解一下。

2、硬件设计
2.1.基于MM32G0001的SLCD原理图
Schematic_MM32G0001_LCD.png

2.2.基于MM32F0010的SLCD原理图
Schematic_MM32F0010_LCD.png

2.3.基于MM32F0020的SLCD原理图
Schematic_MM32F0020_LCD.png

3.硬件实物
4.jpg
5.jpg

4.程序架构
6.png

5.程序实现(以MM32F0010为例)
5.1.SLCD驱动程序设计
  1. #ifndef __SLCD_DRIVER_H
  2. #define __SLCD_DRIVER_H

  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif

  6. #include <string.h>
  7. #include "hal_conf.h"

  8. #define SLCD_DRIVER_COM         (4)
  9. #define SLCD_DRIVER_SEG         (32)

  10. #define SLCD_DRIVER_CS_RCC      RCC_AHBENR_GPIOA
  11. #define SLCD_DRIVER_CS_GPIO     GPIOA
  12. #define SLCD_DRIVER_CS_PIN      GPIO_Pin_7

  13. #define SLCD_DRIVER_WR_RCC      RCC_AHBENR_GPIOA
  14. #define SLCD_DRIVER_WR_GPIO     GPIOA
  15. #define SLCD_DRIVER_WR_PIN      GPIO_Pin_5

  16. #define SLCD_DRIVER_DATA_RCC    RCC_AHBENR_GPIOA
  17. #define SLCD_DRIVER_DATA_GPIO   GPIOA
  18. #define SLCD_DRIVER_DATA_PIN    GPIO_Pin_4

  19. #define SLCD_DRIVER_CS_H()      GPIO_WriteBit(SLCD_DRIVER_CS_GPIO, SLCD_DRIVER_CS_PIN, Bit_SET)
  20. #define SLCD_DRIVER_CS_L()      GPIO_WriteBit(SLCD_DRIVER_CS_GPIO, SLCD_DRIVER_CS_PIN, Bit_RESET)

  21. #define SLCD_DRIVER_WR_H()      GPIO_WriteBit(SLCD_DRIVER_WR_GPIO, SLCD_DRIVER_WR_PIN, Bit_SET)
  22. #define SLCD_DRIVER_WR_L()      GPIO_WriteBit(SLCD_DRIVER_WR_GPIO, SLCD_DRIVER_WR_PIN, Bit_RESET)

  23. #define SLCD_DRIVER_DATA_H()    GPIO_WriteBit(SLCD_DRIVER_DATA_GPIO, SLCD_DRIVER_DATA_PIN, Bit_SET)
  24. #define SLCD_DRIVER_DATA_L()    GPIO_WriteBit(SLCD_DRIVER_DATA_GPIO, SLCD_DRIVER_DATA_PIN, Bit_RESET)

  25. void SLCD_DRIVER_UpdateRAM(void);
  26. void SLCD_DRIVER_ModifyRAM(uint8_t COMn, uint8_t SEGn, uint8_t State);
  27. void SLCD_DRIVER_Fill(uint8_t Data);
  28. void SLCD_DRIVER_Init(void);

  29. #ifdef __cplusplus
  30. }
  31. #endif

  32. #endif
  1. #include "slcd_driver.h"

  2. uint8_t SLCD_DRIVER_RAM[SLCD_DRIVER_SEG];

  3. void SLCD_DRIVER_InitGPIO(void)
  4. {
  5.     GPIO_InitTypeDef GPIO_InitStruct;

  6.     /* CS */
  7.     RCC_AHBPeriphClockCmd(SLCD_DRIVER_CS_RCC, ENABLE);

  8.     GPIO_StructInit(&GPIO_InitStruct);
  9.     GPIO_InitStruct.GPIO_Pin   = SLCD_DRIVER_CS_PIN;
  10.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  11.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_Out_PP;
  12.     GPIO_Init(SLCD_DRIVER_CS_GPIO, &GPIO_InitStruct);

  13.     GPIO_WriteBit(SLCD_DRIVER_CS_GPIO, SLCD_DRIVER_CS_PIN, Bit_SET);

  14.     /* WR */
  15.     RCC_AHBPeriphClockCmd(SLCD_DRIVER_WR_RCC, ENABLE);

  16.     GPIO_StructInit(&GPIO_InitStruct);
  17.     GPIO_InitStruct.GPIO_Pin   = SLCD_DRIVER_WR_PIN;
  18.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  19.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_Out_PP;
  20.     GPIO_Init(SLCD_DRIVER_WR_GPIO, &GPIO_InitStruct);

  21.     GPIO_WriteBit(SLCD_DRIVER_WR_GPIO, SLCD_DRIVER_WR_PIN, Bit_SET);

  22.     /* DATA */
  23.     RCC_AHBPeriphClockCmd(SLCD_DRIVER_DATA_RCC, ENABLE);

  24.     GPIO_StructInit(&GPIO_InitStruct);
  25.     GPIO_InitStruct.GPIO_Pin   = SLCD_DRIVER_DATA_PIN;
  26.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  27.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_Out_PP;
  28.     GPIO_Init(SLCD_DRIVER_DATA_GPIO, &GPIO_InitStruct);

  29.     GPIO_WriteBit(SLCD_DRIVER_DATA_GPIO, SLCD_DRIVER_DATA_PIN, Bit_SET);
  30. }

  31. void SLCD_DRIVER_Write(uint16_t Data, uint8_t Bits)
  32. {
  33.     SLCD_DRIVER_CS_L();                /* CS--->L */

  34.     for (uint8_t i = 0; i < Bits; i++)
  35.     {
  36.         SLCD_DRIVER_WR_L();            /* WR--->L */

  37.         if ((Data << i) & 0x8000)
  38.         {
  39.             SLCD_DRIVER_DATA_H();      /* DATA->H */
  40.         }
  41.         else
  42.         {
  43.             SLCD_DRIVER_DATA_L();      /* DATA->L */
  44.         }

  45.         SLCD_DRIVER_WR_H();            /* WR--->H */
  46.     }

  47.     SLCD_DRIVER_CS_H();                /* CS--->H */
  48. }

  49. void SLCD_DRIVER_UpdateRAM(void)
  50. {
  51.     uint16_t Data = 0;

  52.     for (uint8_t i = 0; i < SLCD_DRIVER_SEG; i++)
  53.     {
  54.         /*Write RAM : 101 a5a4a3a2a1a0 d0d1d2d3*/
  55.         Data   = 0x05;
  56.         Data <<= 0x06;

  57.         Data  |= (i & 0x3F);
  58.         Data <<= 0x04;

  59.         Data  |= (SLCD_DRIVER_RAM[i] & 0x0F);
  60.         Data <<= 0x03;

  61.         SLCD_DRIVER_Write(Data, 0x0D);
  62.     }
  63. }

  64. void SLCD_DRIVER_ModifyRAM(uint8_t COMn, uint8_t SEGn, uint8_t State)
  65. {
  66.     if (State)
  67.     {
  68.         SLCD_DRIVER_RAM[SEGn] |=  (0x01 << COMn);
  69.     }
  70.     else
  71.     {
  72.         SLCD_DRIVER_RAM[SEGn] &= ~(0x01 << COMn);
  73.     }
  74. }

  75. void SLCD_DRIVER_Fill(uint8_t Data)
  76. {
  77.     memset(SLCD_DRIVER_RAM, Data, sizeof(SLCD_DRIVER_RAM));

  78.     SLCD_DRIVER_UpdateRAM();
  79. }

  80. void SLCD_DRIVER_Init(void)
  81. {
  82.     SLCD_DRIVER_InitGPIO();

  83.     memset(SLCD_DRIVER_RAM, 0, sizeof(SLCD_DRIVER_RAM));

  84.     SLCD_DRIVER_Write(0x8020 /*0b 1000 0000 0010 0000*/, 0x0C); // SYS_EN
  85.     SLCD_DRIVER_Write(0x8060 /*0b 1000 0000 0110 0000*/, 0x0C); // LCD_ON
  86.     SLCD_DRIVER_Write(0x8300 /*0b 1000 0011 0000 0000*/, 0x0C); // RC256K
  87.     SLCD_DRIVER_Write(0x8520 /*0b 1000 0101 0010 0000*/, 0x0C); // BIAS 1/3
  88.     SLCD_DRIVER_Write(0x9C60 /*0b 1001 1100 0110 0000*/, 0x0C); // NORMAL

  89.     SLCD_DRIVER_UpdateRAM();
  90. }


5.2.SLCD共用函数设计
  1. #ifndef __SLCD_H
  2. #define __SLCD_H

  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif

  6. #include <stdint.h>

  7. typedef struct
  8. {
  9.     char    ch;             /*字符索引*/
  10.     uint8_t Segment[8];     /*字符对应的段编码*/
  11. } SLCD_8SEG_TypeDef;

  12. #define SLCD_8SEG_NUM       (38)

  13. int SLCD_Search8Segment(const char   ch, uint8_t *Segment);
  14. int SLCD_SearchCOMnSEGn(const char *str, uint8_t *COMn, uint8_t *SEGn);

  15. #ifdef __cplusplus
  16. }
  17. #endif

  18. #endif
  1. #include "slcd.h"
  2. #include "slcd_driver.h"

  3. const SLCD_8SEG_TypeDef SLCD_8SEG_Table[SLCD_8SEG_NUM] =
  4. {
  5.     {' ', {0, 0, 0, 0, 0, 0, 0, 0}},
  6.     {'0', {1, 1, 1, 1, 1, 1, 0, 0}},
  7.     {'1', {0, 1, 1, 0, 0, 0, 0, 0}},
  8.     {'2', {1, 1, 0, 1, 1, 0, 1, 0}},
  9.     {'3', {1, 1, 1, 1, 0, 0, 1, 0}},
  10.     {'4', {0, 1, 1, 0, 0, 1, 1, 0}},
  11.     {'5', {1, 0, 1, 1, 0, 1, 1, 0}},
  12.     {'6', {1, 0, 1, 1, 1, 1, 1, 0}},
  13.     {'7', {1, 1, 1, 0, 0, 0, 0, 0}},
  14.     {'8', {1, 1, 1, 1, 1, 1, 1, 0}},
  15.     {'9', {1, 1, 1, 1, 0, 1, 1, 0}},
  16.     {'A', {1, 1, 1, 0, 1, 1, 1, 0}},
  17.     {'b', {0, 0, 1, 1, 1, 1, 1, 0}},
  18.     {'c', {0, 0, 0, 1, 1, 0, 1, 0}},
  19.     {'C', {1, 0, 0, 1, 1, 1, 0, 0}},
  20.     {'d', {0, 1, 1, 1, 1, 0, 1, 0}},
  21.     {'E', {1, 0, 0, 1, 1, 1, 1, 0}},
  22.     {'F', {1, 0, 0, 0, 1, 1, 1, 0}},
  23.     {'g', {1, 1, 1, 1, 0, 1, 1, 0}},
  24.     {'H', {0, 1, 1, 0, 1, 1, 1, 0}},
  25.     {'h', {0, 0, 1, 0, 1, 1, 1, 0}},
  26.     {'i', {0, 0, 1, 0, 0, 0, 0, 0}},
  27.     {'I', {0, 0, 0, 0, 1, 1, 0, 0}},
  28.     {'J', {0, 1, 1, 1, 1, 0, 0, 0}},
  29.     {'l', {0, 0, 0, 0, 1, 1, 0, 0}},
  30.     {'L', {0, 0, 0, 1, 1, 1, 0, 0}},
  31.     {'n', {0, 0, 1, 0, 1, 0, 1, 0}},
  32.     {'o', {0, 0, 1, 1, 1, 0, 1, 0}},
  33.     {'O', {1, 1, 1, 1, 1, 1, 0, 0}},
  34.     {'P', {1, 1, 0, 0, 1, 1, 1, 0}},
  35.     {'q', {1, 1, 1, 0, 0, 1, 1, 0}},
  36.     {'r', {0, 0, 0, 0, 1, 0, 1, 0}},
  37.     {'S', {1, 0, 1, 1, 0, 1, 1, 0}},
  38.     {'t', {0, 0, 0, 1, 1, 1, 1, 0}},
  39.     {'u', {0, 0, 1, 1, 1, 0, 0, 0}},
  40.     {'U', {0, 1, 1, 1, 1, 1, 0, 0}},
  41.     {'y', {0, 1, 1, 1, 0, 1, 1, 0}},
  42.     {'-', {0, 0, 0, 0, 0, 0, 1, 0}},
  43. };

  44. int SLCD_Search8Segment(const char ch, uint8_t *Segment)
  45. {
  46.     uint8_t i = 0, j = 0;

  47.     for (i = 0; i < SLCD_8SEG_NUM; i++)
  48.     {
  49.         if (SLCD_8SEG_Table[i].ch == ch)
  50.         {
  51.             for (j = 0; j < 8; j++)
  52.             {
  53.                 Segment[j] = SLCD_8SEG_Table[i].Segment[j];
  54.             }

  55.             return (i);
  56.         }
  57.     }

  58.     return (-1);
  59. }

  60. const char SLCD_TruthTable[SLCD_DRIVER_COM][SLCD_DRIVER_SEG][5] =
  61. {
  62.     {"L4  ","W2  ","W1  ","4A  ","4F  ","3A  ","3F  ","2A  ","1F  ","1A  ","2F  ","5D  ","DP5 ","6D  ","DP6 ","7D  ","DP7 ","S1  ","S8  ","8D  ","DP8 ","9D  ","DP9 ","10D ","S9  ","    ","    ","    ","    ","    ","    ","    "},
  63.     {"L3  ","W3  ","T1  ","4B  ","4G  ","3B  ","3G  ","2B  ","1G  ","1B  ","2G  ","5E  ","5C  ","6E  ","6C  ","7E  ","7C  ","S2  ","S7  ","8E  ","8C  ","9E  ","9C  ","10E ","10C ","    ","    ","    ","    ","    ","    ","    "},
  64.     {"L2  ","W4  ","COL3","4C  ","4E  ","3C  ","3E  ","2C  ","1E  ","1C  ","2E  ","5G  ","5B  ","6G  ","6B  ","7G  ","7B  ","S3  ","S6  ","8G  ","8B  ","9G  ","9B  ","10G ","10B ","    ","    ","    ","    ","    ","    ","    "},
  65.     {"L1  ","W5  ","COL2","COL1","4D  ","DP3 ","3D  ","DP2 ","1D  ","DP1 ","2D  ","5F  ","5A  ","6F  ","6A  ","7F  ","7A  ","S4  ","S5  ","8F  ","8A  ","9F  ","9A  ","10F ","10A ","    ","    ","    ","    ","    ","    ","    "},
  66. };

  67. int SLCD_SearchCOMnSEGn(const char *str, uint8_t *COMn, uint8_t *SEGn)
  68. {
  69.     uint8_t i = 0, j = 0;

  70.     for (i = 0; i < SLCD_DRIVER_COM; i++)
  71.     {
  72.         for (j = 0; j < SLCD_DRIVER_SEG; j++)
  73.         {
  74.             if (strcmp(str, SLCD_TruthTable[i][j]) == 0)
  75.             {
  76.                 *COMn = i;
  77.                 *SEGn = j;

  78.                 return (0);
  79.             }
  80.         }
  81.     }

  82.     *COMn = 0xFF;
  83.     *SEGn = 0xFF;

  84.     return (-1);
  85. }

5.3.SLCD API功能设计
  1. #ifndef __SLCD_API_H
  2. #define __SLCD_API_H

  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif

  6. #include <stdint.h>

  7. void SLCD_DisplayDigit(uint8_t Index, char ch);
  8. void SLCD_DisplayPoint(uint8_t Index, uint8_t State);
  9. void SLCD_DisplayCOL(uint8_t Index, uint8_t State);
  10. void SLCD_DisplayW(uint8_t Index, uint8_t State);
  11. void SLCD_DisplayL(uint8_t Index, uint8_t State);
  12. void SLCD_DisplayS(uint8_t Index, uint8_t State);
  13. void SLCD_DisplayT(uint8_t Index, uint8_t State);
  14. void SLCD_DisplayALL(void);
  15. void SLCD_DisplayCLR(void);

  16. #ifdef __cplusplus
  17. }
  18. #endif

  19. #endif
  1. #include "slcd_api.h"
  2. #include "slcd.h"
  3. #include "slcd_driver.h"

  4. const char DigitTable[10][7][5] =
  5. {
  6.     {"1A  ", "1B  ", "1C  ", "1D  ", "1E  ", "1F  ", "1G  "},
  7.     {"2A  ", "2B  ", "2C  ", "2D  ", "2E  ", "2F  ", "2G  "},
  8.     {"3A  ", "3B  ", "3C  ", "3D  ", "3E  ", "3F  ", "3G  "},
  9.     {"4A  ", "4B  ", "4C  ", "4D  ", "4E  ", "4F  ", "4G  "},
  10.     {"5A  ", "5B  ", "5C  ", "5D  ", "5E  ", "5F  ", "5G  "},
  11.     {"6A  ", "6B  ", "6C  ", "6D  ", "6E  ", "6F  ", "6G  "},
  12.     {"7A  ", "7B  ", "7C  ", "7D  ", "7E  ", "7F  ", "7G  "},
  13.     {"8A  ", "8B  ", "8C  ", "8D  ", "8E  ", "8F  ", "8G  "},
  14.     {"9A  ", "9B  ", "9C  ", "9D  ", "9E  ", "9F  ", "9G  "},
  15.     {"10A ", "10B ", "10C ", "10D ", "10E ", "10F ", "10G "}
  16. };

  17. void SLCD_DisplayDigit(uint8_t Index, char ch)
  18. {
  19.     uint8_t i = 0,  Segment[8];
  20.     uint8_t COMn = 0, SEGn = 0;

  21.     if ((Index >= 1) && (Index <= 10))
  22.     {
  23.         Index--;

  24.         if (SLCD_Search8Segment(ch, Segment) != -1)
  25.         {
  26.             for (i = 0; i < 7; i++)
  27.             {
  28.                 if (SLCD_SearchCOMnSEGn(DigitTable[Index][i], &COMn, &SEGn) != -1)
  29.                 {
  30.                     SLCD_DRIVER_ModifyRAM(COMn, SEGn, Segment[i]);
  31.                 }
  32.             }

  33.             SLCD_DRIVER_UpdateRAM();
  34.         }
  35.     }
  36. }

  37. const char DP_Table[9][5] =
  38. {
  39.     "DP1 ", "DP2 ", "DP3 ", "DP4 ","DP5 ","DP6 ","DP7 ","DP8 ","DP9 "
  40. };

  41. void SLCD_DisplayPoint(uint8_t Index, uint8_t State)
  42. {
  43.     uint8_t COMn = 0, SEGn = 0;

  44.     if ((Index >= 1) && (Index <= 9))
  45.     {
  46.         Index--;

  47.         if (SLCD_SearchCOMnSEGn(DP_Table[Index], &COMn, &SEGn) != -1)
  48.         {
  49.             SLCD_DRIVER_ModifyRAM(COMn, SEGn, State);
  50.         }

  51.         SLCD_DRIVER_UpdateRAM();
  52.     }
  53. }

  54. const char COL_Table[3][5] =
  55. {
  56.     "COL1", "COL2", "COL3"
  57. };

  58. void SLCD_DisplayCOL(uint8_t Index, uint8_t State)
  59. {
  60.     uint8_t COMn = 0, SEGn = 0;

  61.     if ((Index >= 1) && (Index <= 3))
  62.     {
  63.         Index--;

  64.         if (SLCD_SearchCOMnSEGn(COL_Table[Index], &COMn, &SEGn) != -1)
  65.         {
  66.             SLCD_DRIVER_ModifyRAM(COMn, SEGn, State);
  67.         }

  68.         SLCD_DRIVER_UpdateRAM();
  69.     }
  70. }

  71. const char W_Table[5][5] =
  72. {
  73.     "W1  ", "W2  ", "W3  ", "W4  ", "W5  "
  74. };

  75. void SLCD_DisplayW(uint8_t Index, uint8_t State)
  76. {
  77.     uint8_t COMn = 0, SEGn = 0;

  78.     if ((Index >= 1) && (Index <= 5))
  79.     {
  80.         Index--;

  81.         if (SLCD_SearchCOMnSEGn(W_Table[Index], &COMn, &SEGn) != -1)
  82.         {
  83.             SLCD_DRIVER_ModifyRAM(COMn, SEGn, State);
  84.         }

  85.         SLCD_DRIVER_UpdateRAM();
  86.     }
  87. }

  88. const char L_Table[4][5] =
  89. {
  90.     "L1  ", "L2  ", "L3  ", "L4  "
  91. };

  92. void SLCD_DisplayL(uint8_t Index, uint8_t State)
  93. {
  94.     uint8_t COMn = 0, SEGn = 0;

  95.     if ((Index >= 1) && (Index <= 4))
  96.     {
  97.         Index--;

  98.         if (SLCD_SearchCOMnSEGn(L_Table[Index], &COMn, &SEGn) != -1)
  99.         {
  100.             SLCD_DRIVER_ModifyRAM(COMn, SEGn, State);
  101.         }

  102.         SLCD_DRIVER_UpdateRAM();
  103.     }
  104. }

  105. const char S_Table[9][5] =
  106. {
  107.     "S1  ", "S2  ", "S3  ", "S4  ", "S5  ", "S6  ", "S7  ", "S8  ", "S9  "
  108. };

  109. void SLCD_DisplayS(uint8_t Index, uint8_t State)
  110. {
  111.     uint8_t COMn = 0, SEGn = 0;

  112.     if ((Index >= 1) && (Index <= 9))
  113.     {
  114.         Index--;

  115.         if (SLCD_SearchCOMnSEGn(S_Table[Index], &COMn, &SEGn) != -1)
  116.         {
  117.             SLCD_DRIVER_ModifyRAM(COMn, SEGn, State);
  118.         }

  119.         SLCD_DRIVER_UpdateRAM();
  120.     }
  121. }

  122. const char T_Table[1][5] =
  123. {
  124.     "T1  "
  125. };

  126. void SLCD_DisplayT(uint8_t Index, uint8_t State)
  127. {
  128.     uint8_t COMn = 0, SEGn = 0;

  129.     if (Index == 1)
  130.     {
  131.         Index--;

  132.         if (SLCD_SearchCOMnSEGn(T_Table[Index], &COMn, &SEGn) != -1)
  133.         {
  134.             SLCD_DRIVER_ModifyRAM(COMn, SEGn, State);
  135.         }

  136.         SLCD_DRIVER_UpdateRAM();
  137.     }
  138. }

  139. void SLCD_DisplayALL(void)
  140. {
  141.     SLCD_DRIVER_Fill(0xFF);
  142. }

  143. void SLCD_DisplayCLR(void)
  144. {
  145.     SLCD_DRIVER_Fill(0x00);
  146. }

5.4.Protocol自定义控制协议
  1. #ifndef __PROTOCOL_H
  2. #define __PROTOCOL_H

  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif

  6. #include <stdint.h>

  7. void ProtocolAnalyzing(uint8_t *Buffer, uint8_t Length);

  8. #ifdef __cplusplus
  9. }
  10. #endif

  11. #endif
  1. #include "protocol.h"
  2. #include "slcd_api.h"

  3. uint8_t Protocol_ASCII_TO_Hex(char ch)
  4. {
  5.     char HEX_Table[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

  6.     for (uint8_t i = 0; i < 16; i++)
  7.     {
  8.         if (ch == HEX_Table[i])
  9.         {
  10.             return (i);
  11.         }
  12.     }

  13.     return (0xFF);
  14. }

  15. void ProtocolAnalyzing(uint8_t *Buffer, uint8_t Length)
  16. {
  17.     if (Length == 3)
  18.     {
  19.         if (Buffer[1] == 'F')
  20.         {
  21.             SLCD_DisplayALL();
  22.         }
  23.         else if (Buffer[1] == 'E')
  24.         {
  25.             SLCD_DisplayCLR();
  26.         }
  27.         else
  28.         {
  29.         }
  30.     }

  31.     /* @T[T1]# */
  32.     if (Length == 4)
  33.     {
  34.         if ((Buffer[0] == '@') && (Buffer[3] == '#'))
  35.         {
  36.             if (Buffer[1] == 'T')
  37.             {
  38.                 SLCD_DisplayT(1, Buffer[2] - 0x30);
  39.             }           
  40.         }
  41.     }

  42.     /* @D[Index][ch]# */
  43.     /* @P[Index][State]# */
  44.     /* @C[Index][State]# */
  45.     /* @W[Index][State]# */
  46.     /* @L[Index][State]# */
  47.     /* @S[Index][State]# */
  48.     /* @T[Index][State]# */
  49.     if (Length == 5)
  50.     {
  51.         if ((Buffer[0] == '@') && (Buffer[4] == '#'))
  52.         {
  53.             if (Buffer[1] == 'D')
  54.             {
  55.                 SLCD_DisplayDigit(Protocol_ASCII_TO_Hex(Buffer[2]), Buffer[3]);
  56.             }
  57.             else if (Buffer[1] == 'P')
  58.             {
  59.                 SLCD_DisplayPoint(Protocol_ASCII_TO_Hex(Buffer[2]), Buffer[3] - 0x30);
  60.             }
  61.             else if (Buffer[1] == 'C')
  62.             {
  63.                 SLCD_DisplayCOL(  Protocol_ASCII_TO_Hex(Buffer[2]), Buffer[3] - 0x30);
  64.             }
  65.             else if (Buffer[1] == 'W')
  66.             {
  67.                 SLCD_DisplayW(    Protocol_ASCII_TO_Hex(Buffer[2]), Buffer[3] - 0x30);
  68.             }
  69.             else if (Buffer[1] == 'L')
  70.             {
  71.                 SLCD_DisplayL(    Protocol_ASCII_TO_Hex(Buffer[2]), Buffer[3] - 0x30);
  72.             }
  73.             else if (Buffer[1] == 'S')
  74.             {
  75.                 SLCD_DisplayS(    Protocol_ASCII_TO_Hex(Buffer[2]), Buffer[3] - 0x30);
  76.             }
  77.             else if (Buffer[1] == 'T')
  78.             {
  79.                 SLCD_DisplayT(    Protocol_ASCII_TO_Hex(Buffer[2]), Buffer[3] - 0x30);
  80.             }
  81.             else
  82.             {
  83.             }
  84.         }
  85.     }

  86.     /* @C[COL1][COL2][COL3]# */
  87.     if (Length == 6)
  88.     {
  89.         if ((Buffer[0] == '@') && (Buffer[5] == '#'))
  90.         {
  91.             if (Buffer[1] == 'C')
  92.             {
  93.                 SLCD_DisplayCOL(1, Buffer[2] - 0x30);
  94.                 SLCD_DisplayCOL(2, Buffer[3] - 0x30);
  95.                 SLCD_DisplayCOL(3, Buffer[4] - 0x30);
  96.             }
  97.         }
  98.     }

  99.     /* @L[L1][L2][L3][L4]# */
  100.     if (Length == 7)
  101.     {
  102.         if ((Buffer[0] == '@') && (Buffer[6] == '#'))
  103.         {
  104.             if (Buffer[1] == 'L')
  105.             {
  106.                 SLCD_DisplayL(1, Buffer[2] - 0x30);
  107.                 SLCD_DisplayL(2, Buffer[3] - 0x30);
  108.                 SLCD_DisplayL(3, Buffer[4] - 0x30);
  109.                 SLCD_DisplayL(4, Buffer[5] - 0x30);
  110.             }
  111.         }
  112.     }

  113.     /* @W[W1][W2][W3][W4][W5]# */
  114.     if (Length == 8)
  115.     {
  116.         if ((Buffer[0] == '@') && (Buffer[7] == '#'))
  117.         {
  118.             if (Buffer[1] == 'W')
  119.             {
  120.                 SLCD_DisplayW(1, Buffer[2] - 0x30);
  121.                 SLCD_DisplayW(2, Buffer[3] - 0x30);
  122.                 SLCD_DisplayW(3, Buffer[4] - 0x30);
  123.                 SLCD_DisplayW(4, Buffer[5] - 0x30);
  124.                 SLCD_DisplayW(5, Buffer[6] - 0x30);
  125.             }
  126.         }
  127.     }

  128.     /* @P[DP1][DP2][DP3][DP4][DP5][DP6][DP7][DP8][DP9]# */
  129.     /* @S[S1][S2][S3][S4][S5][S6][S7][S8][S9]# */
  130.     if (Length == 12)
  131.     {
  132.         if ((Buffer[0] == '@') && (Buffer[11] == '#'))
  133.         {
  134.             if (Buffer[1] == 'P')
  135.             {
  136.                 SLCD_DisplayPoint(1, Buffer[2]  - 0x30);
  137.                 SLCD_DisplayPoint(2, Buffer[3]  - 0x30);
  138.                 SLCD_DisplayPoint(3, Buffer[4]  - 0x30);
  139.                 SLCD_DisplayPoint(4, Buffer[5]  - 0x30);
  140.                 SLCD_DisplayPoint(5, Buffer[6]  - 0x30);
  141.                 SLCD_DisplayPoint(6, Buffer[7]  - 0x30);
  142.                 SLCD_DisplayPoint(7, Buffer[8]  - 0x30);
  143.                 SLCD_DisplayPoint(8, Buffer[9]  - 0x30);
  144.                 SLCD_DisplayPoint(9, Buffer[10] - 0x30);
  145.             }
  146.             else if (Buffer[1] == 'S')
  147.             {
  148.                 SLCD_DisplayS(1, Buffer[2]  - 0x30);
  149.                 SLCD_DisplayS(2, Buffer[3]  - 0x30);
  150.                 SLCD_DisplayS(3, Buffer[4]  - 0x30);
  151.                 SLCD_DisplayS(4, Buffer[5]  - 0x30);
  152.                 SLCD_DisplayS(5, Buffer[6]  - 0x30);
  153.                 SLCD_DisplayS(6, Buffer[7]  - 0x30);
  154.                 SLCD_DisplayS(7, Buffer[8]  - 0x30);
  155.                 SLCD_DisplayS(8, Buffer[9]  - 0x30);
  156.                 SLCD_DisplayS(9, Buffer[10] - 0x30);
  157.             }
  158.             else
  159.             {
  160.             }
  161.         }
  162.     }

  163.     /* @D[1][2][3][4][5][6][7][8][9][10]# */
  164.     if (Length == 13)
  165.     {
  166.         if ((Buffer[0] == '@') && (Buffer[12] == '#'))
  167.         {
  168.             if (Buffer[1] == 'D')
  169.             {
  170.                 SLCD_DisplayDigit(1,  Buffer[2]);
  171.                 SLCD_DisplayDigit(2,  Buffer[3]);
  172.                 SLCD_DisplayDigit(3,  Buffer[4]);
  173.                 SLCD_DisplayDigit(4,  Buffer[5]);
  174.                 SLCD_DisplayDigit(5,  Buffer[6]);
  175.                 SLCD_DisplayDigit(6,  Buffer[7]);
  176.                 SLCD_DisplayDigit(7,  Buffer[8]);
  177.                 SLCD_DisplayDigit(8,  Buffer[9]);
  178.                 SLCD_DisplayDigit(9,  Buffer[10]);
  179.                 SLCD_DisplayDigit(10, Buffer[11]);
  180.             }
  181.         }
  182.     }
  183. }

6.显示效果
6.1.MM32G0001驱动SLCD显示效果
1.jpg

6.2.MM32F0010驱动SLCD显示效果
2.jpg

6.3.MM32F0020驱动SLCD显示效果
3.jpg

7.附件资料
7.1.GDC0689S(T)P10V3B显示屏: GDC0689S(T)P10V3B.pdf (309.4 KB, 下载次数: 16)
7.2.GDC04212S(T)P10V3B显示屏: GDC04212S(T)P10V3B.pdf (220.54 KB, 下载次数: 16)
7.3.GDC04362S(T)P10V3T显示屏: GDC04362S(T)P10V3T.pdf (419.84 KB, 下载次数: 17)
7.4.MM32G0001原理图: Schematic_MM32G0001_LCD.pdf (71.6 KB, 下载次数: 20)
7.5.MM32F0010原理图: Schematic_MM32F0010_LCD.pdf (71.8 KB, 下载次数: 14)
7.6.MM32F0020原理图: Schematic_MM32F0020_LCD.pdf (78.62 KB, 下载次数: 13)
7.7.MM32G0001工程源码: MM32G0001.zip (568.38 KB, 下载次数: 39)
7.8.MM32F0010工程源码: MM32F0010.zip (591.5 KB, 下载次数: 18)
7.9.MM32F0020工程源码: MM32F0020.zip (603.62 KB, 下载次数: 24)


8.扩展应用
以上实现的段码液晶显示屏程序架构同样适用于段码形式的LED显示屏上,后面会分享一个段码LED应用的多功能闹钟,期待ing……

打赏榜单

21小跑堂 打赏了 60.00 元 2024-08-08
理由:恭喜通过原创审核!期待您更多的原创作品~

评论

电路完整,代码详细,架构清晰,一问解决MM32上的段码液晶显示屏的使用方式。极具参考价值。  发表于 2024-8-8 15:56
chenqianqian 发表于 2024-8-8 08:10 来自手机 | 显示全部楼层
这个是段码液晶,显示的内容是固定的
 楼主| xld0932 发表于 2024-8-8 09:27 | 显示全部楼层
chenqianqian 发表于 2024-8-8 08:10
这个是段码液晶,显示的内容是固定的

段码液晶屏,段位设计是固定的,显示的内容是通过组合可变的
tpgf 发表于 2024-8-10 15:58 | 显示全部楼层
通用段码液晶显示屏是一种广泛应用于各类电子设备中的显示技术。这种屏幕通过液晶显示技术来展示数字、字符和简单图形,因其低功耗、高可靠性和长寿命等优点而被广泛采用
hellobug 发表于 2024-8-11 21:07 | 显示全部楼层
不错的分享。最近在看段码屏,使用的是HT1623的驱动芯片。不过段码屏主要都要定制生产,有时候量少了不太划算。
beyikyo 发表于 2024-10-31 16:56 | 显示全部楼层
详细介绍了基于 MM32 的通用段码液晶显示屏程序架构,从硬件设计到程序实现,内容全面且实用,很有收获。
suncat0504 发表于 2024-11-7 18:14 | 显示全部楼层
谢谢分享!感觉段码液晶显示屏的驱动比图形的麻烦,占用IO口也多。另外图形点阵的液晶现在价格也降下来了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:King.Xu

77

主题

3023

帖子

38

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