单片机连接74hc595驱动数码管 但是亮度不均匀,最高位正常显示,后几位就会闪烁,不知道问题出在哪。

#include<reg52.h>
#include<intrins.h>

sbit sck = P0^4; //输入时钟
sbit rck = P2^3; //输出锁存
sbit si = P0^2; //串行数据输入

char code tableduan[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

char code tablewei[] = {0x08,0x04,0x02,0x01,0x80,0x40,0x20,0x10};
void delay1(unsigned int i)
{
unsigned int j;
for(j = 0;j<i;j++)
{
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
}
}

void init() //输入初始化
{
si = 1;
rck = 0;
}

void sclwei(unsigned char num) //位地址
{
unsigned char i,temp;
temp = tablewei[num];
for(i = 0;i<8;i++)
{
if(temp & 0x80)
{
si = 1;
}
else
{
si = 0;
}
_nop_();
temp = temp<<1;
sck = 1;
_nop_();
sck = 0;
}

}
void sclduan(unsigned char num) //段码数据
{
unsigned char i,temp;
temp = tableduan[num];
for(i = 0;i<8;i++)
{

if(temp & 0x80)
{
si = 1;
}
else
{
si = 0;
}
_nop_();
temp = temp<<1;
sck = 1;
_nop_();
sck = 0;
}
}
void leddisplay(unsigned char duan,unsigned char wei) //每一位对应的数字
{
init();
sclduan(duan);
_nop_();
sclwei(wei);
_nop_();
rck = 1;
_nop_();
rck = 0;
_nop_();
}

void led_caculate(unsigned int numb) //输入数字判断计算显示
{
unsigned int gewei;
unsigned int shiwei;
unsigned int baiwei;
gewei = numb%10;
shiwei = numb/10%10;
baiwei = numb/100%10;

if(numb<10)
{
leddisplay(gewei,3);
delay1(50);
}
else if(numb>=10 && numb<100)
{

leddisplay(gewei,3);
delay1(10);
leddisplay(shiwei,2);
delay1(10);
}
else if(numb>= 100 && numb<1000)
{

leddisplay(gewei,3);
delay1(50);
leddisplay(shiwei,2);
delay1(50);
leddisplay(baiwei,1);
delay1(50);
}
}

void main()
{
unsigned int i;
while(1)
{
for(i = 0;i<30;i++)
{
led_caculate(i) ;
delay(200);
}

}

}

你的led_caculate函数写的有问题,两片595级联驱动8位数码管是使用动态扫描的方式显示,如果每位数码管的显示时间不同,就会造成亮度不均的现象,而且一位数码管连续两次显示的时间间隔不应该大于20ms(50hz),要不然会看到数码管有明显的闪烁。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-20
你delay(200);人的眼睛。只要超过20MS就会看起来感觉会闪了。所以你delay的时间要短点。
第2个回答  2014-01-19
void main()
{
unsigned int i;
while(1) {
for(i = 0;i<30;i++) {
led_caculate(i);
// delay(200);----删除这句
}
}
}追问

把delay()删掉亮度变均匀了,但是个位跑得飞快。稍微加一点延时 显示就闪。怎么能让数字跑慢点并且不闪呢?

追答

void main()
{
unsigned int i, j; //加个变量j
while(1) {
for(i = 0; i < 30; i++) {

for(j = 0; j < 100; j++) led_caculate(i); //显示100遍,就慢了

// delay(200);----删除这句
}
}
}

本回答被提问者采纳