打印
[51单片机]

两个显示模块 同时显示会有闪烁感 只显示一个没有问题

[复制链接]
1666|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
问题:
      本电路共有两个显示模块,分为数码管和点阵显示。在分别调试两个显示程序时没有问题,综合后就发现两个显示有明显的闪烁感。怀疑是执行程序为顺序执行,导致延时时间太长。特求解各位大神。
附原理图:

程序:
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char

sbit IO = P2^0;
sbit SCLK = P2^1;
sbit RST = P2^2;

sbit duan  = P2^6;
sbit wei   = P2^7;

sbit duan1  = P2^3;
sbit wei1   = P2^4;

sbit led = P2^5;

char t1=0;
uchar DateTime[7];
void  display(uint t );
void display1(uchar shu);

uchar shu;
uchar temp=0;

uchar code M[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff,0x00};

uchar code LEDData[]=
{
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
uchar code weixuan[]=
{
        0x01,0x02,0x04,0x08
};


  void delay(uint z)
{

        uint x,y;
        for(x=z;x>0;x--)
                for(y=1;y>0;y--);

}

void DelayMS(uint ms)
{
        uchar i;
        while(ms--)
        {
                 for(i=0;i<1;i++);
        }
}

void Write_A_Byte_TO_DS1302(uchar x)          //
{
        uchar i;
        for(i=0;i<8;i++)
        {
                 IO=x&0x01;SCLK=1;SCLK=0;x>>=1;
        }
}

uchar Get_A_Byte_FROM_DS1302()
{
        uchar i,b=0x00;
        for(i=0;i<8;i++)
        {
                 b |= _crol_((uchar)IO,i);
                SCLK=1;SCLK=0;
        }
        return b/16*10+b%16;
}

uchar Read_Data(uchar addr)
{
        uchar dat;
        RST = 0;SCLK=0;RST=1;
           Write_A_Byte_TO_DS1302(addr);
        dat = Get_A_Byte_FROM_DS1302();
           SCLK=1;RST=0;
        return dat;
}

void GetTime()
{
        uchar i,addr = 0x81;                                   //从分钟开始取数字
        for(i=0;i<3;i++)
        {
                 DateTime[i]=Read_Data(addr);addr+=2;
        }
}



void main()
{       
  uint temp1;

    TMOD = 0x01;
        TH0  = (65535-50000)/256;
        TL0  = (65535-50000)%256;
        IT0 = 1;
        TR0 = 1;
        IE  = 0x83;        //中断使能       
        P1 = 0x00;        
        while(1)
        {
                 GetTime();
                temp1=          DateTime[1]+DateTime[2]*60 ;
                display(temp1);
            //display1( DateTime[0]) ;                               
        }
}

  void Show_Dot_Matrix() interrupt 1
{
        TH0  = (65535-50000)/256;
        TL0  = (65535-50000)%256;
        if(++temp==20)
        {
            temp=0;
        led=~led ;       
        }               
}

void display1(uchar shu)
{          
   uchar lie1,lie2,lie3,lie4,lie5,lie6,lie7,lie8,j;

if(0<shu&&shu<8)
{
          lie1=shu%8;
          lie2=8;
          lie3=8;
          lie4= 8;
          lie5= 8;
          lie6= 8;
          lie7= 8;
          lie8= 8;
}
if(8<=shu&&shu<16)
{
          lie1=7;
          lie2=(shu-8)%8;
          lie3= 8;
          lie4= 8;
          lie5= 8;
          lie6= 8;
          lie7= 8;
          lie8= 8;
}
if(16<=shu&&shu<24)
{
          lie1=7;
          lie2=7;
          lie3=(shu-16)%8;
          lie4= 8;
          lie5= 8;
          lie6= 8;
          lie7= 8;
          lie8= 8;
}
if(24<=shu&&shu<32)
{
          lie1=7;
          lie2=7;
          lie3=7;
          lie4=(shu-24)%8;
          lie5= 8;
          lie6= 8;
          lie7= 8;
          lie8= 8;
}
if(32<=shu&&shu<41)
{
          lie1=7;
          lie2=7;
          lie3=7;
          lie4=7;
          lie5=(shu-32)%8;
          lie6= 8;
          lie7= 8;
          lie8= 8;
}
if(40<=shu&&shu<48)
{
          lie1=7;
          lie2=7;
          lie3=7;
          lie4=7;
          lie5=7;
          lie6=(shu-40)%8;
          lie7= 8;
          lie8= 8;
}
if(48<=shu&&shu<56)
{
          lie1=7;
          lie2=7;
          lie3=7;
          lie4=7;
          lie5=7;
          lie6=7;
          lie7=(shu-48)%8;
          lie8= 8;
}
if(56<=shu&&shu<64)
{
          lie1=7;
          lie2=7;
          lie3=7;
          lie4=7;
          lie5=7;
          lie6=7;
          lie7=7;
          lie8=(shu-56)%8;
}
               wei1=0;
                 duan1=0;
      
        for(j=0;j<10;j++)
                {
                    wei1=1 ;
                          P1 =0x01;
                        wei1=0;                       
                        delay(1);
                        duan1=1;
                P1 = ~M[lie1];
                        delay(2);
                        duan1=0;
                        P1 =0x00;
                        delay(2);
                               
                        wei1=1;
                          P1 =0x02;
                        wei1=0;               
                        delay(1);
                        duan1=1;
                P1 = ~M[lie2];
                        duan1=0;
                        delay(2) ;
               

                        wei1=1 ;
                          P1 =0x04;
                        wei1=0;               
                        delay(1);
                        duan1=1;
                P1 = ~M[lie3];
                        duan1=0;
                        delay(2) ;
               

                        wei1=1;
                          P1 =0x08;
                        wei1=0;               
                        delay(1);
                        duan1=1;
                P1 = ~M[lie4];
                        duan1=0;
                        delay(2) ;
               

                        wei1=1;
                          P1 =0x10;
                        wei1=0;               
                        delay(1);
                        duan1=1;
                P1 = ~M[lie5];
                        duan1=0;
                        delay(2) ;
               

                        wei1=1 ;
                          P1 =0x20;
                        wei1=0;               
                        delay(1);
                        duan1=1;
                P1 = ~M[lie6];
                        duan1=0;
                        delay(2) ;
               

                        wei1=1;
                          P1 =0x40;
                        wei1=0;               
                        delay(1);
                        duan1=1;
                P1 = ~M[lie7];
                        duan1=0;
                        delay(2) ;
               

                        wei1=1;
                          P1 =0x80;
                        wei1=0;               
                        delay(1);
                        duan1=1;
                P1 = ~M[lie8];
                        duan1=0;
                        delay(2) ;
               
                }
      
   
}

void  display(uint t )                    //数码管任意数显式,
  {

    char shi1,shi2,fen1,fen2; //1代表十位  2代表个位
    char i=3;
        fen2=t%10;
         fen1=t%60/10;
         shi2=t/60%10;
         shi1=t/60/10;
       
          while(i--)
  {
                  wei=1;
                P0=~weixuan[0];
                wei=0;       
                 duan=1;
                P0=LEDData[shi1];
                delay(3);
                P0=0x00;
                duan=0;
       
                       
          
                wei=1;
                P0=~weixuan[1];
                wei=0;       
                 duan=1;
                P0=LEDData[shi2];
                delay(3);
                P0=0x00;
                duan=0;

                wei=1;
                P0=~weixuan[2];
                wei=0;
                delay(1);
                                  
                duan=1;
                P0=LEDData[fen1];
                delay(3);
                duan=0;
       
                       
            
                wei=1;
                P0=~weixuan[3];
                wei=0;       
                 duan=1;
                P0=LEDData[fen2];
                delay(3);               
                duan=0;

               
        }
         
        }

相关帖子

沙发
luoqiang10605|  楼主 | 2014-6-30 10:33 | 只看该作者
本帖最后由 luoqiang10605 于 2014-6-30 10:34 编辑

F:\

使用特权

评论回复
板凳
ningling_21| | 2014-6-30 11:47 | 只看该作者
可以用中断扫描数码管...

使用特权

评论回复
地板
cjseng| | 2014-6-30 13:18 | 只看该作者
这有啥好怀疑的?用Keil仿真看一下运行的时间或者在Proteus里用示波器看一下波形,就很清楚了。

使用特权

评论回复
5
luoqiang10605|  楼主 | 2014-7-1 09:23 | 只看该作者
ningling_21 发表于 2014-6-30 11:47
可以用中断扫描数码管...

用中断扫描还不是顺序执行的吗  可以解决这种闪烁感?

使用特权

评论回复
6
luoqiang10605|  楼主 | 2014-7-1 09:24 | 只看该作者
cjseng 发表于 2014-6-30 13:18
这有啥好怀疑的?用Keil仿真看一下运行的时间或者在Proteus里用示波器看一下波形,就很清楚了。 ...

关键是怎么解决这个问题

使用特权

评论回复
7
ningling_21| | 2014-7-1 09:40 | 只看该作者
luoqiang10605 发表于 2014-7-1 09:23
用中断扫描还不是顺序执行的吗  可以解决这种闪烁感?

中断中不需要延时程序,是顺序,但一次只是更换一下显示位和显示内容 就退出了

使用特权

评论回复
8
ayb_ice| | 2014-7-1 09:59 | 只看该作者
置于中断中处理才有保障

使用特权

评论回复
9
luoqiang10605|  楼主 | 2014-7-1 10:31 | 只看该作者
ayb_ice 发表于 2014-7-1 09:59
置于中断中处理才有保障

是两个显示程序程序都用中断处理吗?

使用特权

评论回复
10
cjseng| | 2014-7-1 10:58 | 只看该作者
luoqiang10605 发表于 2014-7-1 10:31
是两个显示程序程序都用中断处理吗?

不要用Delay,用定时中断来实现这个延时。
两个显示程序都用中断处理完全可以啊,三个也行。
不过,你这两个显示程序完全可以合并成一个。

使用特权

评论回复
11
lxj19901115| | 2014-7-1 11:16 | 只看该作者
数码管,中断扫,
点阵定时处理,间隔推荐100MS一次

使用特权

评论回复
12
luoqiang10605|  楼主 | 2014-7-1 11:20 | 只看该作者
cjseng 发表于 2014-7-1 10:58
不要用Delay,用定时中断来实现这个延时。
两个显示程序都用中断处理完全可以啊,三个也行。
不过,你这两 ...

数据不一样  怎么合并
还有8*8LED怎么实现依次多点亮一个led 即显示40时亮40个  显示50时亮50个

使用特权

评论回复
13
cjseng| | 2014-7-1 11:26 | 只看该作者
luoqiang10605 发表于 2014-7-1 11:20
数据不一样  怎么合并
还有8*8LED怎么实现依次多点亮一个led 即显示40时亮40个  显示50时亮50个  ...

我的做法是把8个LED看成一位数码管,只不过在点亮LED时,不需要像数码管那样要译码(七段码),亮40或50个LED,相当于控制数码管的不同段码点亮与否。

使用特权

评论回复
14
luoqiang10605|  楼主 | 2014-7-1 11:39 | 只看该作者
我知道这样显示 但是仿真时有好多错误显示

使用特权

评论回复
15
ningling_21| | 2014-7-1 13:01 | 只看该作者
luoqiang10605 发表于 2014-7-1 11:39
我知道这样显示 但是仿真时有好多错误显示

程序有问题不对吧....

使用特权

评论回复
16
yanzhuangsongqi| | 2014-7-1 13:34 | 只看该作者
可能是扫描间隔时间太久啦

使用特权

评论回复
17
购线网| | 2014-7-1 13:46 | 只看该作者
这个有点迷糊了

使用特权

评论回复
18
luoqiang10605|  楼主 | 2014-7-1 14:16 | 只看该作者
单独调试没啥问题的

使用特权

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

本版积分规则

9

主题

448

帖子

3

粉丝