打印
[疑难问答]

数码管显示变化数字出现重影

[复制链接]
1794|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhouhuanの|  楼主 | 2016-8-17 20:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#include <intrins.H>
#define uchar unsigned char
#define uint  unsigned int

//数码管的段码编码
uchar DATA_LED_Point[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
uchar BIT_LED[]={0xfe,0xfd,0xfb,0xf7,0xef};//定义需要点亮的数码管,从左往右5~1数码管
uchar disp[5];
uchar led_bit;
uchar timer_count=0;
uint num=0;

void delay_1ms(uchar t)               //延时1*t个ms      
{
    uchar a,b;
    for(b=t;b>0;b--)
        for(a=148;a>0;a--);
}


void InitTimer0(void)                 //2ms
{
    TMOD = 0x01;
    TH0 = 0x0Fc;
    TL0 = 0x018;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}


void Timer0Interrupt(void) interrupt 1
{
        uint j;
    TH0 = 0x0fc;
    TL0 = 0x018;
        timer_count++;
        if(timer_count==10)
        {
                        timer_count=0 ;
                        for(j=0;j<5000;j++)
                        {
                                disp[4]=num/10000;
                                disp[3]=(num%10000)/1000;                           /*取实际值的十位*/
                        disp[2]=(num%1000)/100;                       /*取实际值的个位*/
                        disp[1]=(num%100)/10;                           /*取设定值的十位*/
                        disp[0]=num%10;                           /*取设定值的个位*/
                                P0=BIT_LED[led_bit];
                                P2=0xff;
                              delay_1ms(1) ;
                                P0=BIT_LED[led_bit];
                                P2=DATA_LED_Point[disp[led_bit]];
                                delay_1ms(3) ;
                                led_bit++;
                                if(led_bit>5)
                                {   
                                   led_bit=0;
                                }
                        }
        }
}
void main()
{
        InitTimer0();
        while(1)
        {        
              num++;
                if(num>65535)
                  num=0;
                                       
        }
}
沙发
handleMessage| | 2016-8-17 20:40 | 只看该作者
显示要加点延时,如果传送的数据太快,就会这样.

使用特权

评论回复
板凳
bbapple| | 2016-8-17 20:49 | 只看该作者
估计是速度没到位吧

使用特权

评论回复
地板
sourceInsight| | 2016-8-17 20:49 | 只看该作者
加延时了么有呀!!!!

使用特权

评论回复
5
boy1990| | 2016-8-17 20:58 | 只看该作者
是的,加延时进行消影。

使用特权

评论回复
6
CallReceiver| | 2016-8-17 21:06 | 只看该作者
你用的是动态扫描 每一位显示的时间应该快一点

使用特权

评论回复
7
lihui567| | 2016-9-2 18:21 | 只看该作者
楼主是不是不亮的数码管有的段微亮啊

使用特权

评论回复
8
sszxxm| | 2016-9-4 17:16 | 只看该作者
不好意思楼主,实在看不懂你的中断函数里为啥还要2次调用延时函数,还是毫秒级的,
一般中断里就做一件事情:刷新。其它所有计算和译码的事情,通通放到中断外面来,更不能在中断里加这种毫秒级的延时。中断的时间很珍贵的,不能浪费资源哦。

你的程序中,主函数main里的while大循环,用一个加法实现数码管不停加数累计的显示演示,但是,加法的大循环该需要延时的地方,却没了延时,这样计数太快,直接造成显示屏一片混乱,感觉是重影,其实是数据变化太快,肉眼根本无法分辨导致的。

正确的做法:主程序里保留现在的加法循环,但是每次加完,要延时,这个延时就是需要的加数之间的间隔,至少零点几秒吧,然后每次加法之后,对数字进行译码处理好;
中断函数里,除了必要的刷新定时器,一般进中断先关位扫描,也就是把当前位扫描的IO重置到息屏的状态,然后更新比划内容,因为位扫只有一条,控制简单,而比划有时候有些硬件线路规划比较困难的时候,可能是好几组IO口分别拉几条线过来拼凑成的(现在的51内置外设越来越多,IO输出端口复用也复杂了),把比划送显开下一个位扫,重新点亮新的一位,然后把比划的位置变量修正一下就可以退出中断了。

以上只是抛砖,讲了一个思路,程序自己慢慢写吧,初学的,总会有个过程,大家都是这样过来的。

使用特权

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

本版积分规则

68

主题

1557

帖子

2

粉丝