打印

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

[复制链接]
3004|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
电子点名|  楼主 | 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了

使用特权

评论回复
5
电子点名|  楼主 | 2013-9-7 12:06 | 只看该作者
dirtwillfly 发表于 2013-9-7 11:07
uchar类型是8位二进制数,过了255,就又回到000了

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

使用特权

评论回复
评论
taoest 2013-9-7 21:35 回复TA
求教也不客气一点。人家欠你的么。 
6
电子点名|  楼主 | 2013-9-7 12:07 | 只看该作者
我就是想问用uint特别暗的,没有高手么

使用特权

评论回复
7
haitun1895| | 2013-9-7 12:20 | 只看该作者
看不懂

使用特权

评论回复
8
dirtwillfly| | 2013-9-7 12:29 | 只看该作者
电子点名 发表于 2013-9-7 12:06
你看不见我用uint定义num么。不是uchar

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

使用特权

评论回复
9
林志财| | 2013-9-7 12:29 | 只看该作者
[quote]我就是想问用uint特别暗的,没有高手么[/quote:L]回答你的就是高手

使用特权

评论回复
10
林志财| | 2013-9-7 12:30 | 只看该作者
我就是想问用uint特别暗的,没有高手么
:L回答你的就是高手

使用特权

评论回复
11
cjseng| | 2013-9-7 12:48 | 只看该作者
非高手的答案:
占空比的问题,因为用uint的时候,你那几个除法运算占用的时间太多了,以至于display占用的时间就少了。

使用特权

评论回复
12
zh_sl| | 2013-9-7 14:02 | 只看该作者
同意楼上的

使用特权

评论回复
13
电子点名|  楼主 | 2013-9-7 14:05 | 只看该作者
cjseng 发表于 2013-9-7 12:48
非高手的答案:
占空比的问题,因为用uint的时候,你那几个除法运算占用的时间太多了,以至于display占用的 ...

有道理,那怎么修改呢,不用uint不行,uchar范围只有0-255,uint就大了

使用特权

评论回复
14
电子点名|  楼主 | 2013-9-7 14:08 | 只看该作者
cjseng 发表于 2013-9-7 12:48
非高手的答案:
占空比的问题,因为用uint的时候,你那几个除法运算占用的时间太多了,以至于display占用的 ...

你有什么好算法,我就会这样分离百位和千位的,你有什么好建议

使用特权

评论回复
15
cjseng| | 2013-9-7 15:32 | 只看该作者
在display函数里,送出位码的P0=xx;这条语句后,加一个delay;延长display占用的时间好了。至于delay多长时间,可以自己实验来确定。
说明一下,这样能解决你的问题,但是在实际项目中这样做的话是不可取的。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
电子点名 + 1 赞一个!
16
电子点名|  楼主 | 2013-9-7 16:11 | 只看该作者
cjseng 发表于 2013-9-7 15:32
在display函数里,送出位码的P0=xx;这条语句后,加一个delay;延长display占用的时间好了。至于delay多长时 ...

光看你写的东西,就懂了,谢谢!

使用特权

评论回复
17
电子点名|  楼主 | 2013-9-7 16:17 | 只看该作者
cjseng 发表于 2013-9-7 15:32
在display函数里,送出位码的P0=xx;这条语句后,加一个delay;延长display占用的时间好了。至于delay多长时 ...

问题解决了,但是,我还是想问除了这个,还有其他办法么,加入延时,比如从算法或者其他?

使用特权

评论回复
18
xiaoxiong1988| | 2013-9-7 16:37 | 只看该作者
延时,我觉得不可取,有另外一个办法,你可以试一下,我也是菜鸟,你把显示程序放到中断里面,中断溢出时间改短一下,20ms中断一次  

使用特权

评论回复
19
cjseng| | 2013-9-7 17:09 | 只看该作者
这是编程思路问题,num又不是每display一次就会改变一次,只要在num改变时计算一下百、十、个位就行了。display也没必要刷新频率那么高,只要人眼感觉不到闪烁,刷新频率越低越好。

使用特权

评论回复
20
cjseng| | 2013-9-7 17:13 | 只看该作者
还有,要经常有意识地测试一下关键代码执行占用的时间,要尽可能地让CPU有更多的空余时间,就如同PC机的CPU使用率越低越好,占用的资源越少越好,这样程序才能跑得快。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

38

帖子

0

粉丝