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

標題: 單片機程序重復(fù)調(diào)用一個函數(shù)多次后卡死 [打印本頁]

作者: PDDDF    時間: 2019-12-9 11:32
標題: 單片機程序重復(fù)調(diào)用一個函數(shù)多次后卡死
1.按鍵1按下標志變量加一,隨后進入菜單函數(shù);2.進菜單函數(shù)后switch  case區(qū)分標志變量,執(zhí)行多分支語句;
3.此時按鍵2,3為對應(yīng)功能數(shù)值的加減,再次按下按鍵1標志變量再加一,重復(fù)上述過程。

多次(平均20次)循環(huán)調(diào)用后會卡死,無論按下哪個按鍵都沒反應(yīng),無法解決,上來請教各路大神
PS:試過直接調(diào)用和函數(shù)指針調(diào)用,都出現(xiàn)相同的問題,已關(guān)閉中斷

作者: moluxiyan    時間: 2019-12-9 13:52
這樣讓大家猜,猜不出來,至少把關(guān)鍵部分代碼貼出來,還有用的什么型號單片機
作者: PDDDF    時間: 2019-12-9 14:46
截的圖片沒發(fā)出來,設(shè)置的數(shù)值放進EPPROM里面保存
按鍵部分的代碼:
void key_handle()
{
        uchar e1,e2,limit;
        long add1,add2;
        switch (q)
        {
                case 0:limit = 65;add1 = 0x0010;add2 = 0x0020;p = 1;break;
                case 1:limit = 24;add1 = 0x0020;add2 = 0x0010;break;
                case 2:limit = 23;add1 = 0x0210;add2 = 0x0220;break;
                case 3:limit = 24;add1 = 0x0220;add2 = 0x0210;break;
                case 4:limit = 23;add1 = 0x0410;add2 = 0x0420;break;
                case 5:limit = 24;add1 = 0x0420;add2 = 0x0410;break;
                case 6:limit = 23;add1 = 0x0610;add2 = 0x0620;break;
                case 7:limit = 24;add1 = 0x0620;add2 = 0x0610;break;
                case 8:limit = 24;add1 = 0x0810;add2 = 0x0820;break;
                case 9:limit = 24;add1 = 0x0820;add2 = 0x0810;break;
                case 10:limit = 1;add1 = 0x0A10;add2 = 0x0A20;p = 0;break;
                case 11:limit = 99;add1 = 0x0A20;add2 = 0x0A10;break;
                case 12:limit = 99;add1 = 0x0C10;add2 = 0x0C20;break;
                case 13:limit = 23;add1 = 0x0C20;add2 = 0x0C10;break;
                case 14:limit = 59;add1 = 0x1210;add2 = 0x1280;break;
                case 15:time_set();break;
                case 16:time_set();break;
                case 17:time_set();break;
                case 18:limit = 3;add1 = 0x1080;add2 = 0x1020;break;
                case 19:limit = 2;add1 = 0x1280;add2 = 0x1210;break;
        }
        b = c;
        e1 = dcx(add1);
  delay2(2);
        e2 = dcx(add2);
        if(limit<e1) e1 = 0;
        display1(e1);
         while(1)
         {
                 if(KEY_1 == 0)
                 {
                         Delay(2);
                         if(KEY_1 == 0)
                         {
                                 while(KEY_1 == 0);
                                 if(limit<++e1) e1 = 0;
                                 b = c;
                                 cc(add1 & add2);
                                 if(IAP_CONTR == 0) xcx(add1,e1);
         if(IAP_CONTR == 0) xcx(add2,e2);
                                 display1(e1);
                         }                         
                 }
                 
                 if(KEY_2 == 0)
                 {
                         Delay(2);
                         if(KEY_2 == 0)
                         {
                                 while(KEY_2 == 0);
                                 if(limit<--e1) e1 = limit;
                                 b = c;
                                 cc(add1 & add2);
         if(IAP_CONTR == 0) xcx(add1,e1);
         if(IAP_CONTR == 0) xcx(add2,e2);
                                 display1(e1);
                         }
                 }
     jump();
         }
}

