静待高手解释一个while语句问题

[复制链接]
2985|18
 楼主| Step1toStep5 发表于 2011-3-30 10:27 | 显示全部楼层 |阅读模式
本帖最后由 Step1toStep5 于 2011-3-30 11:12 编辑

#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char


uchar NUM[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x3f};
void delay();

void main()
{
        uchar i;
        uint x=10;
        while(1)
        {
                for(i=0;i<10;i++)
                {
                        P0=NUM[ i ];
                        while(x--)delay();
                }
        }        
}

void delay()   //延时50ms 误差 0us
{
    unsigned char a,b;
    for(b=173;b>0;b--)
        for(a=143;a>0;a--);
}


上面是一个简单的数码管程序,但是为什么只能跑2个数字,就是显示前2个 1和2 然后就不变了。。。为什么捏,请高手解释
ayb_ice 发表于 2011-3-30 10:54 | 显示全部楼层
P0=NUM;
应该是P0=NUM[i];
 楼主| Step1toStep5 发表于 2011-3-30 11:12 | 显示全部楼层
= = LS 这个是编辑问题 不好意思啊
 楼主| Step1toStep5 发表于 2011-3-30 11:12 | 显示全部楼层
问题还是在的 - - 不是这个引起的
gaoyiyiyi 发表于 2011-3-30 11:30 | 显示全部楼层
P0=NUM[ i ];
                        while(x--)delay();
问题出在这里。
你要把UINT X=10放到FOR循环里面才行
gaoyiyiyi 发表于 2011-3-30 11:31 | 显示全部楼层
void main()
{
        uchar i;
                while(1)
        {
                for(i=0;i<10;i++)
                {     uint x=10;

                        P0=NUM[ i ];
                        while(x--)delay();
                }
        }        
}

就这样改,这个是C语言问题
hgjinwei 发表于 2011-3-30 12:32 | 显示全部楼层
慢慢等吧,会出现3的。
shell.albert 发表于 2011-3-30 13:14 | 显示全部楼层
So easy problem.


Enter debug mode,step by step.
 楼主| Step1toStep5 发表于 2011-3-30 17:56 | 显示全部楼层
7# gaoyiyiyi

恩 你说的是对的 但是 为什么呢? - - 是啥引起的啊?
老鱼探戈 发表于 2011-3-30 18:34 | 显示全部楼层
本帖最后由 老鱼探戈 于 2011-3-30 18:35 编辑

uint 是16为的减到0之后 在减就变成0xffff了, 只能慢慢延时了。时间自己去算吧
改成局部变量,每次都没赋值成 10 了 ,即你要的0.5s 延时
xuesong10210 发表于 2011-3-30 19:04 | 显示全部楼层
这个的X只实现了一次循环。大循环的 while(1)
应在给X赋初值  7楼的那个应该是对的。
不过我觉得应该显示的是1和8.
如果是2的话应该是在变成2后在while(x--)delay()形成了死循环,跳不出来了。
ahuwangyue 发表于 2011-3-30 21:48 | 显示全部楼层
慢慢等 会有3的
eydj2008 发表于 2011-3-31 08:14 | 显示全部楼层
void main()
{
        uchar i;
        uint x=10;
        while(1)
        {
                x = 10;
                for(i=0;i<10;i++)
                {
                        P0=NUM[ i ];
                        while(x--)delay();
                }
        }        
}
wxgwxg 发表于 2011-3-31 11:37 | 显示全部楼层
14楼的说的对,你的X在for中应重置,不然成负数了
hgjinwei 发表于 2011-3-31 12:36 | 显示全部楼层
14L 也不行,
问题出在 while(x--) 上,for 循环一周后,x = 0xffff,下一周需要执行65535(假如uint 16位)次delay() 操作。
LZ等上个3000多秒就会出现2了,之后再等上3000秒,出现3;依次类推。
之所以会出现0和1正常,是因为for循环能“正常”跑上一周。
eydj2008 发表于 2011-4-2 09:00 | 显示全部楼层
void main()
{
        uchar i;
        uint x=10;
        while(1)
        {
                x = 10;
                for(i=0;i<10;i++)
                {
                        P0=NUM[ i ];
                        while(x)
                        {
                        x--;
                        }
                         delay();
                }
        }        
}
eydj2008 发表于 2011-4-2 09:04 | 显示全部楼层
while(x)
                        {
                        x--;
                        }
                         delay();
这二个是重复一点意义都没有
 楼主| Step1toStep5 发表于 2011-4-2 09:24 | 显示全部楼层
谢谢楼上诸位啊 问题OK了 就是溢出来 得慢慢等了。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:都是鼠标惹得祸

0

主题

63

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部