久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1748|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

C語言while嵌套中,判斷條件改變后,執(zhí)行程序?yàn)樯稕]有改變?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:997026 發(fā)表于 2022-2-24 23:26 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我做一個(gè)方案,就是做一個(gè)小的監(jiān)控器(帶顯示屏),隨時(shí)監(jiān)控設(shè)備運(yùn)行情況,當(dāng)設(shè)備發(fā)生緊急情況時(shí),監(jiān)控器立即啟動(dòng)報(bào)警,同時(shí)顯示屏上顯示對(duì)應(yīng)的故障碼。

緊急情況有兩種,設(shè)備過流(對(duì)應(yīng)故障碼E1),以及設(shè)備過載(對(duì)應(yīng)故障碼E2).

緊急情況的優(yōu)先級(jí)最高,當(dāng)程序正常運(yùn)行時(shí),一旦發(fā)生緊急情況,無論當(dāng)前在運(yùn)行什么程序,必須無條件跳轉(zhuǎn)到緊急情況程序中,緊急情況結(jié)束后,再自動(dòng)返回到之前運(yùn)行的程序中。

程序框架如下:

int  main(void)
{

uint8_t   over_current_flag=1;  //過流發(fā)生標(biāo)志位, 當(dāng)為低時(shí),表示過流發(fā)生,下同
uint8_t   over_load_flag=1; //設(shè)備過載標(biāo)志位

while(1)
{

   normal_run(); //正常運(yùn)行程序,即時(shí)監(jiān)控

   while(!over_current_flag || !over_load_flag)  //檢測到低電平時(shí),立即跳轉(zhuǎn)到該循環(huán)

    ErrorCode_DISPALY() ;  //根據(jù)發(fā)生實(shí)際情況,顯示E1, E2, 或兩種同時(shí)發(fā)生時(shí),組合顯示E1,E2

}

}



void  ErrorCode_DISPLAY()
{
if(!over_current_flag)
E1_DISPLAY(); //過流時(shí)顯示E1

if(!over_load_flag)
E2_DISPLAY(); //過載時(shí)顯示E2

if(!over_current_flag && !over_load_flag)
E12_DISPLAY(); //過流和過載同時(shí)發(fā)生,顯示屏同時(shí)顯示E1和E2

}


現(xiàn)在的問題是:
如果只發(fā)生一種, 比如E1或E2,顯示屏可以正常顯示,沒問題。如果發(fā)生了過流,顯示屏顯示E1, 過了一會(huì),又發(fā)生了過載,可是仍然顯示的是E1. 并不會(huì)同時(shí)顯示E1,E2, 這是為何呢?
當(dāng)發(fā)生E1時(shí),由于 while循環(huán)中while(!over_current_flag || !over_load_flag) 用的是||,只要有一個(gè)為真就執(zhí)行程序,此時(shí)!over_current_flag 為真,開始執(zhí)行程序。后來當(dāng)!over_load_flag也為真時(shí),并沒有改變!over_current_flag || !over_load_flag整個(gè)的邏輯,因?yàn)樗恢睘檎妫沁@個(gè)原因嗎?還是其他什么原因呢?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:272119 發(fā)表于 2022-2-25 08:20 | 只看該作者
個(gè)人淺見,首先邏輯沒有理清12狀態(tài)獨(dú)立區(qū)分,一旦發(fā)生12,首先是1,然后2,然后如果沒有什么處理12依然會(huì)顯示.和while沒有大關(guān)系.
回復(fù)

使用道具 舉報(bào)

板凳
ID:584814 發(fā)表于 2022-2-25 08:26 | 只看該作者
E1發(fā)生后,是否卡死在報(bào)警而不去檢測了 ?
只給出片段讓大家猜謎真的不好玩
回復(fù)

使用道具 舉報(bào)

地板
ID:625730 發(fā)表于 2022-2-25 09:18 | 只看該作者
是你說的情況,過流如果不消除,就一直在執(zhí)行while循環(huán)里的
回復(fù)

使用道具 舉報(bào)

5#
ID:625730 發(fā)表于 2022-2-25 09:21 | 只看該作者
如果需要區(qū)分,就要做更多的邏輯判斷,比如只有過流while(!over_current_flag &&over_load_flag),過流和過載同時(shí)有,while(!over_current_flag && !over_load_flag);
只有過載while(over_current_flag && !over_load_flag);
回復(fù)

使用道具 舉報(bào)

