while不循环

[复制链接]
2058|6
 楼主| jijinxiangdian 发表于 2013-6-19 19:52 | 显示全部楼层 |阅读模式
代码里的while循环不执行,这是什么原因?
void main ()
{
  unsigned char idata i;
  //EA=0;
  SysClk_Init();
  Port_Init();  
  lcd_init();     //设定液晶工作方式
// EA=1;

  while(1)
  {
    PCA0CPH4=PCA0H+PCA0CPL4;                                                             //喂狗
        send_com(0x01);
    LED=~LED;
    printstr(1,1,buf,4);
    printstr(2,1,buf,4);
    printstr(3,1,buf,4);
    printstr(4,1,buf,4);
    for(i=0;i<10;i++)
    {
      i--;
      i++;
    }
  }
}
在“SysClk_Init();”处设了一个断点,运行每次都会停在这里。按照代码,应该是第一次运行执行该初始化程序,后面的应该循环执行while里面的才对啊!
而现在成了整个main函数在循环了!求真相!请高手指点!在线等答案!
jamsan 发表于 2013-6-20 11:35 | 显示全部楼层
你打开汇编看一下。也许是编绎出错了。可以修改一下编绎的优化级别。
还有一种情况是你程序在while循环里崩溃了。你看到的main循环实际是在不停的复位。
lz80650904 发表于 2013-6-20 12:00 | 显示全部楼层
在SysClk_Init(); 设置断点,那当然停在里面了。。。。。。。。 你把这句注释掉看看能不能运行后面的就可以知道那里出问题了
 楼主| jijinxiangdian 发表于 2013-6-20 14:56 | 显示全部楼层
jamsan 发表于 2013-6-20 11:35
你打开汇编看一下。也许是编绎出错了。可以修改一下编绎的优化级别。
还有一种情况是你程序在while循环里崩 ...

嗯!谢谢建议!看了汇编,代码是被编译了的!
猜想问题可能出在lcd_init()函数里面。里面调用了一个读LCD忙碌标志位的函数,如果LCD在忙就等着,而我在配置单片机端口的时候误把该标志位所连的端口配置成了推挽输出,端口初始化时该位被置1,忙碌标志无法清零,程序等不到LCD空闲,所以一直死在哪里,最后看门狗就将系统复位了!
这是我找了推挽输出和开漏输出架构区别仔细看了后的猜想!昨天单步调试的时候也确实是在那里系统复位的。
但如果真是这样的话,又有一个疑问!
即使推挽输出下的端口被置一后一直是VDD,那LCD忙完后把忙碌标志清0时不就相当于VDD对地短接了么?VDD将被拉低,这个系统将掉电才是!而事实不是这样!除非LCD的忙碌为引脚里面有下拉电阻!
今天请假了没在实验室,也没法验证,先和大家讨论下!
 楼主| jijinxiangdian 发表于 2013-6-20 14:57 | 显示全部楼层
lz80650904 发表于 2013-6-20 12:00
在SysClk_Init(); 设置断点,那当然停在里面了。。。。。。。。 你把这句注释掉看看能不能运行后面的就可以 ...

嗯!谢谢!
sxhhhjicbb 发表于 2013-6-20 16:07 | 显示全部楼层
还没到while(1),狗就工作了.
find_all 发表于 2013-6-28 15:24 | 显示全部楼层
还没到while(1),狗就工作了.
推挽输出下的端口被置一后一直是VDD,  那是VDD嘛?!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

0

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