void time_set()
{
        uchar i,s,limit;
        switch (q)
        {
                case 15:i = duqu_shi();limit = 23;break;
                case 16:i = duqu_fen();limit = 59;break;
                case 17:i = duqu_xingqi();limit = 7;break;
        }
        b = c;
        display1(i);
        while(1)
        {
                if(KEY_1 == 0)
                {
                        Delay(2);
                        if(KEY_1 == 0)
                        {
                                while(KEY_1 == 0);
                                if(limit<++i) i = 0;
                                b = c;
                                IIC_send_addr_dat(0x00,0x20);
                                switch (q)
                                {
                                        case 15:s = i;s = dec_change_bcd(s);IIC_send_addr_dat(0x04,s);break;
                                        case 16:s = i;s = dec_change_bcd(s);IIC_send_addr_dat(0x03,s);break;
                                        case 17:s = i;s = dec_change_bcd(s);IIC_send_addr_dat(0x06,s);break;
                                }
                                IIC_send_addr_dat(0x00,0x00);
                                display1(i);
                        }
                }
                       
                        if(KEY_2 == 0)
                        {
                                Delay(2);
                                if(KEY_2 == 0)
                                {
                                        while(KEY_2 == 0);
                                        if(limit<--i) i = limit;
                                        b = c;
                                        IIC_send_addr_dat(0x00,0x20);
                                  switch (q)
                                  {
                                          case 15:s = i;s = dec_change_bcd(s);IIC_send_addr_dat(0x04,s);break;
                                          case 16:s = i;s = dec_change_bcd(s);IIC_send_addr_dat(0x03,s);break;
                                          case 17:s = i;s = dec_change_bcd(s);IIC_send_addr_dat(0x06,s);break;
                                  }
                                  IIC_send_addr_dat(0x00,0x00);
                                        display1(i);
                                }
                        }
                        jump();
        }
}
void jump()
{
        if(10<(c-b))
        {
                q = 0;
                p = 0;
                (*v)();
        }
        if(KEY_SET == 0)
        {
                delay2(7);
                if(KEY_SET == 0)
                {
                  while(KEY_SET == 0);
                  if(19<++q) q = 0;
            (*z)();
                }
        }
}
void key()
{
        if(KEY_SET == 0)
        {
                Delay(1);
                if(KEY_SET == 0)
                {
                        while(KEY_SET == 0);
                        q = 11;
                        z = &key_handle;
                        (*z)();
                }
        }
}
作者: PDDDF    時間: 2019-12-9 14:46
moluxiyan 發(fā)表于 2019-12-9 13:52
這樣讓大家猜,猜不出來,至少把關(guān)鍵部分代碼貼出來,還有用的什么型號單片機

截的圖片沒了,對應(yīng)的程序在下面發(fā)了,IC型號STC15W408AS
作者: csmyldl    時間: 2019-12-9 15:05
這種程序應(yīng)該用狀態(tài)機的模式寫,不管程序調(diào)用何種函數(shù)后都必須回到主循環(huán),主循環(huán)再根據(jù)狀態(tài)的變化執(zhí)行相對應(yīng)的操作或顯示
作者: ahshmj    時間: 2019-12-9 17:12
估計是多次調(diào)用,占用的資源沒有完全釋放造成的。
作者: wulin    時間: 2019-12-9 21:15
PDDDF 發(fā)表于 2019-12-9 14:46
截的圖片沒發(fā)出來,設(shè)置的數(shù)值放進EPPROM里面保存
按鍵部分的代碼:
void key_handle()

程序構(gòu)架不合理。子程序里用死循環(huán)while(1)也沒有設(shè)置跳出條件,必死無疑。
作者: 黃youhui    時間: 2019-12-10 08:58
對應(yīng)的break在哪

JB4}61}235Z_)%8W9{TI9_L.png (15.91 KB, 下載次數(shù): 36)

JB4}61}235Z_)%8W9{TI9_L.png

S}GH}3%WP}_H`LFX1L0J1G8.png (10.58 KB, 下載次數(shù): 35)

S}GH}3%WP}_H`LFX1L0J1G8.png

作者: PDDDF    時間: 2019-12-10 09:25
ahshmj 發(fā)表于 2019-12-9 17:12
估計是多次調(diào)用,占用的資源沒有完全釋放造成的。

請教大佬,有辦法可以讓它跳轉(zhuǎn)的時候完全釋放嗎
作者: PDDDF    時間: 2019-12-10 09:28
wulin 發(fā)表于 2019-12-9 21:15
程序構(gòu)架不合理。子程序里用死循環(huán)while(1)也沒有設(shè)置跳出條件,必死無疑。

是這樣的,我用定時器做了個10秒無操作跳回主狀態(tài)函數(shù)的子函數(shù),和一個按鍵調(diào)用key_handle函數(shù)自身的jump函數(shù)放在一起了,就是下面的這個
void jump()
{
        if(10<(c-b))
        {
                q = 0;
                p = 0;
                (*v)();
        }
        if(KEY_SET == 0)
        {
                delay2(7);
                if(KEY_SET == 0)
                {
                  while(KEY_SET == 0);
                  if(19<++q) q = 0;
            (*z)();
                }
        }
}

作者: PDDDF    時間: 2019-12-10 09:37
黃youhui 發(fā)表于 2019-12-10 08:58
對應(yīng)的break在哪

這里我用了跳轉(zhuǎn)沒用跳出,上面那位老哥的回復(fù)里寫了,大佬看下這樣做問題出在哪,搞了我一周了還是沒解決




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1