搜索
bottom↓
回复: 7

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

[复制链接]

出0入0汤圆

发表于 2012-7-27 19:58:31 | 显示全部楼层 |阅读模式
本帖最后由 Tobacco 于 2012-7-27 21:11 编辑

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

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

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

  12. void delayms(uint xms)
  13. {
  14. uint i,j;
  15. for(i=xms;i>0;i--)
  16.     for(j=110;j>0;j--)        ;
  17. }

  18. void wei7(uint n)        //第七位数码管独立显示0-F
  19. {
  20. while(1){                 //while-break        为什么不能删除?
  21. uchar x,count;
  22. count++;
  23. if(count==n)                        //每扫描n次,第七位数码管显示x+1
  24. {
  25. x++;P0=table[x];count=0;if(x==16){x=0;}
  26. }
  27. P0=table[x];     //如果不够n次,就继续显示x
  28. break;               
  29. }
  30. }

  31. void main ()
  32. {
  33. while(1)
  34. {
  35. for(i=0;i<8;i++)
  36.   {
  37.   P2=0x00  ;//000 000 00        ,001-00100,010-01000,,,111-11100
  38.   P2=P2+i*4;
  39.   P0=table[i] ;
  40.   if(i==7){wei7(100);} //扫描到第七位的时候进入子程序。
  41.   
  42.   delayms(1);
  43.   }
  44. }
  45. }
复制代码
程序用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[x];count=0;if(x==16){x=0;}
}
P0=table[x];     //如果不够n次,就继续显示x               
}
================================



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-7-27 20:42:39 | 显示全部楼层
没看懂!

出0入0汤圆

 楼主| 发表于 2012-7-27 21:09:35 | 显示全部楼层
pubuntu 发表于 2012-7-27 20:42
没看懂!

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

出0入0汤圆

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

出0入0汤圆

发表于 2012-7-27 21:21:22 | 显示全部楼层
没有while ,x只会加一次。。没有break,就一直在while中不出来,其他数码管就不亮了。。可以试一试~!

出0入0汤圆

发表于 2012-7-27 21:22:49 | 显示全部楼层
我纳闷,为什么x不是全局变量,x在每次执行中不会清零?

出0入0汤圆

发表于 2012-7-27 21:24:42 | 显示全部楼层
不循环,你那 COUNT 何时等于 N

出0入0汤圆

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

4、6楼的朋友是对的~~我问了一下朋友,问题的确是局部变量的问题,我一开始加了while,keil编译后x和count每次都用到相同的ram空间,没有被清零……= =。将x和count放到全局变量就没有问题了orz……我等小白拜谢。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 16:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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