标题: 单片机四位动态数码管显示怎么只能显示最后一位,其它三位没有显示? [打印本页]

作者: hjx5548    时间: 2024-1-16 13:16
标题: 单片机四位动态数码管显示怎么只能显示最后一位,其它三位没有显示?
#include "STC8H.h"
#include "intrins.h"

unsigned char NixieTable[]={ 0x03,/*0*/
        0x9F,/*1*/
        0x25,/*2*/
        0x0D,/*3*/
        0x99,/*4*/
        0x49,/*5*/
        0x41,/*6*/
        0x1F,/*7*/
        0x01,/*8*/
        0x09,/*9*/};
        
void Delay1ms()                //@11.0592MHz
{
        unsigned char i, j;

        i = 15;
        j = 90;
        do
        {
                while (--j);
        } while (--i);
}

void DelayXms(unsigned int x) //@11.0592MHz
{
        while (--x)
        {
   Delay1ms();
         }
}

void Led_Code(unsigned long date) //显示函数
{        
        unsigned int c,d,e,f;
        

          c=date/1000%10;                        //求千位
          d=date/100%10;                        //求百位
          e=date/10%10;                                  //求十位
          f=date%10;                                          //求个位
        

        
          P10=1;P11=1;P12=1;P13=1;  
             P2=NixieTable[c];//千
          P10=0;P11=1;P12=1;P13=1;
          DelayXms(1);
               
          P10=1;P11=1;P12=1;P13=1;  
      P2=NixieTable[d];//百
          P10=1;P11=0;P12=1;P13=1;
          DelayXms(1);
               
                P10=1;P11=1;P12=1;P13=1;  
      P2=NixieTable[e];//十
          P10=1;P11=1;P12=0;P13=1;
          DelayXms(1);
               
                P10=1;P11=1;P12=1;P13=1;  
      P2=NixieTable[f];//个
          P10=1;P11=1;P12=1;P13=0;
          DelayXms(1);


}

void main()
{
    P1M0 = 0x3f; P1M1 = 0xc0;
    P2M0 = 0xff; P2M1 = 0x00;
        while (1)
        {
                Led_Code(1234) ;
        }

}


作者: cocolala    时间: 2024-1-16 14:21
    1、电路图没有给出来,不好推测你的程序与硬件的控制方式是否一致。
    2、建议你可以把每一位显示之间的延时加长,看看是不是4位都可以显示。目前是1ms,加大到1s。

作者: devcang    时间: 2024-1-16 14:23
扫描方式,每一位的延时多一点时间,因为眼睛不够快的


作者: hjx5548    时间: 2024-1-16 15:16
cocolala 发表于 2024-1-16 14:21
1、电路图没有给出来,不好推测你的程序与硬件的控制方式是否一致。
    2、建议你可以把每一位显示之 ...

P10P11P12P13位选,P27-0对应a-h,共阳数码管
作者: wangxiangtan    时间: 2024-1-16 15:27
每显示一个数字后就执行P10=1;P11=1;P12=1;P13=1;  取消他的显示了,连视觉暂留的机会都不给,理论上只能看到一个数字。
你把P10=1;P11=1;P12=1;P13=1;  这句扔循环外面去
作者: wangxiangtan    时间: 2024-1-16 15:28
另外这种涉及多段显示的你要一个一个测试,都测试没问题显示正常了,再多个显示,你咋知道某个数码管是不是坏的
作者: hjx5548    时间: 2024-1-16 16:04
wangxiangtan 发表于 2024-1-16 15:28
另外这种涉及多段显示的你要一个一个测试,都测试没问题显示正常了,再多个显示,你咋知道某个数码管是不是 ...

如果100ms延时,每个度都可以显示
作者: wulin    时间: 2024-1-16 21:08
hjx5548 发表于 2024-1-16 15:16
P10P11P12P13位选,P27-0对应a-h,共阳数码管

#include "STC8H.h"
#include "intrins.h"

