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

#include<reg52.h>#include<intrins.h>sbitsck=P0^4;//输入时钟sbitrck=P2^3;//输出锁存sbitsi=P0^2... #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);
}

}

}
展开
 我来答
百度网友cc21aee
2014-01-20 · TA获得超过2044个赞
知道小有建树答主
回答量:1273
采纳率:100%
帮助的人:1225万
展开全部
你的led_caculate函数写的有问题,两片595级联驱动8位数码管是使用动态扫描的方式显示,如果每位数码管的显示时间不同,就会造成亮度不均的现象,而且一位数码管连续两次显示的时间间隔不应该大于20ms(50hz),要不然会看到数码管有明显的闪烁。
德鸿数智
2024-10-27 广告
压电陶瓷驱动电源,是专为驱动压电陶瓷设计的电源设备。它能提供高电压输出,最大可达400V,并具备高频率响应和高度稳定性,确保压电陶瓷产生精确的微纳米级位移变化。该电源还具备低纹波、过流保护等功能,保障运行安全。其电压调节灵活,既可通过计算机... 点击进入详情页
本回答由德鸿数智提供
廖元洪
2014-01-20 · TA获得超过114个赞
知道答主
回答量:188
采纳率:80%
帮助的人:42.5万
展开全部
你delay(200);人的眼睛。只要超过20MS就会看起来感觉会闪了。所以你delay的时间要短点。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
做而论道
高能答主

2014-01-19 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部
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);----删除这句
}
}
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式