注册 登录
编程论坛 单片机编程

关于数码管动态显示,为什么不能跑完接龙,到第二下就停住了

yangzhe7878 发布于 2016-05-05 12:07, 5093 次点击
#include <reg52.h>
void delay(unsigned int t)
{
    while(t--)
    {
        unsigned char j;
        for(j=0;j<125;j++);
    }
}
/*unsigned char code b[]={
 
                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x77,  //"A"
                0x7C,  //"B"
                0x39,  //"C"
                0x5E,  //"D"
                0x79,  //"E"
                0x71,  //"F"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x00,  //熄灭
                0x00  //自定义
 
                         };*/
unsigned char code c[]={  //weixuan
    0x7f,
    0xbf,
    0xdf,
    0xef,
    0xf7,
    0xfb,
    0xfd,
    0xfe,

};
unsigned char code d520[]={       //520
    0x3f,
    0x5b,
    0x6d,

};
sbit we=P2^7;
sbit du=P2^6;
#define uchar unsigned char
#define uint unsigned int
void main()
{
    uchar i;
    uchar j;
   
    uint t1=100;
    for(j=0;j<6;j++)
    {
        while(t1--)
        {
             for(i=0;i<3;i++)
             {
                 du=1;
                P0=d520[i];
                du=0;
   
                we=1;
                P0=c[(j+i)];
                we=0;
                delay(1);
             }
        }
    }

        
}
2 回复
#2
取名字2016-05-15 23:02
你的主程序作如下改动就可以了(注意红色部分)。
void main()
{
    uchar i;
    uchar j;
    uint t1;
    for(j=0;j<6;j++)
    {
         t1=100;
        while(t1--)
        {
             for(i=0;i<3;i++)
             {
                 du=1;
                P0=d520[i];
                du=0;
   
                we=1;
                P0=c[(j+i)];
                we=0;
                delay(1);
             }
        }
    }     
}
你在第一层for循环外面定义t1变量并赋初值为100,用于里面的while循环,当"t1"减至0时,退出while循环,此时在第一层for循环和while循环之间没有重新给t1赋值,自然while循环执行完第一次之后,就不再为“真”,里面的for循环当然也就不再执行,所以你看到的就是“520”停在第5、6、7个数码管就不动了。


[此贴子已经被作者于2016-5-15 23:05编辑过]

#3
取名字2016-05-15 23:08
另外你的程序中是先操作段选而后操作位选,所以在打开位选之前应给P0赋值为0xff,关闭所有数码管的显示,以免产生“鬼影”。
1