[开发板与模块] 【ESK32-30519 + ESK32-21001测评】04.自定义LED数码管显示

[复制链接]
 楼主| xld0932 发表于 2022-10-14 11:18 | 显示全部楼层 |阅读模式
<
本帖最后由 eltonchang2001 于 2022-11-9 11:54 编辑

HT32F54253芯片集成了LED控制器,用来驱动8段数码管进行显示,相比于之前MCU+LED驱动芯片的方案来说,集成度提高的同时,也节省了BOM成本;给需要LED显示应用的客户了提供了最优解决方案。具体的LEDC特性如下所示:
驱动多达 N 8 段数码管
对于 HT32F54231/HT32F54241N = 8
对于 HT32F54243/HT32F54253N = 12
支持共阳极或共阴极的 8 段数码管
支持帧中断
三种频率来源: LSILSEPCLK
可由死区时间设定控制 LED /
LED 控制器用来驱动 8 段数码管, HT32F54231/HT32F54241 系列单片机最多可以驱动 8 8段数码管, HT32F54243/HT32F54253 系列单片机最多可以驱动 12 8 段数码管。可根据数码管数量不同,弹性配置 COM 的出脚位置和序号,一个完整的帧会依序由小到大扫描所使能的COM 口。假设使用到 4 8 段数码管并且始能 COM0COM5COM6 COM7,则一个完整的帧会依序扫描 COM0COM5COM6 COM7,且每一段 COM 口扫描时间均等于 1/4 Frame
每一段
COM 口扫描时间可细分成死区时间 Duty 以及 COM Duty,可通过调整死区时间 Duty来改变 LED 亮暗。


原理图
1.png 2.png


实现功能
  • 对LED的控制引脚COM和SEG进行初始化,对LEDC的控制时序和参数进行配置;通过调用MultiTimer组件实现LED字符的循环显示;
  • 通过结构体定义38个LED可显示字符的编码对照表,ch表示显示的字符,data表示显示ch时各个SEG段的状态,1表示点亮,0表示熄灭;data的bit0~bit7依次表示abcdefg以及dp这8个段;
  • 在显示一个字符时,通过查表的方式先找到ch对应的data,即SEG对照表,然后再根据原理图的硬件连接,将SEG对照表换算成实际的显示数据,具体参考LEDC_GetCode这个函数的实现;


