打印

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

[复制链接]
2111|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 | 只看该作者
问题还是在的 - - 不是这个引起的

使用特权

评论回复
5
gaoyiyiyi| | 2011-3-30 11:30 | 只看该作者
P0=NUM[ i ];
                        while(x--)delay();
问题出在这里。
你要把UINT X=10放到FOR循环里面才行

使用特权

评论回复
6
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语言问题

使用特权

评论回复
7
hgjinwei| | 2011-3-30 12:32 | 只看该作者
慢慢等吧,会出现3的。

使用特权

评论回复
8
shell.albert| | 2011-3-30 13:14 | 只看该作者
So easy problem.


Enter debug mode,step by step.

使用特权

评论回复
9
Step1toStep5|  楼主 | 2011-3-30 17:56 | 只看该作者
7# gaoyiyiyi

恩 你说的是对的 但是 为什么呢? - - 是啥引起的啊?

使用特权

评论回复
10
老鱼探戈| | 2011-3-30 18:34 | 只看该作者
本帖最后由 老鱼探戈 于 2011-3-30 18:35 编辑

uint 是16为的减到0之后 在减就变成0xffff了, 只能慢慢延时了。时间自己去算吧
改成局部变量,每次都没赋值成 10 了 ,即你要的0.5s 延时

使用特权

评论回复
11
xuesong10210| | 2011-3-30 19:04 | 只看该作者
这个的X只实现了一次循环。大循环的 while(1)
应在给X赋初值  7楼的那个应该是对的。
不过我觉得应该显示的是1和8.
如果是2的话应该是在变成2后在while(x--)delay()形成了死循环,跳不出来了。

使用特权

评论回复
12
ahuwangyue| | 2011-3-30 21:48 | 只看该作者
慢慢等 会有3的

使用特权

评论回复
13
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();
                }
        }        
}

使用特权

评论回复
14
wxgwxg| | 2011-3-31 11:37 | 只看该作者
14楼的说的对,你的X在for中应重置,不然成负数了

使用特权

评论回复
15
hgjinwei| | 2011-3-31 12:36 | 只看该作者
14L 也不行,
问题出在 while(x--) 上,for 循环一周后,x = 0xffff,下一周需要执行65535(假如uint 16位)次delay() 操作。
LZ等上个3000多秒就会出现2了,之后再等上3000秒,出现3;依次类推。
之所以会出现0和1正常,是因为for循环能“正常”跑上一周。

使用特权

评论回复
16
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();
                }
        }        
}

使用特权

评论回复
17
eydj2008| | 2011-4-2 09:04 | 只看该作者
while(x)
                        {
                        x--;
                        }
                         delay();
这二个是重复一点意义都没有

使用特权

评论回复
18
Step1toStep5|  楼主 | 2011-4-2 09:24 | 只看该作者
谢谢楼上诸位啊 问题OK了 就是溢出来 得慢慢等了。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

0

主题

63

帖子

1

粉丝