|
我做一個(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è)原因嗎?還是其他什么原因呢?
|
|