6#
ID:213173 發(fā)表于 2022-2-25 09:23 | 只看該作者
單從樓主貼的代碼看不出有什么大問題,問題應(yīng)該出在顯示代碼中。建議樓主不要在主循環(huán)中使用while(x)不確定的長時(shí)間等待,而是要讓程序不停跑起來。
  1. void main(void)
  2. {
  3.         uint8_t   over_current_flag=1;  //過流發(fā)生標(biāo)志位, 當(dāng)為低時(shí),表示過流發(fā)生,下同
  4.         uint8_t   over_load_flag=1; //設(shè)備過載標(biāo)志位
  5.         uint8_t   state=0,state_A=0;//狀態(tài)變量

  6.         while(1)
  7.         {
  8.                 if(!over_current_flag || !over_load_flag)  //檢測到低電平時(shí)
  9.                 {

  10.                         if(!over_current_flag && !over_load_flag) state=4; //過流和過載同時(shí)發(fā)生

  11.                         else if(!over_current_flag) state=2;//過流
  12.                        
  13.                         else state=3;//過載

  14.                 }
  15.                 else state=1; //正常

  16.                 if(state_A != state)//即時(shí)監(jiān)控,當(dāng)狀態(tài)發(fā)生變化時(shí)
  17.                 {
  18.                         state_A = state;//保存當(dāng)前狀態(tài)
  19.                         ErrorCode_DISPLAY(state);//更新顯示
  20.                 }
  21.         }
  22. }

  23. void  ErrorCode_DISPLAY(uint8_t Code)
  24. {
  25.         switch(Code)
  26.         {
  27.                 case 1: /*顯示正常  */ break;
  28.                 case 2: /*顯示E1    */ break;
  29.                 case 3: /*顯示E2    */ break;
  30.                 case 4: /*顯示E1、E2*/ break;
  31.                 default:/*          */ break;
  32.         }
  33. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

7#
ID:997026 發(fā)表于 2022-2-25 09:56 | 只看該作者
man1234567 發(fā)表于 2022-2-25 08:26
E1發(fā)生后,是否卡死在報(bào)警而不去檢測了 ?
只給出片段讓大家猜謎真的不好玩

檢測主要是硬件檢測的,軟件上很簡單,就是用這兩個(gè)變量over_current_flag  和over_load_flag來監(jiān)控的,因?yàn)檫@兩個(gè)變量是直接連接到單片機(jī)IO口的,如果IO口變?yōu)榈停琽ver_current_flag  和over_load_flag就為0,反之為1,沒其他檢測代碼
回復(fù)

使用道具 舉報(bào)

8#
ID:966423 發(fā)表于 2022-2-25 10:24 | 只看該作者
沒清標(biāo)志位的話程序都有運(yùn)行,只是后面的那段運(yùn)行較快,你顯示的時(shí)候只顯示第一次運(yùn)行的那個(gè)
回復(fù)

使用道具 舉報(bào)

9#
ID:997026 發(fā)表于 2022-2-25 10:53 | 只看該作者
wulin 發(fā)表于 2022-2-25 09:23
單從樓主貼的代碼看不出有什么大問題,問題應(yīng)該出在顯示代碼中。建議樓主不要在主循環(huán)中使用while(x)不確定 ...

感謝大神提供的代碼!感謝幫助!從你這里真的學(xué)到好多東西,萬分感謝!
回復(fù)

使用道具 舉報(bào)

10#
ID:123289 發(fā)表于 2022-2-26 11:15 | 只看該作者
因?yàn)槟闶茄h(huán)做事的:
E1時(shí),就去除了E2
E2時(shí),又不做E1了
E1、E2時(shí),雖然都做了,但旋即你又循環(huán)加頭,做E1,去除了E2……
總體年上去,E1、E2時(shí)你不斷的切換,改變顯示方式
明白道理就知道如何處理了。方法很多,這里說兩個(gè):
1、先判E1E2,是,顯示退出;再判E1,是,顯示退出;最后再E2……。(要點(diǎn),每個(gè)做完退出,復(fù)雜的先做)
2、先清顯示;再分別判E1、E2,無需判E1E2同時(shí),重點(diǎn)來了:顯示E1時(shí)不清E2,顯示E2時(shí)也不清E1。即讓E1與E2在表達(dá)上(顯示上)無關(guān)聯(lián)。
以上1、2、都能達(dá)成目的,但不是很好的方案,自己再想更好的方案吧。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日本成人在线观看网站 | 午夜国产一级片 | 亚洲国产精品一区二区三区 | 午夜视频一区二区 | 国产亚洲欧美日韩精品一区二区三区 | 看羞羞视频免费 | 日韩中文字幕第一页 | 波多野结衣一区二区三区 | 久久久精品在线 | 少妇一级淫片免费放播放 | 国产丝袜人妖cd露出 | 免费国产视频在线观看 | 中文字幕 在线观看 | 久久精品一区二区 | 天天色综 | 国产不卡一区 | 粉嫩一区二区三区四区公司1 | 婷婷综合激情 | 91在线网站 | 99国产精品久久久久久久 | 国产精品一区二区三区在线 | 国产精品久久久久久久久久免费看 | 国产精品免费一区二区三区四区 | 91麻豆精品一区二区三区 | 91国内产香蕉 | 国产乱码精品一区二区三区中文 | 国产精品视频久久 | 日韩午夜电影在线观看 | www.888www看片 | 国产欧美在线一区二区 | 99免费在线| 午夜视频在线免费观看 | www.日韩高清 | 中文字幕在线免费视频 | 国产日韩欧美一区二区在线播放 | 欧美极品少妇xxxxⅹ免费视频 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 精品国产乱码久久久久久图片 | 精品国产乱码久久久久久牛牛 | 狠狠躁夜夜躁人人爽天天高潮 | 久久综合久久久 |