实现代码
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "LEDC.h"


  3. /* Private typedef -----------------------------------------------------------*/
  4. typedef struct
  5. {
  6.     char    ch;
  7.     uint8_t Data;
  8. } LED_CODING_TypeDef;


  9. /* Private define ------------------------------------------------------------*/
  10. /* Private macro -------------------------------------------------------------*/


  11. /* Private variables ---------------------------------------------------------*/
  12. MultiTimer LEDC_MultiTimer;


  13. /* Private variables ---------------------------------------------------------*/
  14. const LED_CODING_TypeDef LED_CODE_Table[38] =
  15. {
  16.     {' ', 0x00},
  17.     {'0', 0x3F},
  18.     {'1', 0x06},
  19.     {'2', 0x5B},
  20.     {'3', 0x4F},
  21.     {'4', 0x66},
  22.     {'5', 0x6D},
  23.     {'6', 0x7D},
  24.     {'7', 0x07},
  25.     {'8', 0x7F},
  26.     {'9', 0x6F},
  27.     {'A', 0x77},
  28.     {'b', 0x7C},
  29.     {'c', 0x58},
  30.     {'C', 0x39},
  31.     {'d', 0x5E},
  32.     {'E', 0x79},
  33.     {'F', 0x71},
  34.     {'g', 0x6F},
  35.     {'H', 0x76},
  36.     {'h', 0x74},
  37.     {'i', 0x04},
  38.     {'I', 0x30},
  39.     {'J', 0x1E},
  40.     {'l', 0x30},
  41.     {'L', 0x38},
  42.     {'n', 0x54},
  43.     {'o', 0x5C},
  44.     {'O', 0x3F},
  45.     {'P', 0x73},
  46.     {'q', 0x67},
  47.     {'r', 0x50},
  48.     {'S', 0x6D},
  49.     {'t', 0x78},
  50.     {'u', 0x1C},
  51.     {'U', 0x3E},
  52.     {'y', 0x6E},
  53.     {'-', 0x40},
  54. };


  55. /* Private function prototypes -----------------------------------------------*/
  56. /* Private functions ---------------------------------------------------------*/


  57. /* Exported variables --------------------------------------------------------*/
  58. /* Exported function prototypes ----------------------------------------------*/


  59. /*******************************************************************************
  60. * [url=home.php?mod=space&uid=247401]@brief[/url]      
  61. * @param      
  62. * @retval      
  63. * [url=home.php?mod=space&uid=93590]@Attention[/url]   
  64. *******************************************************************************/
  65. uint8_t LEDC_GetCode(char ch)
  66. {
  67.     uint8_t SEGn[8] =
  68.     {
  69.         0x10, /* a :SEG4 */
  70.         0x80, /* b :SEG7 */
  71.         0x04, /* c :SEG2 */
  72.         0x20, /* d :SEG5 */
  73.         0x08, /* e :SEG3 */
  74.         0x01, /* f :SEG0 */
  75.         0x40, /* g :SEG6 */
  76.         0x02, /* dp:SEG1 */
  77.     };

  78.     for(uint8_t i = 0; i < 38; i++)
  79.     {
  80.         if(ch == LED_CODE_Table[i].ch)
  81.         {
  82.             uint8_t Data = 0;
  83.             uint8_t Temp = LED_CODE_Table[i].Data;

  84.             for(uint8_t j = 0; j < 8; j++)
  85.             {
  86.                 if((Temp >> j) & 0x01) Data += SEGn[j];
  87.             }

  88.             return Data;
  89.         }
  90.     }

  91.     return 0x00;
  92. }


  93. /*******************************************************************************
  94. * [url=home.php?mod=space&uid=247401]@brief[/url]      
  95. * @param      
  96. * @retval      
  97. * [url=home.php?mod=space&uid=93590]@Attention[/url]   
  98. *******************************************************************************/
  99. void LEDC_MultiTimerCallback(MultiTimer *timer, void *userData)
  100. {
  101.     static uint8_t Index = 0;

  102.     LEDC_SetData(4, LEDC_GetCode(LED_CODE_Table[Index].ch));
  103.     LEDC_SetData(5, LEDC_GetCode(LED_CODE_Table[Index].ch));
  104.     LEDC_SetData(6, LEDC_GetCode(LED_CODE_Table[Index].ch));
  105.     LEDC_SetData(7, LEDC_GetCode(LED_CODE_Table[Index].ch));

  106.     Index = (Index + 1) % 38;

  107.     MultiTimerStart(&LEDC_MultiTimer, 250, LEDC_MultiTimerCallback, "LEDC");
  108. }


  109. /*******************************************************************************
  110. * [url=home.php?mod=space&uid=247401]@brief[/url]      
  111. * @param      
  112. * @retval      
  113. * [url=home.php?mod=space&uid=93590]@Attention[/url]   
  114. *******************************************************************************/
  115. void LEDC_Configuration(void)
  116. {
  117.     LEDC_InitTypeDef LEDC_InitStruct;

  118.     CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
  119.     CKCUClock.Bit.LEDC       = 1;
  120.     CKCUClock.Bit.AFIO       = 1;
  121.     CKCU_PeripClockConfig(CKCUClock, ENABLE);

  122.     /* SEG0~7 */
  123.     AFIO_GPxConfig(GPIO_PA, AFIO_PIN_0, AFIO_FUN_LEDC);
  124.     AFIO_GPxConfig(GPIO_PA, AFIO_PIN_1, AFIO_FUN_LEDC);
  125.     AFIO_GPxConfig(GPIO_PA, AFIO_PIN_2, AFIO_FUN_LEDC);
  126.     AFIO_GPxConfig(GPIO_PA, AFIO_PIN_3, AFIO_FUN_LEDC);
  127.     AFIO_GPxConfig(GPIO_PD, AFIO_PIN_4, AFIO_FUN_LEDC);
  128.     AFIO_GPxConfig(GPIO_PD, AFIO_PIN_5, AFIO_FUN_LEDC);
  129.     AFIO_GPxConfig(GPIO_PD, AFIO_PIN_2, AFIO_FUN_LEDC);
  130.     AFIO_GPxConfig(GPIO_PA, AFIO_PIN_7, AFIO_FUN_LEDC);

  131.     /* COM0~4 */
  132.     AFIO_GPxConfig(GPIO_PC, AFIO_PIN_4, AFIO_FUN_LEDC);
  133.     AFIO_GPxConfig(GPIO_PC, AFIO_PIN_5, AFIO_FUN_LEDC);
  134.     AFIO_GPxConfig(GPIO_PC, AFIO_PIN_6, AFIO_FUN_LEDC);
  135.     AFIO_GPxConfig(GPIO_PC, AFIO_PIN_7, AFIO_FUN_LEDC);

  136.     /* Frame = fCK_LED / (LEDC_DutyClockNumber * COM Number) */
  137.     /*       = 1600 / (8*4) =  50Hz */
  138.     LEDC_InitStruct.LEDC_ClockSource     = LEDC_SRC_LSI;    /* LSI = 32Khz */
  139.     LEDC_InitStruct.LEDC_ClockPrescaler  = 20 - 1;          /* fCK_LED = 32Khz / 20 = 1600 Hz */
  140.     LEDC_InitStruct.LEDC_DutyClockNumber = LEDC_DTYNUM_8;   /* Duty CLock Number = 8 Clock */
  141.     LEDC_InitStruct.LEDC_COMxEN          = LEDC_COM4EN | LEDC_COM5EN | LEDC_COM6EN | LEDC_COM7EN;

  142.     /* Change the brightness, the parameter range is 0~Duty (CLock Number-1.) */
  143.     /* 0: the brightest, 7: the darkest. */
  144.     LEDC_InitStruct.LEDC_DeadTime        = 0;
  145.     LEDC_Init(&LEDC_InitStruct);

  146.     /* Set the LEDC mode to COMMON_CATHODE. */
  147.     LEDC_SetPolarityMode(LEDC_COM4POL | LEDC_COM5POL | LEDC_COM6POL | LEDC_COM7POL,
  148.                          LEDC_SEG0POL | LEDC_SEG1POL | LEDC_SEG2POL | LEDC_SEG3POL | LEDC_SEG4POL | LEDC_SEG5POL | LEDC_SEG6POL | LEDC_SEG7POL,
  149.                          COMMON_CATHODE);

  150.     LEDC_IntConfig(ENABLE);
  151.     NVIC_EnableIRQ(LEDC_IRQn);

  152.     LEDC_Cmd(ENABLE);

  153.     MultiTimerStart(&LEDC_MultiTimer, 250, LEDC_MultiTimerCallback, "LEDC");
  154. }


  155. /*******************************************************************************
  156. * @brief      
  157. * @param      
  158. * @retval      
  159. * @attention   
  160. *******************************************************************************/
  161. void LEDC_IRQHandler(void)
  162. {
  163.     if(LEDC_GetFlagStatus())
  164.     {
  165.         LEDC_ClearFlagStatus();
  166.     }
  167. }