unsigned char NixieTable[]={ 0x03,/*0*/
        0x9F,/*1*/
        0x25,/*2*/
        0x0D,/*3*/
        0x99,/*4*/
        0x49,/*5*/
        0x41,/*6*/
        0x1F,/*7*/
        0x01,/*8*/
        0x09,/*9*/};
        
void Delay1ms()                //@11.0592MHz
{
        unsigned char i, j;
        i = 15;
        j = 90;
        do
        {
                while (--j);
        } while (--i);
}

void Led_Code(unsigned int date) //显示函数
{        
        static unsigned  i;
        unsigned char a[4];
        a[0]=date/1000%10;
        a[1]=date/100%10;
        a[2]=date/10%10;
        a[3]=date%10;
        P2=0xff;
        P1=0x01<<i;
        P2=NixieTable[a[i ]];
        i=++i%4;
}

void main()
{
        P1M0 = 0x0f; P1M1 = 0x00;
        P2M0 = 0xff; P2M1 = 0x00;
        while (1)
        {
                Led_Code(1234);
                Delay1ms();
        }
}
作者: 刘佑红    时间: 2024-1-17 08:13
是因为你只让P10位显示,P1-3位不显示,且是P10位轮流显示4位数。
作者: 叶雨飞飞    时间: 2024-1-17 16:21
c=date/1000%10;                        //求千位
          d=date/100%10;                        //求百位
          e=date/10%10;                                  //求十位
          f=date%10;                                          //求个位
把这部分放到main的while循环外面
P10=1;P11=1;P12=1;P13=1;  
             P2=NixieTable[c];//千
          P10=0;P11=1;P12=1;P13=1;
          DelayXms(1);
               
          P10=1;P11=1;P12=1;P13=1;  
      P2=NixieTable[d];//百
          P10=1;P11=0;P12=1;P13=1;
          DelayXms(1);
               
                P10=1;P11=1;P12=1;P13=1;  
      P2=NixieTable[e];//十
          P10=1;P11=1;P12=0;P13=1;
          DelayXms(1);
               
                P10=1;P11=1;P12=1;P13=1;  
      P2=NixieTable[f];//个
          P10=1;P11=1;P12=1;P13=0;
          DelayXms(1);
这部分放到while循环里面试试呢?
作者: hjx5548    时间: 2024-1-20 09:52
wangxiangtan 发表于 2024-1-16 15:28
另外这种涉及多段显示的你要一个一个测试,都测试没问题显示正常了,再多个显示,你咋知道某个数码管是不是 ...

1S显示一次数码管显示数字都正常的
作者: hjx5548    时间: 2024-1-20 09:58
叶雨飞飞 发表于 2024-1-17 16:21
c=date/1000%10;                        //求千位
          d=date/100%10;                        // ...

循环里面还有程序,放进去了,速度跟不上去。
作者: 597329015    时间: 2024-1-20 11:03
根据你提供的代码,你的单片机代码只会显示最后一位数码管的数字,而其他三位数码管没有显示。这是因为在显示函数 Led_Code() 中,每次都会将四位数码管的控制引脚 P10、P11、P12、P13 都设置为高电平(1),然后再依次设置相应的数码管显示内容。  然而,在你的代码中,每次循环中只调用了一次 Led_Code(1234),并且没有等待一段时间再进行下一次调用。因此,程序在每次循环中只有很短暂的时间来显示数码管,而且由于控制引脚被设置为高电平,其他三位数码管无法正常显示。  为了解决这个问题,你可以在每次调用 Led_Code() 函数之间添加一定的延时时间,以使得每个数码管都能够显示出来。例如,你可以添加一个适当的延时函数 DelayXms() 在每次调用 Led_Code() 后,以便给数码管足够的时间来显示数字。你可以根据需要调整延时时间,确保数码管能够正常显示。
作者: hjx5548    时间: 2024-1-21 21:47
597329015 发表于 2024-1-20 11:03
根据你提供的代码,你的单片机代码只会显示最后一位数码管的数字,而其他三位数码管没有显示。这是因为在显 ...

原因找到了,非常感谢




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1