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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機程序重復調用一個函數多次后卡死

[復制鏈接]
跳轉到指定樓層
樓主
1.按鍵1按下標志變量加一,隨后進入菜單函數;2.進菜單函數后switch  case區分標志變量,執行多分支語句;
3.此時按鍵2,3為對應功能數值的加減,再次按下按鍵1標志變量再加一,重復上述過程。

多次(平均20次)循環調用后會卡死,無論按下哪個按鍵都沒反應,無法解決,上來請教各路大神
PS:試過直接調用和函數指針調用,都出現相同的問題,已關閉中斷
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

11#
ID:601478 發表于 2019-12-10 09:37 | 只看該作者

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

使用道具 舉報

10#
ID:601478 發表于 2019-12-10 09:28 | 只看該作者
wulin 發表于 2019-12-9 21:15
程序構架不合理。子程序里用死循環while(1)也沒有設置跳出條件,必死無疑。

是這樣的,我用定時器做了個10秒無操作跳回主狀態函數的子函數,和一個按鍵調用key_handle函數自身的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)();
                }
        }
}
回復

使用道具 舉報

9#
ID:601478 發表于 2019-12-10 09:25 | 只看該作者
ahshmj 發表于 2019-12-9 17:12
估計是多次調用,占用的資源沒有完全釋放造成的。

請教大佬,有辦法可以讓它跳轉的時候完全釋放嗎
回復

使用道具 舉報

8#
ID:592807 發表于 2019-12-10 08:58 | 只看該作者
對應的break在哪

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

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

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

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

使用道具 舉報

7#
ID:213173 發表于 2019-12-9 21:15 | 只看該作者
PDDDF 發表于 2019-12-9 14:46
截的圖片沒發出來,設置的數值放進EPPROM里面保存
按鍵部分的代碼:
void key_handle()

程序構架不合理。子程序里用死循環while(1)也沒有設置跳出條件,必死無疑。
回復

使用道具 舉報

6#
ID:7485 發表于 2019-12-9 17:12 | 只看該作者
估計是多次調用,占用的資源沒有完全釋放造成的。
回復

使用道具 舉報

5#
ID:235200 發表于 2019-12-9 15:05 | 只看該作者
這種程序應該用狀態機的模式寫,不管程序調用何種函數后都必須回到主循環,主循環再根據狀態的變化執行相對應的操作或顯示
回復

使用道具 舉報

地板
ID:601478 發表于 2019-12-9 14:46 | 只看該作者
moluxiyan 發表于 2019-12-9 13:52
這樣讓大家猜,猜不出來,至少把關鍵部分代碼貼出來,還有用的什么型號單片機

截的圖片沒了,對應的程序在下面發了,IC型號STC15W408AS
回復

使用道具 舉報

板凳
ID:601478 發表于 2019-12-9 14:46 | 只看該作者
截的圖片沒發出來,設置的數值放進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)();
                }
        }
}
回復

使用道具 舉報

沙發
ID:470332 發表于 2019-12-9 13:52 | 只看該作者
這樣讓大家猜,猜不出來,至少把關鍵部分代碼貼出來,還有用的什么型號單片機
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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