微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 大家可以帮我看看两个显示函数的差异,谢谢

大家可以帮我看看两个显示函数的差异,谢谢

时间:10-02 整理:3721RD 点击:
程序1: static unsigned char i=0;
          
           DataPort=0;   //清空数据,防止有交替重影
       LATCH1=1;     //段锁存
       LATCH1=0;
       DataPort=dofly_WeiMa[i+FirstBit]; //取位码
       LATCH2=1;     //位锁存
       LATCH2=0;
       DataPort=TempData[i]; //取显示数据,段码
       LATCH1=1;     //段锁存
       LATCH1=0;
           i++;
       if(i==Num)
              i=0;
程序2:        uchar i=0;
        for(;i<8;i++)
        {
                P0=0;
                duancun=1;
                duancun=0;
       
                P0=weima[i];
                weicun=1;
                weicun=0;
       
                P0=shu[i];
                duancun=1;
                duancun=0;
               
        }为什么在定时器定时相同的情况之下,前者各数码管显示数字的亮度一样而后者却存在亮度不一的差异,调试好久都没发现原因,希望大家赐教

两个程序都没有看到与定时有关的语句;
我估计你的问题是这样的:
两个程序都是由其他程序调用,由其他程序完成显示每一位显示的延时
第一个程序只有一次过程,没有循环,所以每次调用仅显示一位,亮度正常
第二个程序有循环,每调用一次都显示i==0到i==7对应的位,但是位间没有经过延时,直接从0-7全部扫过,最后只有位7经过其他程序延时,所以显示亮度应该是前面7位非常暗,最后一位最亮,而且亮度应该是超过第一个程序显示出来的亮度。

大家帮帮忙啊,求助

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define key P1
uchar juzhen_pri();
void display();
uchar code duanma[10]=
{0x3f,
0x06,0x5b,0x4f,
0x66,0x6d,0x7d,
0x07,0x7f,0x6f};        //段吗
uchar code weima[8]={
0xfe,0xfd,0xfb,
0xf7,0xef,0xdf,
0xbf,0x7f};                        //位码
sbit weicun=P2^3;
sbit duancun=P2^2;
uchar shu[8];
void delayus(uchar t)
{
        while(--t);
}
void delayms(uchar t)
{
        while(t--)
                {
                delayus(248);
                delayus(248);
                }
}
uchar juzhen_sca()
{
                switch(juzhen_pri())
        {
                case 0x77:return 0;
                case 0x7e:return 1;
                case 0xbe:return 2;
                case 0xde:return 3;
                case 0x7d:return 4;
                case 0xbd:return 5;
                case 0xdd:return 6;
                case 0x7b:return 7;
                case 0xbb:return 8;
                  case 0xdb:return 9;
                default :return 0xff;
        }
}
uchar juzhen_pri()
{        uchar hight;
        key=0xf0;
        if(key!=0xf0)
                {
                        delayms(10);
                        if(key!=0xf0)
                                {
                                        key=0xfe;
                                        if(key!=0xfe)                //第一行检测
                                                {
                                                        hight=key&0xf0;
                                                        hight+=0x0e;
                                                        while(key!=0xfe);
                                       
                                                        return hight ;       
                                                }
                                        key=0xfd;
                                        if(key!=0xfd)                //第二行检测
                                                {
                                                        hight=key&0xf0;
                                                        hight+=0x0d;
                                                        while(key!=0xfd);
                                               
                                                        return hight ;       
                                                }
                                        key=0xfb;                        //第三行检测
                                        if(key!=0xfb)
                                                {
                                                        hight=key&0xf0;
                                                        hight+=0x0b;
                                                        while(key!=0xfb);
                                               
                                                        return hight ;       
                                                }
                                        key=0xf7;
                                        if(key!=0xf7)                        //第四行检测
                                                {
                                                        hight=key&0xf0;
                                                        hight+=0x07;
                                                        while(key!=0xf7);
                                               
                                                        return hight ;       
                                                }
                                       
                                       
                                }
                }
        return 0xff;
}
void display()
{
        uchar i=0;
        for(;i<8;i++)
        {
                P0=0;
                duancun=1;
                duancun=0;
       
                P0=weima;
                weicun=1;
                weicun=0;
       
                P0=shu;
                duancun=1;
                duancun=0;
                //delayus(103);
               
        }
/*        static uchar i=0;        //思考:为什么两种显示函数导致显示
                P0=0;                        //的效果不一样。前一个会出现数码管
                duancun=1;                //显示不同亮度而后一种则正常显示
                duancun=0;
       
                P0=weima;        //不同的显示结果的原因在于前者各数码管的显示扫描时间不一样导致
                weicun=1;                //所以需要适当的延时
                weicun=0;
       
                P0=shu;
                duancun=1;
                duancun=0;
        i++;
        if(i==8)
                i=0;*/
}
dingshi()
{
        EA=1;
        TMOD|=0X01;
        ET0=1;
        //TH0=(65536-2000)/256;
//        TL0=(65536-2000)%256;
        TR0=1;
}
dingtime()interrupt 1
{
        TH0=(65536-2000)/256;
        TL0=(65536-2000)%256;
        display();
}
main()
{/*        uchar num=0,i=0;
        dingshi();
        while(1)
                {
                num=juzhen_sca();
                if(num!=0xff)
                  {        key=0xf0;       
                        if(key!=0xf0)
                          {        delayms(10);
                                if(key!=0xf0)
                                        {
                                        shu=duanma[num];
                                        i++;
                                        if(i==9)
                                                {
                                                i=0;
                                                for(;i<8;i++)
                                                        shu=0;
                                                i=0;
                                                 }
                                               
                                         }
                                       
                          }
                   }
                }*/
        uchar num=0,i=0,j;
    uchar temp1[8];
        dingshi();
        while(1)
                {
                        num=juzhen_sca();
                        if(num!=0xff)
                             {  if(i<8)
                                  {
                                        temp1=duanma[num];
                                        for(j=0;j<=i;j++)
                                                shu[7-i+j]=temp1[j];       
                                  }
                                   i++;
                                if(i==9)
                                  {        i=0;
                                        for(j=0;j<8;j++)
                                                shu[j]=0;
                              }
                  }
             }
}首先谢谢,那请问下我这个循环里面的扫描时间哪里不一样,我找了好久就是没搞懂

你这样问,证明你还没有仔细看程序;
你的显示程序不是在循环中语句中调用,自己先看一下程序吧;
造成显示亮度不一的原因还是一样的。

对于说的我还是不太理解,但是那个显示函数放在定时器里面应该对数码管各管的扫描时间一样啊,但为什么会出现不同的亮度,这个还是找不到原因,但实际现象可以说明,各管的扫描时间绝对不一样,

答案在我的第一个回答中找

谢谢,我懂了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top