阅读:2499回复: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-29 10:04
恩……,算我直言,我没有仔细看你的程序的思路是怎么样子的,但是就看你的语法。
我想你就这样写程序肯定是一个很失败的程序,八层运行不了! 你的C语言写的太混乱了! swith - case 和do while可以放在一起运行,但是你把break放的位置仔细的看一看,它是一个跳出语句呀。一旦执行到这个语句就跳出了这个swith语句的,另外如果你认为只要不满足IF条件的语句,就不会执行break语句,那么程序将将继续执行下一个CASE里面的内容! 感觉你写的程序太混乱了,我只是发表自己的一个看法,如果有什么不妥的地方,还请多多包涵! 我个人认为C语言应该追求的是简洁明了,这样有利于阅读,当然当有问题出现的话,也便于自己查找。就跟用英语表达一样不需要太华丽或是什么从句呀,很长的句子一样,还是尽量口语比较好理解! |
|
板凳#
发布于:2005-03-29 13:52
其实楼主的程序是乱了一点,不过思路还是没问题的,只是有一点语法上的错误而已。break是用的没问题的,它是跳出while循环而不是switch,楼主之所以不要switch的break是有他的用意的,他正是想程序顺序执行下去。不过已我的理解WriteByte(0x00,0x02);好像有点问题,怎么每个case里都是写同一个值的?这不是每次中断后就回不到原来的断点了吗??都是从case 0 开始执行了?
:D |
|
地板#
发布于:2005-03-31 15:23
偶楼上的兄弟真是高人,偶非常赞成你的观点
|
|
地下室#
发布于:2005-03-31 18:09
你们要是这么评价就说明我的程序是成功的。记得好像是谭浩强的 C教科书里说过,可以有意识的在case里不用break。我的break是跳出do while ,
“不过已我的理解WriteByte(0x00,0x02);好像有点问题”这是用剪切版贴上去的,还没改参数。其用意是记录函数的运行状态。系统上电或看门狗复位后,读取该状态从而使程序继续运行。这也是swich结构中case语句没有break的原因。这个函数可能要运行几个小时,才能返回。 但是有一个问题不好处理:DefultRunNub是 volatile变量,用意是可以在运行中从键盘再输入。但是,函数不返回又怎么能读键盘呢。如果再在这个大函数中再嵌入键盘程序是不是太大了点,再者键盘处理是要以十几秒记的!那样A/D转换不就错过了吗?配料电机可是一直在转啊!要出问题的!考虑了很长时间了,没好法!因为要控制电机的运行,这个程序安全性很高,所以也很难写。我花了很长时间了!来回的改。 |
|
|
5楼#
发布于:2005-04-01 08:13
不能用中断???
|
|