找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 535|回复: 13
收起左侧

单片机四位动态数码管显示怎么只能显示最后一位,其它三位没有显示?

[复制链接]
ID:72649 发表于 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) ;
        }

}

回复

使用道具 举报

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

使用道具 举报

ID:277550 发表于 2024-1-16 14:23 | 显示全部楼层
扫描方式,每一位的延时多一点时间,因为眼睛不够快的

回复

使用道具 举报

ID:72649 发表于 2024-1-16 15:16 来自手机 | 显示全部楼层
cocolala 发表于 2024-1-16 14:21
1、电路图没有给出来,不好推测你的程序与硬件的控制方式是否一致。
    2、建议你可以把每一位显示之 ...

P10P11P12P13位选,P27-0对应a-h,共阳数码管
回复

使用道具 举报

ID:1057978 发表于 2024-1-16 15:27 | 显示全部楼层
每显示一个数字后就执行P10=1;P11=1;P12=1;P13=1;  取消他的显示了,连视觉暂留的机会都不给,理论上只能看到一个数字。
你把P10=1;P11=1;P12=1;P13=1;  这句扔循环外面去
回复

使用道具 举报

ID:1057978 发表于 2024-1-16 15:28 | 显示全部楼层
另外这种涉及多段显示的你要一个一个测试,都测试没问题显示正常了,再多个显示,你咋知道某个数码管是不是坏的
回复

使用道具 举报

ID:72649 发表于 2024-1-16 16:04 | 显示全部楼层
wangxiangtan 发表于 2024-1-16 15:28
另外这种涉及多段显示的你要一个一个测试,都测试没问题显示正常了,再多个显示,你咋知道某个数码管是不是 ...

如果100ms延时,每个度都可以显示
回复

使用道具 举报

ID:213173 发表于 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();
        }
}
回复

使用道具 举报

ID:427868 发表于 2024-1-17 08:13 | 显示全部楼层
是因为你只让P10位显示,P1-3位不显示,且是P10位轮流显示4位数。
回复

使用道具 举报

ID:482001 发表于 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循环里面试试呢?
回复

使用道具 举报

ID:72649 发表于 2024-1-20 09:52 | 显示全部楼层
wangxiangtan 发表于 2024-1-16 15:28
另外这种涉及多段显示的你要一个一个测试,都测试没问题显示正常了,再多个显示,你咋知道某个数码管是不是 ...

1S显示一次数码管显示数字都正常的
回复

使用道具 举报

ID:72649 发表于 2024-1-20 09:58 | 显示全部楼层
叶雨飞飞 发表于 2024-1-17 16:21
c=date/1000%10;                        //求千位
          d=date/100%10;                        // ...

循环里面还有程序,放进去了,速度跟不上去。
回复

使用道具 举报

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

使用道具 举报

ID:72649 发表于 2024-1-21 21:47 | 显示全部楼层
597329015 发表于 2024-1-20 11:03
根据你提供的代码,你的单片机代码只会显示最后一位数码管的数字,而其他三位数码管没有显示。这是因为在显 ...

原因找到了,非常感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表