lzl
lzl
驱动大牛
驱动大牛
  • 注册日期2001-09-11
  • 最后登录2010-06-22
  • 粉丝1
  • 关注0
  • 积分127分
  • 威望48点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
阅读:2499回复:5

偶就是看中 swith -case结构了,看看这样用行不行?

楼主#
更多 发布于:2005-03-23 09:36
我在每个do- while循环中保存运行状况,当程序跑飞看门狗复位或掉电复位后能接着运行,用不带break的swith -case结构,让他从断点继续运行。程序如下:
DefultRunNub=ReadByte(0x11); //It should be seted at funcation \"SetRunNub(void)\"
 for(,DefultRunNub<=0,DefultRunNub--)    //罐数循环
   {   i=0;   //材料循环
      wrDisplay(0x81);
      wrDisplay(cHexToBcd);
 WriteByte(DefultRunNub,0x11);//Save 剩余的运行次数
swith(ReadByte(0x02))
case 0:
 {
 P0=P0&(0x01<<i); //start \"0\"motor
     do  {  h_temp=read2543(0);
       WriteByte(0x00,0x02);
WriteWord(h_temp,0x03);       //当前工作通道存02h,重量存03h、04h。
       if(h_temp<=(CurrentSandHeavy- No_0_Verfiy))
wrDisplay(0x83);
wrDisplay(0x80);
iHexToBcd=iHex_Bcd(h_temp);
rstdog();
wrDisplay4b(iHexToBcd);
wrDisplay(0x98);
wrDisplay(0xff);
if((h_temp-CurrentSandHeavy- No_0_Verfiy)<10)
break;
else Delay50ms(80);
           } while(h_temp<(CurrentSandHeavy- No_0_Verfiy));
}
case 1:{
   i++;
   P0=P0&(0x01<<i);   //start \"1\"motor
 do { h_temp=read2543(0);
       WriteByte(0x00,0x02);
WriteWord(h_temp,0x03);       //当前工作通道存02h,重量存03h、04h。
     
wrDisplay(0x83);
wrDisplay(0x81);
CurrentReal1Heavy=h_temp-CurrentSandHeavy;
       if(CurrentReal1Heavy<=(CurrentGravel1Heavy-No_1_Verfiy))

iHexToBcd=iHex_Bcd(CurrentReal1Heavy);
rstdog();
wrDisplay4b(iHexToBcd);
wrDisplay(0x98);
wrDisplay(0xff);
if((CurrentGravel1Heavy- No_1_Verfiy-CurrentReal1Heavy)<10)
break;
else Delay50ms(80);
    } while(CurrentReal1Heavy<(CurrentGravel1Heavy-No_1_Verfiy));
case 2:{  
  i++;
   P0=P0&(0x01<<i);   //start \"2\"motor
 do { h_temp=read2543(0);
       WriteByte(0x00,0x02);
WriteWord(h_temp,0x03);       //当前工作通道存02h,重量存03h、04h。
       
CurrentReal2Heavy=h_temp-CurrentSandHeavy-CurrentGravel1Heavy;//No2 Real Heavy
wrDisplay(0x83);
wrDisplay(0x82);
       if(CurrentReal2Heavy<=(CurrentGravel2Heavy- No_2_Verfiy))//No2 less than set vlau?
iHexToBcd=iHex_Bcd(CurrentReal2Heavy);
rstdog();
wrDisplay4b(iHexToBcd);
wrDisplay(0x98);
wrDisplay(0xff);
if((CurrentGravel2Heavy- No_2_Verfiy-CurrentReal2Heavy)<10)
break;
else Delay50ms(80);
    } while(CurrentReal2Heavy<(CurrentGravel2Heavy-No_1_Verfiy));
 }
   i++;  //等待料都到位信号,到位后卸料。
while(!Limit)
{rstdog();
WriteByte(0x00,0x02);
WriteWord(0x00,0x03);//本次循环完成,下次从0通道开始.
}
P0&=(0x01<<i);

 }
        return;
l=z=l 我听说,灌水是使分数快速增长的有效方法
cahwlx1982
驱动小牛
驱动小牛
  • 注册日期2004-08-16
  • 最后登录2006-06-17
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-03-29 10:04
恩……,算我直言,我没有仔细看你的程序的思路是怎么样子的,但是就看你的语法。
   我想你就这样写程序肯定是一个很失败的程序,八层运行不了!
你的C语言写的太混乱了!
   swith - case 和do while可以放在一起运行,但是你把break放的位置仔细的看一看,它是一个跳出语句呀。一旦执行到这个语句就跳出了这个swith语句的,另外如果你认为只要不满足IF条件的语句,就不会执行break语句,那么程序将将继续执行下一个CASE里面的内容!
   感觉你写的程序太混乱了,我只是发表自己的一个看法,如果有什么不妥的地方,还请多多包涵!
   我个人认为C语言应该追求的是简洁明了,这样有利于阅读,当然当有问题出现的话,也便于自己查找。就跟用英语表达一样不需要太华丽或是什么从句呀,很长的句子一样,还是尽量口语比较好理解!

lbcat
驱动牛犊
驱动牛犊
  • 注册日期2002-03-19
  • 最后登录2007-09-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-29 13:52
  其实楼主的程序是乱了一点,不过思路还是没问题的,只是有一点语法上的错误而已。break是用的没问题的,它是跳出while循环而不是switch,楼主之所以不要switch的break是有他的用意的,他正是想程序顺序执行下去。不过已我的理解WriteByte(0x00,0x02);好像有点问题,怎么每个case里都是写同一个值的?这不是每次中断后就回不到原来的断点了吗??都是从case 0 开始执行了?

 :D
501lsc
驱动牛犊
驱动牛犊
  • 注册日期2001-10-04
  • 最后登录2005-05-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-03-31 15:23
偶楼上的兄弟真是高人,偶非常赞成你的观点
lzl
lzl
驱动大牛
驱动大牛
  • 注册日期2001-09-11
  • 最后登录2010-06-22
  • 粉丝1
  • 关注0
  • 积分127分
  • 威望48点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-03-31 18:09
你们要是这么评价就说明我的程序是成功的。记得好像是谭浩强的 C教科书里说过,可以有意识的在case里不用break。我的break是跳出do while ,
“不过已我的理解WriteByte(0x00,0x02);好像有点问题”这是用剪切版贴上去的,还没改参数。其用意是记录函数的运行状态。系统上电或看门狗复位后,读取该状态从而使程序继续运行。这也是swich结构中case语句没有break的原因。这个函数可能要运行几个小时,才能返回。
但是有一个问题不好处理:DefultRunNub是 volatile变量,用意是可以在运行中从键盘再输入。但是,函数不返回又怎么能读键盘呢。如果再在这个大函数中再嵌入键盘程序是不是太大了点,再者键盘处理是要以十几秒记的!那样A/D转换不就错过了吗?配料电机可是一直在转啊!要出问题的!考虑了很长时间了,没好法!因为要控制电机的运行,这个程序安全性很高,所以也很难写。我花了很长时间了!来回的改。
l=z=l 我听说,灌水是使分数快速增长的有效方法
lbcat
驱动牛犊
驱动牛犊
  • 注册日期2002-03-19
  • 最后登录2007-09-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-04-01 08:13
 不能用中断???
游客

返回顶部