驱动多位数码管

本文以2位数码管LB20361的共阴数码管为例:

1.简单介绍一下数码管:

        数码管其实简单来说就是LED灯,每一段就相当于一个LED灯。如果是单个数码管,我们使用的时候只需要控制让数码管的哪一段亮就可以了。如果是多位数码管,那么在控制每一段亮之前控制某一位数码管的位选就可以啦。

        下边是lb20361的图片以及原理图:

下边是与控制器的接线图

如图共4个单个数码管就有四个com口,也就是每位数码管对应的位选,控制com口就可以控制对应的数码管。

2.具体例子:

初始化引脚这边就不介绍了,就是把数码管的所有接口初始化为输出模式

这是配置com口函数

void Lcd_Com(uchar com,uchar onf)
 {
      if(onf)
      {
          switch(com)
          {
                case 0:
                       gpio_bits_set(LCD_COM0_PORT,LCD_COM0_PIN);
                       break;
                case 1:
                       gpio_bits_set(LCD_COM1_PORT,LCD_COM1_PIN);
                       break;
                case 2:
                       gpio_bits_set(LCD_COM2_PORT,LCD_COM2_PIN);
                       break;
                case 3:
                       gpio_bits_set(LCD_COM3_PORT,LCD_COM3_PIN);
                       break;
          }
      }
      else
      {
          switch(com)
          {
                case 0:
                       gpio_bits_reset(LCD_COM0_PORT,LCD_COM0_PIN);
                       break;
                case 1:
                       gpio_bits_reset(LCD_COM1_PORT,LCD_COM1_PIN);
                       break;
                case 2:
                       gpio_bits_reset(LCD_COM2_PORT,LCD_COM2_PIN);
                       break;
                case 3:
                       gpio_bits_reset(LCD_COM3_PORT,LCD_COM3_PIN);
                       break;
          }
      }
 }

这是配置数码管段码函数

void Lcd_Char(uchar val,uchar no)
 {
   if(val&0x01<<no)
   {
     switch(no)
     {
         case 0:
                gpio_bits_set(LCD_A_PORT,LCD_A_PIN);
                break;
         case 1:
                gpio_bits_set(LCD_B_PORT,LCD_B_PIN);
                break;
         case 2:
                gpio_bits_set(LCD_C_PORT,LCD_C_PIN);
                break;
         case 3:
                gpio_bits_set(LCD_D_PORT,LCD_D_PIN);
                break;
         case 4:
                gpio_bits_set(LCD_E_PORT,LCD_E_PIN);
                break;
         case 5:
                gpio_bits_set(LCD_F_PORT,LCD_F_PIN);
                break;             
         case 6:
                gpio_bits_set(LCD_G_PORT,LCD_G_PIN);
                break;
     }
   }
   else
   {
      switch(no)
      {
          case 0:
                gpio_bits_reset(LCD_A_PORT,LCD_A_PIN);
                break;
          case 1:
                gpio_bits_reset(LCD_B_PORT,LCD_B_PIN);
                break;
          case 2:
                gpio_bits_reset(LCD_C_PORT,LCD_C_PIN);
                break;
          case 3:
                gpio_bits_reset(LCD_D_PORT,LCD_D_PIN);
                break;
          case 4:
                gpio_bits_reset(LCD_E_PORT,LCD_E_PIN);
                break;
          case 5:
                gpio_bits_reset(LCD_F_PORT,LCD_F_PIN);
                break;
          case 6:
                gpio_bits_reset(LCD_G_PORT,LCD_G_PIN);
                break;
      }
   }
 } 

这是配置数码管的段码

//段选 
 void Lcd_Disp_Char(uchar data)
 {    
       Lcd_Char(data,0);
       Lcd_Char(data,1);
       Lcd_Char(data,2);
       Lcd_Char(data,3);
       Lcd_Char(data,4);
       Lcd_Char(data,5);
       Lcd_Char(data,6);
   
 }

这是配置数码管的位选

//位选
void Lcd_Disp_Com(void)
{             
        Lcd_Com(0,1);
        Lcd_Com(1,0);
        Lcd_Com(2,0);
        Lcd_Com(3,0);
        Lcd_Disp_Char(Lcd_Char0);
        delayInUs(200);
  
        Lcd_Com(0,0);
        Lcd_Com(1,1);
        Lcd_Com(2,0);
        Lcd_Com(3,0);
        Lcd_Disp_Char(Lcd_Char1);
        delayInUs(200);   
        
        Lcd_Com(0,0);
        Lcd_Com(1,0);
        Lcd_Com(2,1);
        Lcd_Com(3,0);
        Lcd_Disp_Char(Lcd_Char2);
        delayInUs(200);  
        
        Lcd_Com(0,0);
        Lcd_Com(1,0);
        Lcd_Com(2,0);
        Lcd_Com(3,1);   
        Lcd_Disp_Char(Lcd_Char3);
        delayInUs(200);
        Lcd_Com(0,0);
        Lcd_Com(1,0);
        Lcd_Com(2,0);
        Lcd_Com(3,0);
}

对于多位数码管,如何让它动态显示呢?相信初学者会有这个疑问。我们可以利用定时器快速刷新显示速度,时间非常的短,在人眼分辨不出的情况下 就会觉得是一起显示的。这个我们可以用定时器来处理:


//刷新数码管
void Tmr3_IRQ_Handler(void)
{
      if(tmr_flag_get(TMR3, TMR_OVF_FLAG) != RESET)
      { 
            Lcd_Disp_Com();              
            tmr_flag_clear(TMR3, TMR_OVF_FLAG);//清除标志位
      }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值