运行结果



软件工程源代码
Project.zip (974.68 KB, 下载次数: 15)
  
claretttt 发表于 2022-11-1 17:54 | 显示全部楼层
LED数码管为什么要用三极管驱动
sdCAD 发表于 2022-11-1 18:07 | 显示全部楼层
动态扫描显示方式,适合于多位数码管的电路。
tifmill 发表于 2022-11-1 18:28 | 显示全部楼层
数码管用多少伏电压驱动               
macpherson 发表于 2022-11-1 18:59 | 显示全部楼层
用什么芯片驱动8段 数码管比较好?
jimmhu 发表于 2022-11-1 19:38 | 显示全部楼层
CT1642这一款数码管驱动IC怎么样?
ulystronglll 发表于 2022-11-1 20:21 | 显示全部楼层
LED数码管 要驱动也要限流吗  
updownq 发表于 2022-11-2 16:54 | 显示全部楼层
如何用最少的单片机端口驱动多个数码管?
usysm 发表于 2022-11-2 17:45 | 显示全部楼层
cd4511是一个用于驱动共阴极 led (数码管)显示器的 bcd 码—七段码译码器
chenci2013 发表于 2022-11-2 18:36 | 显示全部楼层
驱动led数码管,如何估算限流电阻  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:King.Xu

77

主题

3023

帖子

38

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:King.Xu

77

主题

3023

帖子

38

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