单片机数码管亮度不一样
#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);
}
}
程序正常显示,就是数码管个位最亮,百位最暗,其他程序不出现这样的情况,硬件应该没问题,就是不知道程序错哪了,高手帮看看看
是不是每显示完一位数据,都要清空端口数据,才可以显示下一位数据,不然会重影,跟先送位选和段选的顺序有关系吗 展开
#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);
}
}
程序正常显示,就是数码管个位最亮,百位最暗,其他程序不出现这样的情况,硬件应该没问题,就是不知道程序错哪了,高手帮看看看
是不是每显示完一位数据,都要清空端口数据,才可以显示下一位数据,不然会重影,跟先送位选和段选的顺序有关系吗 展开
4个回答
展开全部
修改显示函数如下:
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;
}
}
试试看。
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 广告
2024-11-14 广告
如果说原理的话,液晶是起到一个开关的作用。好比水龙头控制水量,液晶控制着光的通过量。 1 A:透明的不是液晶,而是整个显示系统。液晶显示器中的液晶显示系统在未浮花第拘郢饺电邪钉矛通电时是透明的(而且是Normaly White模式的)。 2...
点击进入详情页
本回答由奥蕾达提供
展开全部
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);
}
}
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;看看亮度是否一样?如果解决了想提高亮度请把点亮延时时间适当变长即可
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
消隐处理没做好,也就是两个显示之间加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);
}
}
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);
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
显示是动态显示吧?看看IO电平有没有被意外翻转,形成很大占空比的矩形波,这样亮度会比高电平要暗一些
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询