现在是这样的,选了芯片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供电有没有扫描办法解决这个问题。
|