单片机实验板数码管显示问题

[复制链接]
3964|22
 楼主| 电子点名 发表于 2013-9-7 10:33 | 显示全部楼层 |阅读模式
单片机实验 板数码管显示,如果是uchar类型的数据,数码管显示就是很亮,很清晰,比如000-255,但是一过了这个数(255),它就会变暗,这是为什么?255之后的数就变得很暗了,求解
 楼主| 电子点名 发表于 2013-9-7 10:37 | 显示全部楼层
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit kuai=P3^0;
uint num;
uchar bai,shi,ge,aa;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void display(uchar bai,uchar shi,uchar ge);
void init();
void main()
{
                init();

                while(1)
     {       
                  if(aa==1)
                  {
                        aa=0;
                        num++;
                  }
                        if(num==999)
                           {
                                        num=0;
                           }
                        bai=num/100;
                    shi=num%100/10;
                     ge=num%10;
                        display(bai,shi,ge);
         }

}
void init()
{       
        kuai=0;
        P0=0xff;
        num=0;
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;       
}
void display(uchar bai,uchar shi,uchar ge)
{
        kuai=1;
                P1=table[bai];
                kuai=0;
                P0=0xfe;
                P0=0xff;

                kuai=1;
                P1=table[shi];
                kuai=0;
                P0=0xfd;
                P0=0xff;

                kuai=1;
                P1=table[ge];
                kuai=0;
                P0=0xfb;
                P0=0xff;
}

void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        aa++;       
}
这是我写的程序,这个是基本的,还要加些东西上去,就是0-999的显示
 楼主| 电子点名 发表于 2013-9-7 10:38 | 显示全部楼层
求解啊,为什么255之后数码管显示就变得很暗啦
dirtwillfly 发表于 2013-9-7 11:07 | 显示全部楼层
uchar类型是8位二进制数,过了255,就又回到000了
 楼主| 电子点名 发表于 2013-9-7 12:06 | 显示全部楼层
dirtwillfly 发表于 2013-9-7 11:07
uchar类型是8位二进制数,过了255,就又回到000了

你看不见我用uint定义num么。不是uchar

评论

求教也不客气一点。人家欠你的么。  发表于 2013-9-7 21:35
 楼主| 电子点名 发表于 2013-9-7 12:07 | 显示全部楼层
我就是想问用uint特别暗的,没有高手么
haitun1895 发表于 2013-9-7 12:20 | 显示全部楼层
看不懂
dirtwillfly 发表于 2013-9-7 12:29 | 显示全部楼层
电子点名 发表于 2013-9-7 12:06
你看不见我用uint定义num么。不是uchar

不好意思,眼瘸。
你顶楼说的可是用的uchar类型

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
林志财 发表于 2013-9-7 12:29 | 显示全部楼层
[quote]我就是想问用uint特别暗的,没有高手么[/quote:L]回答你的就是高手
林志财 发表于 2013-9-7 12:30 | 显示全部楼层
我就是想问用uint特别暗的,没有高手么
:L回答你的就是高手
cjseng 发表于 2013-9-7 12:48 | 显示全部楼层
非高手的答案:
占空比的问题,因为用uint的时候,你那几个除法运算占用的时间太多了,以至于display占用的时间就少了。
zh_sl 发表于 2013-9-7 14:02 | 显示全部楼层
同意楼上的
 楼主| 电子点名 发表于 2013-9-7 14:05 | 显示全部楼层
cjseng 发表于 2013-9-7 12:48
非高手的答案:
占空比的问题,因为用uint的时候,你那几个除法运算占用的时间太多了,以至于display占用的 ...

有道理,那怎么修改呢,不用uint不行,uchar范围只有0-255,uint就大了
 楼主| 电子点名 发表于 2013-9-7 14:08 | 显示全部楼层
cjseng 发表于 2013-9-7 12:48
非高手的答案:
占空比的问题,因为用uint的时候,你那几个除法运算占用的时间太多了,以至于display占用的 ...

你有什么好算法,我就会这样分离百位和千位的,你有什么好建议
cjseng 发表于 2013-9-7 15:32 | 显示全部楼层
在display函数里,送出位码的P0=xx;这条语句后,加一个delay;延长display占用的时间好了。至于delay多长时间,可以自己实验来确定。
说明一下,这样能解决你的问题,但是在实际项目中这样做的话是不可取的。

评分

参与人数 1威望 +1 收起 理由
电子点名 + 1 赞一个!

查看全部评分

 楼主| 电子点名 发表于 2013-9-7 16:11 | 显示全部楼层
cjseng 发表于 2013-9-7 15:32
在display函数里,送出位码的P0=xx;这条语句后,加一个delay;延长display占用的时间好了。至于delay多长时 ...

光看你写的东西,就懂了,谢谢!
 楼主| 电子点名 发表于 2013-9-7 16:17 | 显示全部楼层
cjseng 发表于 2013-9-7 15:32
在display函数里,送出位码的P0=xx;这条语句后,加一个delay;延长display占用的时间好了。至于delay多长时 ...

问题解决了,但是,我还是想问除了这个,还有其他办法么,加入延时,比如从算法或者其他?
xiaoxiong1988 发表于 2013-9-7 16:37 | 显示全部楼层
延时,我觉得不可取,有另外一个办法,你可以试一下,我也是菜鸟,你把显示程序放到中断里面,中断溢出时间改短一下,20ms中断一次  
cjseng 发表于 2013-9-7 17:09 | 显示全部楼层
这是编程思路问题,num又不是每display一次就会改变一次,只要在num改变时计算一下百、十、个位就行了。display也没必要刷新频率那么高,只要人眼感觉不到闪烁,刷新频率越低越好。
cjseng 发表于 2013-9-7 17:13 | 显示全部楼层
还有,要经常有意识地测试一下关键代码执行占用的时间,要尽可能地让CPU有更多的空余时间,就如同PC机的CPU使用率越低越好,占用的资源越少越好,这样程序才能跑得快。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

38

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部