打印
[开发板与模块]

【ESK32-30519 + ESK32-21001测评】数码管显示及其原理

[复制链接]
712|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2022-9-17 12:14 编辑

在ESK32-30519 开发板上配置了数码管显示器,可实现相应数据的显示,其电路原理图如图1所示。

图1 数码管电路


为此,该数码管的引脚定义如下:
  #defineHTCFG_LEDC_COM_D1                        4
  #defineHTCFG_LEDC_COM_D2                       5
  #defineHTCFG_LEDC_COM_D3                       6
  #defineHTCFG_LEDC_COM_D4                        7

  #define_HTCFG_LEDC_COM0_GPIO_PORT               C  // DIG1
  #define_HTCFG_LEDC_COM0_GPIO_PIN                4
  #define_HTCFG_LEDC_COM1_GPIO_PORT              C  // DIG2
  #define_HTCFG_LEDC_COM1_GPIO_PIN               5
  #define_HTCFG_LEDC_COM2_GPIO_PORT               C  // DIG3
  #define_HTCFG_LEDC_COM2_GPIO_PIN               6
  #define_HTCFG_LEDC_COM3_GPIO_PORT              C   // DIG4
  #define_HTCFG_LEDC_COM3_GPIO_PIN               7

  #define_HTCFG_LEDC_SEG0_GPIO_PORT               A    // F
  #define_HTCFG_LEDC_SEG0_GPIO_PIN                0
  #define_HTCFG_LEDC_SEG1_GPIO_PORT              A    // DP
  #define_HTCFG_LEDC_SEG1_GPIO_PIN               1
  #define_HTCFG_LEDC_SEG2_GPIO_PORT              A    // C
  #define_HTCFG_LEDC_SEG2_GPIO_PIN               2
  #define _HTCFG_LEDC_SEG3_GPIO_PORT               A    // E
  #define_HTCFG_LEDC_SEG3_GPIO_PIN               3
  #define_HTCFG_LEDC_SEG4_GPIO_PORT              D    // A
  #define_HTCFG_LEDC_SEG4_GPIO_PIN               4
  #define_HTCFG_LEDC_SEG5_GPIO_PORT              D    // D
  #define _HTCFG_LEDC_SEG5_GPIO_PIN                5
  #define_HTCFG_LEDC_SEG6_GPIO_PORT              D    // G
  #define_HTCFG_LEDC_SEG6_GPIO_PIN               2
  #define_HTCFG_LEDC_SEG7_GPIO_PORT              A    // B
  #define_HTCFG_LEDC_SEG7_GPIO_PIN               7


为实现数码的显示,其段码的定义如下:
const u8 NumberChar[]={
  /* a: Seg4(0x10), b:Seg7(0x80), c: Seg2(0x04), d: Seg5(0x20),
     e: Seg3(0x08), f:Seg0(0x01), g: Seg6(0x40), dp: Seg1(0x02) */
  0xBD, /* '0' =a+b+c+d+e+f      = 0x10 + 0x80 + 0x04 +0x20 + 0x08 + 0x01               = 0xBD*/
  0x84, /* '1' =   b+c+          =        0x80 + 0x04                                    = 0x84 */
  0xF8, /* '2' = a+b  +d+e +g    = 0x10 + 0x80 +        0x20 + 0x08 +      + 0x40        = 0xF8 */
  0xF4, /* '3' = a+b+c+d    +g   = 0x10 + 0x80 + 0x04 + 0x20 +            + 0x40        = 0xF4 */
  0xC5, /* '4' =   b+c   +f+g    =        0x80 + 0x04               + 0x01 + 0x40        = 0xC5 */
  0x75, /* '5' = a  +c+d +f+g    = 0x10        + 0x04 + 0x20        + 0x01 + 0x40        = 0x75 */
  0x7D, /* '6' = a  +c+d+e+f+g   = 0x10        + 0x04 + 0x20 + 0x08+ 0x01 + 0x40        = 0x7D */
  0x95, /* '7' = a+b+c    +f     = 0x10 + 0x80 + 0x04              + 0x01               = 0x95 */
  0xFD, /* '8' =a+b+c+d+e+f+g    = 0x10 + 0x80 + 0x04 +0x20 + 0x08 + 0x01 + 0x40        = 0xFD*/
  0xF5, /* '9' = a+b+c+d  +f+g   = 0x10 + 0x80 + 0x04 + 0x20       + 0x01 + 0x40        = 0xF5 */
  0x02  /* '.' =               dp =                                                 0x02 = 0x02 */
};

以显示“1”为例,需点亮B段和C段,故输出的段码为10000100,即0x84。

那么又该如何来理解下面的数码管显示的主程序呢?
int main(void)
{
  u8 CharIndex=0;
  u8 CharSize = sizeof(NumberChar);
  GPIO_Configuration();
  LEDC_Configuration();
  while (1)
  {
    if(gIsUpdateChar)
    {
      /* The character has been displayed for 1 second, and the new character will be replaced.*/
      LEDC_SetData(HTCFG_LEDC_COM_D1,  NumberChar[CharIndex++%CharSize]);
      LEDC_SetData(HTCFG_LEDC_COM_D2,  NumberChar[CharIndex++%CharSize]);
      LEDC_SetData(HTCFG_LEDC_COM_D3,  NumberChar[CharIndex++%CharSize]);
      LEDC_SetData(HTCFG_LEDC_COM_D4,  NumberChar[CharIndex++%CharSize]);
      gIsUpdateChar = FALSE;
    }
  }
}

其实它的作用就是依次从左到右来输出每一位的段码值来实现显示,其输出的段码也可以说是显示内容是靠变量NumberChar[CharIndex来控制的,每显示一轮该变量的值就向后移动1位。
为防止溢出,则是通过取余来实现内容的滚动显示。而每轮显示的延时值,则是通过中断处理来完成的,其判别标识则是变量gIsUpdateChar。
在为例程添加工程文件及修改关联文件路径的情况下,通过下载即可见到图2和图3所示的效果。

图2 显示“2345”

图3 显示“4567”
那如何才能显示“3.30”这样的数值呢?
使用下面的程序就可获得图4所示的效果。
 while (1)
  {
    if(gIsUpdateChar)
    {
       LEDC_SetData(HTCFG_LEDC_COM_D1,  NumberChar[3]);
      LEDC_SetData(HTCFG_LEDC_COM_D2,  NumberChar[10]);
      LEDC_SetData(HTCFG_LEDC_COM_D3,  NumberChar[3]);
      LEDC_SetData(HTCFG_LEDC_COM_D4,  NumberChar[0]);
      gIsUpdateChar = FALSE;
    }
  }


图4  显示指定内容

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

451

主题

2747

帖子

38

粉丝