for循环变死循环,求大神支支招!51单片机keil4编的

2019-07-15 18:14发布

虽然我知道看代码很蛋疼,但是实在没办法,求大家帮帮忙!
问题就是程序在执行下面这个子函数的时候一直循环,Debug了一下,确实跳不出来,找不到原因,代码如下:
void PatternOne()
{
    char                x,y;
        uchar ucMoveSpeed  = 15;                                           /* 通过累积循环次数控制移动时间 */
    bit   bInitMark    =  1;                                           /* 清0数组标志位,1则清,0反之  */
        bit   bChangeSpeed =  0;                                           /* 速度改变标志位,1则改变0反之 */
        
    for (x = 0;x < 16;x++)                                                        
    {
            /* 清0数组标志位置1则清0,0反之 */
        if (bInitMark && (8 != x))
            {
                    /* (字模为阴码,亮为1,灭为0) */
            InitialTab(0x00);
            }
                /* 前八次,将字模从0维放到7维 */
                if (x < 8)
                {
            for (y = 0;y < 8;y++)
            {
                DisTab[x][y] = PatternOneTab[0][y];
                    }
                }
                /* 后八次,从7维放到0维 */
        else
        {
            for (y = 0;y < 8;y++)
            {
                            if (bInitMark)
                {DisTab[16 - x][y] = PatternOneTab[0][y];}
                                else
                                {DisTab[16 - x][y] = 0x00;        }
                    }
                }
                 /* 通过累积循环次数控制移动时间 */
        for (y = 0;y < ucMoveSpeed;y++ )
        {
            Display1();
        }
                /* 第一次循环完成,处理标志位,从头循环*/
                if ((15 == x) && (1 == bInitMark))
                {
                    InitialTab(0x00);
                        /* 第二次循环不清0数组 */
            bInitMark    =  0;
                        /* 第二次循环改变移动速度 */
                        bChangeSpeed =  1;
                        /* 将x清0,进行第二次循环,由于本次
                         * 循环结束后x会自加1,所以减一修正
                         */
                        x            = -1;
                }
                /* 标志位置一,改变速度 */
                if (bChangeSpeed)
                {
                    if (x < 8)
                        {
                            ucMoveSpeed--;
                        }
                        else
                        {
                            ucMoveSpeed++;
                        }
                }
    }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
woodmice
1楼-- · 2019-07-16 00:02

你的代码太乱了,没看出问题来,你再调试下吧,重点注意控制循环的x、和bInitMark的变化

void PatternOne()
{
    char                x,y;
    uchar ucMoveSpeed  = 15;
    bit   bInitMark    =  1;
    bit   bChangeSpeed =  0;
    for (x = 0; x < 16; x++)
    {
        if (bInitMark && (8 != x))
            InitialTab(0x00);
        if (x < 8)
        {
            for (y = 0;y < 8;y++)
                DisTab[x][y] = PatternOneTab[0][y];
        }
        else
        {
            for (y = 0;y < 8;y++)
            {
                if (bInitMark)
                    DisTab[16 - x][y] = PatternOneTab[0][y];
                else
                    DisTab[16 - x][y] = 0x00;
            }
        }
        for (y = 0;y < ucMoveSpeed;y++ )
            Display1();
        if (15 == x && 1 == bInitMark)
        {
            InitialTab(0x00);
            bInitMark    =  0;
            bChangeSpeed =  1;
            x            = -1;
        }
        if (bChangeSpeed)
        {
            if (x < 8)
                ucMoveSpeed--;
            else
                ucMoveSpeed++;
        }
    }
}

2872890731
2楼-- · 2019-07-16 03:34
 精彩回答 2  元偷偷看……
2872890731
3楼-- · 2019-07-16 05:40
尽量少用特殊的符号,否则会搞的晕头转向!尽量使用使用次数频率多一点的常用符号!这样虽然麻烦,但核心很容易理解!
2872890731
4楼-- · 2019-07-16 05:51
是不是大括号搞错了?我电脑重装了,没有编程软件,看不出来
blueli
5楼-- · 2019-07-16 10:40
好乱啊……………………
qq1101539606
6楼-- · 2019-07-16 11:29
woodmice 发表于 2014-10-30 08:06
你的代码太乱了,没看出问题来,你再调试下吧,重点注意控制循环的x、和bInitMark的变化

void PatternOne ...

问题找到了,是这里  for (y = 0;y < 8;y++)
{
            if (bInitMark)
            DisTab[16 - x][y] = PatternOneTab[0][y];
            else
            DisTab[16 - x][y] = 0x00;
}
还有我想问一下代码该如何优化呢?我已经有意识的进行代码规范了

一周热门 更多>