这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» MCU» 咨询关于STC单片机驱动的LED数码管亮度不一致问题

共4条 1/1 1 跳转至

咨询关于STC单片机驱动的LED数码管亮度不一致问题

工程师
2020-09-16 14:52:36 打赏

现在是这样的,选了芯片6个IO口连上了6个数码管的共阳极,直连,没有任何电阻。然后我只点亮一个,共阳极电压为1.3.点亮3个,电压为0.9,点亮6个,电压为0.4.测量的都是平均电压,示波器测的共阳极电压为3V左右,大部分时间为低电平,只有开启那一会是高电平。简单来说波形是正常的。const char num[10]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28};//数码管数字0-9,未点亮小数点,需点亮每个小数点则&0xdf

void Timer2Int(void) interrupt 5 //定时时间为2.5ms左右,数码管未发生闪烁。
{
static char i=0;
TF2 = 0; //溢出清零
// flush_flag=1;
i++;
switch(i){
case 1:brighdig(1,1,(current/100));break;
case 2:brighdig(1,2,(current/10)%10);break;
case 3:brighdig(1,3,(current%10));break;
case 4:brighdig(0,1,(n/100));break;
case 5:brighdig(0,2,(n/10)%10);break;
case 6:brighdig(0,3,(n%10));break;
}
if(i>=6) i=0;
}

void brighdig(unsigned char flag,unsigned char number,unsigned int cur)
{
DIG21=0; //数码管共阳极
DIG22=0;
DIG23=0;
DIG11=0;
DIG12=0;
DIG13=0;
if(flag){
switch(number){
case 1: DIG21=1;
display_num(num[cur]&0xdf); //点亮小数点
break;
case 2: DIG22=1;
display_num(num[cur]);
break;
case 3: DIG23=1;
display_num(num[cur]);
break;
}
}
else{
switch(number){
case 1: DIG11=1;
display_num(num[cur]&0xdf);
break;
case 2: DIG12=1;
display_num(num[cur]);
break;
case 3: DIG13=1;
display_num(num[cur]);
break;
}
}
}

void display_num(unsigned char num)
{
unsigned char i;
for(i=0;i<8;i++)
{
CLK=0;
if(num&0X01)
{
DAS=1;
}
else {
DAS=0;
}
CLK=1;
num=num>>1;
}

}


关闭了其它中断,只有定时器中断在工作。供电电压为3V,显示就如图。只有0是暗的,其它数字很正常。扫描时间也改过,还是一样。然后3.3V供电的话亮度是比3V供电好点,现在就是想3V供电有没有扫描办法解决这个问题。
电路图:(LED与芯片,74HC164连接)


0很暗,其它数字很亮

所有的0都暗






关键词: STC单片机 数码管 亮度 LED

工程师
2020-09-16 19:44:20 打赏
2楼

每次只点亮数码管的一段,6*8=48段一个循环,还有必须要接限流电阻


工程师
2020-09-16 19:52:21 打赏
3楼

试一下把显示部分直接放到while里面呢?不要放在定时器里面


工程师
2020-09-16 19:56:37 打赏
4楼

这种程序框架都不对,显示应该设置缓冲区,中断只管从缓冲区取数据显示,做简单的动作,主程序要显示什么就往缓冲区里填


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]