Tobacco 发表于 2012-7-27 19:58:31

求帮助,这个程序里的while……break为什么不能去掉?

本帖最后由 Tobacco 于 2012-7-27 21:11 编辑

大家好,我初学单片机,今天写一个动态数码管程序的时候遇到一个问题很不解。请大家看看下面的程序先:
芯片是stc89C52RC,8位数码管共阴极,电路是这样的:p2.2~p2.4通过38译码器控制8位数码管片选信号。段信号由p0控制。

显示效果是8位数码管,第0~6位数码管依次显示数字0~6,第七位数码管循环显示0~F。#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

uchar i;
uchar code table[]=
{ //共阴极0~f数码管编码
0x3f,0x06,0x5b,0x4f,   //0~3
0x66,0x6d,0x7d,0x07,    //4~7
0x7f,0x6f,0x77,0x7c,    //8~b
0x39,0x5e,0x79,0x71    //c~f
};

void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
    for(j=110;j>0;j--)        ;
}

void wei7(uint n)        //第七位数码管独立显示0-F
{
while(1){               //while-break        为什么不能删除?
uchar x,count;
count++;
if(count==n)                        //每扫描n次,第七位数码管显示x+1
{
x++;P0=table;count=0;if(x==16){x=0;}
}
P0=table;   //如果不够n次,就继续显示x
break;               
}
}

void main ()
{
while(1)
{
for(i=0;i<8;i++)
{
P2=0x00;//000 000 00        ,001-00100,010-01000,,,111-11100
P2=P2+i*4;
P0=table ;
if(i==7){wei7(100);} //扫描到第七位的时候进入子程序。

delayms(1);
}
}
}程序用keil编译,下载之后正常运行,0~6位数码管依次显示数字0~6,第七位数码管循环显示0~F。但是当我去掉wei7子程序中while(1){}和break之后(就是改成下面的样子),第七位数码管一直显示0,但是到了本来该变换数字的时刻会跳动一下,请问有什么区别啊,为何不能去掉?谢谢~
=================================
void wei7(uint n)        //第七位数码管独立显示0-F
{
uchar x,count;
count++;
if(count==n)                        //每扫描n次,第七位数码管显示x+1
{
x++;P0=table;count=0;if(x==16){x=0;}
}
P0=table;   //如果不够n次,就继续显示x               
}
================================



pubuntu 发表于 2012-7-27 20:42:39

没看懂!

Tobacco 发表于 2012-7-27 21:09:35

pubuntu 发表于 2012-7-27 20:42 static/image/common/back.gif
没看懂!

就是将子函数wei7()按照最后两幅截图那样改~~改了之后,第七位数码管就一直显示0了,不改的话,第七位数码管会循环显示0~F。我就是搞不懂为什么不能去掉wei7()子函数开头的while和结尾的break,就算去掉了逻辑应该会是一样的吧?

散吧散吧 发表于 2012-7-27 21:20:06

一直显示0是正常的,我说一下,楼主想一下你的变量x和n是局部变量,每次运行函数初始化值是0,所以显示是0,闪说明是在扫描。。。
如果想要达到你要的效果把变量改为全局的试试看

pubuntu 发表于 2012-7-27 21:21:22

没有while ,x只会加一次。。没有break,就一直在while中不出来,其他数码管就不亮了。。可以试一试~!

pubuntu 发表于 2012-7-27 21:22:49

我纳闷,为什么x不是全局变量,x在每次执行中不会清零?

壹佰法拉 发表于 2012-7-27 21:24:42

不循环,你那 COUNT 何时等于 N

Tobacco 发表于 2012-7-27 22:16:49

散吧散吧 发表于 2012-7-27 21:20 static/image/common/back.gif
一直显示0是正常的,我说一下,楼主想一下你的变量x和n是局部变量,每次运行函数初始化值是0,所以显示是0 ...

4、6楼的朋友是对的~~我问了一下朋友,问题的确是局部变量的问题,我一开始加了while,keil编译后x和count每次都用到相同的ram空间,没有被清零……= =。将x和count放到全局变量就没有问题了orz……我等小白拜谢。
页: [1]
查看完整版本: 求帮助,这个程序里的while……break为什么不能去掉?