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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3549|回復(fù): 10
收起左側(cè)

單片機程序重復(fù)調(diào)用一個函數(shù)多次后卡死

[復(fù)制鏈接]
ID:601478 發(fā)表于 2019-12-9 11:32 | 顯示全部樓層 |閱讀模式
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)閉中斷
回復(fù)

使用道具 舉報

ID:470332 發(fā)表于 2019-12-9 13:52 | 顯示全部樓層
這樣讓大家猜,猜不出來,至少把關(guān)鍵部分代碼貼出來,還有用的什么型號單片機
回復(fù)

使用道具 舉報

ID:601478 發(fā)表于 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)();
                }
        }
}
回復(fù)

使用道具 舉報

ID:601478 發(fā)表于 2019-12-9 14:46 | 顯示全部樓層
moluxiyan 發(fā)表于 2019-12-9 13:52
這樣讓大家猜,猜不出來,至少把關(guān)鍵部分代碼貼出來,還有用的什么型號單片機

截的圖片沒了,對應(yīng)的程序在下面發(fā)了,IC型號STC15W408AS
回復(fù)

使用道具 舉報

ID:235200 發(fā)表于 2019-12-9 15:05 | 顯示全部樓層
這種程序應(yīng)該用狀態(tài)機的模式寫,不管程序調(diào)用何種函數(shù)后都必須回到主循環(huán),主循環(huán)再根據(jù)狀態(tài)的變化執(zhí)行相對應(yīng)的操作或顯示
回復(fù)

使用道具 舉報

ID:7485 發(fā)表于 2019-12-9 17:12 | 顯示全部樓層
估計是多次調(diào)用,占用的資源沒有完全釋放造成的。
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 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è)置跳出條件,必死無疑。
回復(fù)

使用道具 舉報

ID:592807 發(fā)表于 2019-12-10 08:58 | 顯示全部樓層
對應(yīng)的break在哪
JB4}61}235Z_)%8W9{TI9_L.png
S}GH}3%WP}_H`LFX1L0J1G8.png
回復(fù)

使用道具 舉報

ID:601478 發(fā)表于 2019-12-10 09:25 | 顯示全部樓層
ahshmj 發(fā)表于 2019-12-9 17:12
估計是多次調(diào)用,占用的資源沒有完全釋放造成的。

請教大佬,有辦法可以讓它跳轉(zhuǎn)的時候完全釋放嗎
回復(fù)

使用道具 舉報

ID:601478 發(fā)表于 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)();
                }
        }
}
回復(fù)

使用道具 舉報

ID:601478 發(fā)表于 2019-12-10 09:37 | 顯示全部樓層
黃youhui 發(fā)表于 2019-12-10 08:58
對應(yīng)的break在哪

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日产精品久久久一区二区福利 | 免费毛片网站在线观看 | 最新中文字幕第一页视频 | 久久爱一区| 亚洲一区二区av在线 | 国产一区二 | 亚洲精品www. | 国产 日韩 欧美 中文 在线播放 | 99久久国产| 亚洲第一视频网站 | 成人三级网址 | 欧美国产中文 | 99精品视频在线 | 在线免费毛片 | 精品一二三区视频 | 91在线 | 天堂成人国产精品一区 | 亚洲一区欧美一区 | 日韩三级免费观看 | 久久久国产一区二区三区四区小说 | 91在线观看 | a级在线免费视频 | 一级毛片色一级 | 国产精品久久久久久模特 | 三级高清 | 成人午夜精品 | 一区二区三区四区在线视频 | 欧美日韩亚洲一区二区 | 久久久久国产 | 久久久久久成人 | 亚洲经典一区 | 久久999| 久久精品国产精品青草 | 成人免费看片又大又黄 | 日韩综合在线 | 日韩在线中文 | 欧美一区二区视频 | 国产精品亚洲综合 | 天天拍天天插 | 免费成人高清在线视频 | 一区二区三区四区在线视频 |