欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2084|回復: 9
打印 上一主題 下一主題
收起左側

C語言while嵌套中,判斷條件改變后,執行程序為啥沒有改變?

[復制鏈接]
跳轉到指定樓層
樓主
ID:997026 發表于 2022-2-24 23:26 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
我做一個方案,就是做一個小的監控器(帶顯示屏),隨時監控設備運行情況,當設備發生緊急情況時,監控器立即啟動報警,同時顯示屏上顯示對應的故障碼。

緊急情況有兩種,設備過流(對應故障碼E1),以及設備過載(對應故障碼E2).

緊急情況的優先級最高,當程序正常運行時,一旦發生緊急情況,無論當前在運行什么程序,必須無條件跳轉到緊急情況程序中,緊急情況結束后,再自動返回到之前運行的程序中。

程序框架如下:

int  main(void)
{

uint8_t   over_current_flag=1;  //過流發生標志位, 當為低時,表示過流發生,下同
uint8_t   over_load_flag=1; //設備過載標志位

while(1)
{

   normal_run(); //正常運行程序,即時監控

   while(!over_current_flag || !over_load_flag)  //檢測到低電平時,立即跳轉到該循環

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

}

}



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

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

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

}


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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

檢測主要是硬件檢測的,軟件上很簡單,就是用這兩個變量over_current_flag  和over_load_flag來監控的,因為這兩個變量是直接連接到單片機IO口的,如果IO口變為低,over_current_flag  和over_load_flag就為0,反之為1,沒其他檢測代碼
回復

使用道具 舉報

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

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

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

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

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

  16.                 if(state_A != state)//即時監控,當狀態發生變化時
  17.                 {
  18.                         state_A = state;//保存當前狀態
  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. }
復制代碼
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

沙發
ID:272119 發表于 2022-2-25 08:20 | 只看該作者
個人淺見,首先邏輯沒有理清12狀態獨立區分,一旦發生12,首先是1,然后2,然后如果沒有什么處理12依然會顯示.和while沒有大關系.
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表