[求助] 请教while(1)循环的问题!!

lalaone   2012-1-17 12:40 楼主

今天在编写1602程序的时候发现一个奇怪的问题:

 void main()

{ while(1)

{ uchar ch[8] = {0x53,0x54,0x43,0x38,0x39,0x43,0x35,0x32};

uchar i;

lcd_init();

 for(i = 0;i < 8;i++)

display_lcd(0x80+i,ch);

}

} while语句这么使用的时候,1602显示正常

但是

当void main()

{ uchar ch[8] = {0x53,0x54,0x43,0x38,0x39,0x43,0x35,0x32};

uchar i;

lcd_init();

for(i = 0;i < 8;i++)

display_lcd(0x80+i,ch);

 while(1);

} 此时,1602就不显示了数组的内容了。很奇怪!!

[ 本帖最后由 lalaone 于 2012-1-17 13:03 编辑 ]

回复评论 (17)

这个好理解

第一个while(1){}是有语句的即大括号里的语句,而第二个没有,当你还没看到显示是,已经在while(1);里死等了
http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
点赞  2012-1-17 13:33
while(1);程序会将一直停留在这句无限循环,不会再回到前面执行 [ 本帖最后由 孤獨の快樂 于 2012-1-17 14:28 编辑 ]
点赞  2012-1-17 14:25

回复 沙发 ddllxxrr 的帖子

可是第一条语句是把整个初始化都括里面了,1602才能显示啊!!为什么呢?
点赞  2012-1-17 14:34

回复 板凳 孤獨の快樂 的帖子

你的意思是说,void main()
{
led0 = 0;
while(1);
}
这条语句是一直停留在while里了,而不是一直点亮led0呗!!
点赞  2012-1-17 14:36

引用: 原帖由 lalaone 于 2012-1-17 12:40 发表 今天在编写1602程序的时候发现一个奇怪的问题:  void main() { while(1) { uchar ch[8] = {0x53,0x54,0x43,0x38,0x39,0x43,0x35,0x32}; uchar i; lcd_init();  for(i = 0;i < 8;i++) display ...

 

除了楼上说的while(1)的区别外,一般来说LCD1602是不用动态扫描的,写入字符显示后进入while(1);应该也是可以显示的。

楼主对1602的操作函数,也应该检查一下,看看是不是关显示了。

点赞  2012-1-17 14:46

回复 6楼 David_Lee 的帖子

好的、、但,为什么把初始化都放入while了,反而可以显示了呢?
点赞  2012-1-17 14:50

引用: 原帖由 lalaone 于 2012-1-17 14:36 发表 你的意思是说,void main() { led0 = 0; while(1); } 这条语句是一直停留在while里了,而不是一直点亮led0呗!!

led=0执行一次,输出就一直是0了,不用循环执行的

点赞  2012-1-17 15:11

按理说1602显示一次就会一直存在的,第二种写法也没啥问题才是

把lcd_init(); 和display_lcd();函数贴出来吧

点赞  2012-1-17 15:15

回复 8楼 孤獨の快樂 的帖子

那这条while语句有什么作用呢?不用它,led0是不是也一直等于0呢?
点赞  2012-1-17 20:12

引用: 原帖由 孤獨の快樂 于 2012-1-17 15:15 发表 按理说1602显示一次就会一直存在的,第二种写法也没啥问题才是把lcd_init(); 和display_lcd();函数贴出来吧

 

问题解决了,就是延时不够呵呵。。

点赞  2012-1-17 20:16

引用: 原帖由 lalaone 于 2012-1-17 20:12 发表 那这条while语句有什么作用呢?不用它,led0是不是也一直等于0呢?

作用就是使程序停留在while(1);

点赞  2012-1-17 23:15

引用: 原帖由 lalaone 于 2012-1-17 20:16 发表   问题解决了,就是延时不够呵呵。。

51写LCD需要延时吗?

难道不是通常的速率了·····

点赞  2012-1-17 23:16

回复 13楼 孤獨の快樂 的帖子

真的需要。当我加完延时后,真的可以正常显示了。
点赞  2012-1-18 13:00

回复 4楼 lalaone 的帖子

你把初始化,就是lcd_Init放到while外面,只保留刷新数值的那个for在里头就好了,试试。

很可能,这玩意是不带锁存的。所以要不断刷新内容。
强者为尊,弱者,死无葬身之地
点赞  2012-1-18 14:57
引用: 原帖由 孤獨の快樂 于 2012-1-17 15:15 发表 按理说1602显示一次就会一直存在的,第二种写法也没啥问题才是 把lcd_init(); 和display_lcd();函数贴出来吧
强者为尊,弱者,死无葬身之地
点赞  2012-1-18 15:00
第1种循环体一直执行,数据一直在刷新,第2种执行一次,while(1)死循环了,数据不刷新,LCD不会亮的。
点赞  2012-1-18 17:08

引用: 原帖由 marco515 于 2012-1-18 17:08 发表 第1种循环体一直执行,数据一直在刷新,第2种执行一次,while(1)死循环了,数据不刷新,LCD不会亮的。

还有需要不断刷新的1602吗?

点赞  2012-1-18 22:21
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复