找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2771|回复: 10
打印 上一主题 下一主题
收起左侧

单片机程序重复调用一个函数多次后卡死

[复制链接]
跳转到指定楼层
楼主
1.按键1按下标志变量加一,随后进入菜单函数;2.进菜单函数后switch  case区分标志变量,执行多分支语句;
3.此时按键2,3为对应功能数值的加减,再次按下按键1标志变量再加一,重复上述过程。

多次(平均20次)循环调用后会卡死,无论按下哪个按键都没反应,无法解决,上来请教各路大神
PS:试过直接调用和函数指针调用,都出现相同的问题,已关闭中断
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:470332 发表于 2019-12-9 13:52 | 只看该作者
这样让大家猜,猜不出来,至少把关键部分代码贴出来,还有用的什么型号单片机
回复

使用道具 举报

板凳
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:601478 发表于 2019-12-9 14:46 | 只看该作者
moluxiyan 发表于 2019-12-9 13:52
这样让大家猜,猜不出来,至少把关键部分代码贴出来,还有用的什么型号单片机

截的图片没了,对应的程序在下面发了,IC型号STC15W408AS
回复

使用道具 举报

5#
ID:235200 发表于 2019-12-9 15:05 | 只看该作者
这种程序应该用状态机的模式写,不管程序调用何种函数后都必须回到主循环,主循环再根据状态的变化执行相对应的操作或显示
回复

使用道具 举报

6#
ID:7485 发表于 2019-12-9 17:12 | 只看该作者
估计是多次调用,占用的资源没有完全释放造成的。
回复

使用道具 举报

7#
ID:213173 发表于 2019-12-9 21:15 | 只看该作者
PDDDF 发表于 2019-12-9 14:46
截的图片没发出来,设置的数值放进EPPROM里面保存
按键部分的代码:
void key_handle()

程序构架不合理。子程序里用死循环while(1)也没有设置跳出条件,必死无疑。
回复

使用道具 举报

8#
ID:592807 发表于 2019-12-10 08:58 | 只看该作者
对应的break在哪

JB4}61}235Z_)%8W9{TI9_L.png (15.91 KB, 下载次数: 15)

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

S}GH}3%WP}_H`LFX1L0J1G8.png (10.58 KB, 下载次数: 11)

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

使用道具 举报

9#
ID:601478 发表于 2019-12-10 09:25 | 只看该作者
ahshmj 发表于 2019-12-9 17:12
估计是多次调用,占用的资源没有完全释放造成的。

请教大佬,有办法可以让它跳转的时候完全释放吗
回复

使用道具 举报

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)();
                }
        }
}
回复

使用道具 举报

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

这里我用了跳转没用跳出,上面那位老哥的回复里写了,大佬看下这样做问题出在哪,搞了我一周了还是没解决
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表