[开发板与模块]

【ESK32-30519 + ESK32-21001测评】使用4位数码管显示数值

[复制链接]
408|1
手机看帖
扫描二维码
随时随地手机跟帖
KING阿飞|  楼主 | 2022-9-11 20:37 | 显示全部楼层 |阅读模式
【ESK32-30519 + ESK32-21001测评】使用4位数码管显示数值

  在ESK32-30519中自带了4位数码管,并且官方已经配置好了库,直接调用即可。

一、移植LEDC

$`0O6HKEAYKZ2RMFOARRH2M.png

我们的LEDC的文件存放在.\example\LEDC\7-SegmentDigitalDisplay。

/*********************************************************************************************************//**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  Configure the LEDC.
  * @retval None
  ***********************************************************************************************************/
void LEDC_Configuration(void)
{
  LEDC_InitTypeDef LEDC_InitStruct;

  /* Turn on the APB clock of LEDC. */
  CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
  CKCUClock.Bit.LEDC       = 1;
  CKCU_PeripClockConfig(CKCUClock, ENABLE);
  CKCUClock.Bit.AFIO       = 1;
  CKCU_PeripClockConfig(CKCUClock, ENABLE);

  /* SEG0~7 */
  AFIO_GPxConfig(HTCFG_LEDC_SEG0_GPIO_ID, HTCFG_LEDC_SEG0_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_SEG1_GPIO_ID, HTCFG_LEDC_SEG1_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_SEG2_GPIO_ID, HTCFG_LEDC_SEG2_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_SEG3_GPIO_ID, HTCFG_LEDC_SEG3_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_SEG4_GPIO_ID, HTCFG_LEDC_SEG4_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_SEG5_GPIO_ID, HTCFG_LEDC_SEG5_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_SEG6_GPIO_ID, HTCFG_LEDC_SEG6_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_SEG7_GPIO_ID, HTCFG_LEDC_SEG7_AFIO_PIN, AFIO_FUN_LEDC);

  /* COM0~4 */
  AFIO_GPxConfig(HTCFG_LEDC_COM0_GPIO_ID, HTCFG_LEDC_COM0_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_COM1_GPIO_ID, HTCFG_LEDC_COM1_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_COM2_GPIO_ID, HTCFG_LEDC_COM2_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_COM3_GPIO_ID, HTCFG_LEDC_COM3_AFIO_PIN, AFIO_FUN_LEDC);

  /* Frame = fCK_LED / (LEDC_DutyClockNumber * COM Number) */
  /*       = 1600 / (8*4)  =  50Hz */
  //LEDC_InitStruct.LEDC_ClockSource    = LEDC_SRC_LSI;                    /* LSI = 32Khz */
        LEDC_InitStruct.LEDC_ClockSource    = LEDC_SRC_PCLK;                                                                                /*PLL = 60Mhz*/
  LEDC_InitStruct.LEDC_ClockPrescaler = HTCFG_LEDC_CLOCK_PRESCAL - 1;    /* fCK_LED =3MHz */
  LEDC_InitStruct.LEDC_DutyClockNumber = HTCFG_LEDC_DUTY_CLOCK_NUMBER;   /* Duty CLock Number = 8 Clock */
  LEDC_InitStruct.LEDC_COMxEN = HTCFG_LEDC_COM1EN | HTCFG_LEDC_COM2EN |\
                                HTCFG_LEDC_COM3EN | HTCFG_LEDC_COM4EN;   /* Enable COMx */

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

  /* Set the LEDC mode to COMMON_CATHODE. */
  LEDC_SetPolarityMode(HTCFG_LEDC_COM1POL | HTCFG_LEDC_COM2POL | HTCFG_LEDC_COM3POL | HTCFG_LEDC_COM4POL,
                       LEDC_SEG0POL | LEDC_SEG1POL | LEDC_SEG2POL | LEDC_SEG3POL |\
                       LEDC_SEG4POL | LEDC_SEG5POL | LEDC_SEG6POL | LEDC_SEG7POL,
                       COMMON_CATHODE);

  LEDC_IntConfig(ENABLE);                                                 /* Enable frame interrupt. */
  NVIC_EnableIRQ(LEDC_IRQn); /* Enable LECD IRQ. */
  LEDC_Cmd(ENABLE);          /* LEDC Start. */
}

还有在ht32f5xxxxx_01_it.c中添加

/* Global variables ----------------------------------------------------------------------------------------*/
bool gIsUpdateChar;

/* Private variables ---------------------------------------------------------------------------------------*/
int gCounter = -1;
/*********************************************************************************************************//**
* @brief   This function handles LEDC Handler.
* @retval  None
************************************************************************************************************/
void LEDC_IRQHandler(void)
{
  if(LEDC_GetFlagStatus())
    LEDC_ClearFlagStatus();
  /* Frame = LSI_VALUE/HTCFG_LEDC_CLOCK_PRESCAL/_HTCFG_LEDC_CLOCK_NUMBER/4
           = 32K / HTCFG_LEDC_CLOCK_PRESCAL/_HTCFG_LEDC_CLOCK_NUMBER/4
           = 40 Hz*/
  if(gCounter<(LSI_VALUE/HTCFG_LEDC_CLOCK_PRESCAL/_HTCFG_LEDC_CLOCK_NUMBER/4))
  {
    /* gCounter < 40*/
    gCounter++;
  }
  else
  {
    /* gCounter >= 40, The "gCounter" greater than 40 means that the character has been displayed for 1 second,
       and the new character will be replaced.*/
    gCounter = 0;
    gIsUpdateChar = TRUE;
  }
}
二、数据处理

void Uint_List(u16 num,u8* dig1,u8* dig2,u8* dig3,u8* dig4)
{
        if(num>=9999)
                {
                        *dig1=9;
                        *dig2=9;
                        *dig3=9;
                        *dig4=9;
                }else{
                        *dig1 = num/1000;
                        *dig2 = num/100%10;
                        *dig3 = num/10%10;
                        *dig4 = num%10;
                }
}

void LEDC_Uint_Display(u16 num)
{
        u8 dig1=0,dig2=0,dig3=0,dig4=0,dp1=0,dp2=0,dp3=0,dp4=0;
        if(gIsUpdateChar)
        {
               
                Uint_List(num,&dig1,&dig2,&dig3,&dig4);
               
                LEDC_SetData(HTCFG_LEDC_COM_D1,  NumberChar[dig1]);
    LEDC_SetData(HTCFG_LEDC_COM_D2,  NumberChar[dig2]);
    LEDC_SetData(HTCFG_LEDC_COM_D3,  NumberChar[dig3]);
          LEDC_SetData(HTCFG_LEDC_COM_D4,  NumberChar[dig4]);
               
                gIsUpdateChar = FALSE;
        }
}

void Float_List(float num,u8* dig1,u8* dig2,u8* dig3,u8* dig4,u8* dp1,u8* dp2,u8* dp3,u8* dp4)
{
        if(num>0.0f&&num<10.0f)
        {
                *dp1=10;
                *dp2=11;
                *dp3=11;
                *dp4=11;
                *dig1 = (u8)num;
                *dig2 = (u8)(num*10)%10;
                *dig3 = (u8)((u16)(num*100)%10);
                *dig4 = (u8)((u16)(num*1000)%10);
        }else if(num>=10.0f&&num<100.0f)
        {
                *dp1=11;
                *dp2=10;
                *dp3=11;
                *dp4=11;
                *dig1 = (u8)num/10;
                *dig2 = (u8)(num)%10;
                *dig3 = (u8)((u16)(num*10)%10);
                *dig4 = (u8)((u16)(num*100)%10);
        }else if(num>=100.0f&&num<1000.0f)
        {
                *dp1=11;
                *dp2=11;
                *dp3=10;
                *dp4=11;
                *dig1 = (u8)num/100;
                *dig2 = (u8)(num)/10%10;
                *dig3 = (u8)((u16)(num)%10);
                *dig4 = (u8)((u16)(num*10)%10);
        }else{
                *dp1=11;
                *dp2=11;
                *dp3=11;
                *dp4=10;
                Uint_List((u16)num,dig1,dig2,dig3,dig4);
        }
       
}

void LEDC_Float_Display(float num)
{
        u8 dig1=0,dig2=0,dig3=0,dig4=0,dp1=0,dp2=0,dp3=0,dp4=0;
        if(gIsUpdateChar)
        {
                Float_List(num,&dig1,&dig2,&dig3,&dig4,&dp1,&dp2,&dp3,&dp4);
               
                LEDC_SetData(HTCFG_LEDC_COM_D1,  NumberChar[dig1]+NumberChar[dp1]);
    LEDC_SetData(HTCFG_LEDC_COM_D2,  NumberChar[dig2]+NumberChar[dp2]);
    LEDC_SetData(HTCFG_LEDC_COM_D3,  NumberChar[dig3]+NumberChar[dp3]);
          LEDC_SetData(HTCFG_LEDC_COM_D4,  NumberChar[dig4]+NumberChar[dp4]);
               
                gIsUpdateChar = FALSE;
        }
}
暂时还没有对负号进行处理

VID_20220911_202635_Trim.gif


使用特权

评论回复
gouguoccc| | 2022-9-11 23:27 | 显示全部楼层
现在数码管用的很少了吧

使用特权

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

本版积分规则