单片机数码管亮度不一样

#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitduan=P0^1;sbitwei=... #include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit duan=P0^1;
sbit wei=P0^0;
uchar code smg_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code smg_wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar temp[8];
uchar key;
uint num;
void delay(uint z)
{
uchar x,y;
for(x=z;x<0;x--)
for(y=110;y<0;y--);
}
void smg_display(uchar FirstBit,uchar Num)
{
uchar i;
for(i=0;i<Num;i++)
{
P1=0;
duan=1;
duan=0;
P1=smg_wei[i+FirstBit];
wei=1;
wei=0;
P1=temp[i];
duan=1;
duan=0;
delay(2);
}
}
void keyscan()
{
uchar key_h,key_l;
P3=0xf0;
key_l=P3&0xf0;
if(key_l!=0xf0)
{
delay(10);
if((P3&0xf0)!=0xf0)
{
key_l=P3&0xf0;
P3=key_l|0x0f;
key_h=P3&0x0f;
while((P3&0x0f)!=0x0f)smg_display(0,3);
key=key_h+key_l;
}

switch(key)
{
case 0x7e:num=1;break;
case 0xbe:num=4;break;
case 0xde:num=9;break;
case 0xee:num=16;break;
case 0x7d:num=25;break;
case 0xbd:num=36;break;
case 0xdd:num=49;break;
case 0xed:num=64;break; //µÚ2ÐÐ
case 0x7b:num=81;break;
case 0xbb:num=100;break;
case 0xdb:num=121;break;
case 0xeb:num=144;break; //µÚ3ÐÐ
case 0x77:num=169;break;
case 0xb7:num=196;break;
case 0xd7:num=226;break;
case 0xe7:num=256;break; //µÚ4ÐÐ

}
}

}
main()
{
while(1)
{
keyscan();
if(num<100)
temp[0]=0;
else
temp[0]=smg_duan[num/100];
if(num<10)
temp[1]=0;
else
temp[1]=smg_duan[(num%100)/10];
temp[2]=smg_duan[num%10];
smg_display(0,3);
}
}

程序正常显示,就是数码管个位最亮,百位最暗,其他程序不出现这样的情况,硬件应该没问题,就是不知道程序错哪了,高手帮看看看
是不是每显示完一位数据,都要清空端口数据,才可以显示下一位数据,不然会重影,跟先送位选和段选的顺序有关系吗
展开
 我来答
做而论道
高能答主

2013-04-22 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部
修改显示函数如下:

void smg_display(uchar FirstBit, uchar Num)
{
uchar i;
for(i = 0; i < Num; i++) {
P1 = smg_wei[i + FirstBit]; wei = 1; wei = 0;
P1 = temp[i]; duan = 1; duan = 0;
delay(2);
P1 = 0; duan = 1; duan = 0;
}
}

试试看。
更多追问追答
追问
还真行,亮度差不多了,和之前最暗的数码管亮度一样,为什么会这样
追答
你原来,把关闭显示,放在了显示函数的最前面。

那么,结束函数时,最后一位,还亮着,进行按键处理时,最后一位,总是亮着。

我修改的:

P1 = smg_wei[i + FirstBit]; wei = 1; wei = 0; //先换位
P1 = temp[i]; duan = 1; duan = 0; /然后再/亮
delay(2);//延时
P1 = 0; duan = 1; duan = 0;//灭

这就保证每一位,亮的时间相同,都是delay(2);//延时。
退出显示函数,就不亮了。
执行其它函数时,不管执行多长时间,都不影响每个位的亮的时间。
---------------------------
另外,你在键盘处理中,延时的时候:
……
if(key_l!=0xf0)
{
delay(10);----这一句,也应该使用显示函数。
if((P3&0xf0)!=0xf0)
……

如仅仅用delay(10);,单纯延时,显示器的亮度,就会下降。
奥蕾达
2024-11-14 广告
如果说原理的话,液晶是起到一个开关的作用。好比水龙头控制水量,液晶控制着光的通过量。 1 A:透明的不是液晶,而是整个显示系统。液晶显示器中的液晶显示系统在未浮花第拘郢饺电邪钉矛通电时是透明的(而且是Normaly White模式的)。 2... 点击进入详情页
本回答由奥蕾达提供
百度网友320274dc4
2013-04-22 · TA获得超过641个赞
知道小有建树答主
回答量:359
采纳率:0%
帮助的人:241万
展开全部
1、你的显示电路应该是通过锁存器进行段码位码分时传送的方法
2、数码管动态显示的亮度与显示的时间有关,被点亮的时间越长越亮
3、看你的显示函数
void smg_display(uchar FirstBit,uchar Num)
{
uchar i;
for(i=0;i<Num;i++)
{
P1=0;//为何?这样不是一开始都点亮所有位吗?应该是P=0xff;关闭所有位,这样一个显示循环下来,各位的点亮时间一样亮度才一样!
duan=1;
duan=0;
P1=smg_wei[i+FirstBit];
wei=1;
wei=0;
P1=temp[i];
duan=1;
duan=0;
delay(2);
}
}
追问
是共阴的,防止重影的
追答
您试把该位改为P1=0xff;看看亮度是否一样?如果解决了想提高亮度请把点亮延时时间适当变长即可
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhxiufan
2013-04-23 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38384
国家科技进步奖

向TA提问 私信TA
展开全部
消隐处理没做好,也就是两个显示之间加3到5毫秒的延时就可以。
void smg_display(uchar FirstBit,uchar Num)
{
uchar i;
for(i=0;i<Num;i++)
{
P1=smg_wei[i+FirstBit];
wei=1;
wei=0;
P1=temp[i];
duan=1;
duan=0;
delay(5);
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友56ed58b68
2013-04-22
知道答主
回答量:80
采纳率:0%
帮助的人:18.2万
展开全部
显示是动态显示吧?看看IO电平有没有被意外翻转,形成很大占空比的矩形波,这样亮度会比高电平要暗一些
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式