本文以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);//清除标志位
}
}