阅读:2421回复:5
偶就是看中 swith -case结构了,看看这样用行不行?
我在每个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; |
|
|
沙发#
发布于:2005-03-31 18:09
你们要是这么评价就说明我的程序是成功的。记得好像是谭浩强的 C教科书里说过,可以有意识的在case里不用break。我的break是跳出do while ,
“不过已我的理解WriteByte(0x00,0x02);好像有点问题”这是用剪切版贴上去的,还没改参数。其用意是记录函数的运行状态。系统上电或看门狗复位后,读取该状态从而使程序继续运行。这也是swich结构中case语句没有break的原因。这个函数可能要运行几个小时,才能返回。 但是有一个问题不好处理:DefultRunNub是 volatile变量,用意是可以在运行中从键盘再输入。但是,函数不返回又怎么能读键盘呢。如果再在这个大函数中再嵌入键盘程序是不是太大了点,再者键盘处理是要以十几秒记的!那样A/D转换不就错过了吗?配料电机可是一直在转啊!要出问题的!考虑了很长时间了,没好法!因为要控制电机的运行,这个程序安全性很高,所以也很难写。我花了很长时间了!来回的改。 |
|
|