51单片机,做流水灯,第一遍运行正常,第二遍跳不出for循环,将for循环里的--改为++就可以正常运行,这是为什么?

今天用之前买的开发板做了个流水灯,结果运行的时候第一遍运行正常,第二遍运行的时候就跳不出for循环了,后续调整的时候发现for循环里的d--,都改为d++就运行正常,主函数里只要有一个d--存在就会产生这个问题(全改为d--也不行),这是为什么?

下方是程序:
#include <reg51.h>
#include "delay110592.h"//此处调用的是自建的延时函数,里边都是用的--
#include <intrins.h>
#define uncr unsigned char
#define ledp0 P0

void main()
{
uncr a,b,c,d;
ledp0=0x00;
a=CY;
b=0x20;
while(a!=1)
{
Delay100ms(10);
ledp0=ledp0;
delay1s();
ledp0=
ledp0;
b=b<<1;
a=CY;
}
delay1s();
ledp0=0x01;
delay100ms();
for(c=0;c<3;c++)
{
for(d=0;d<7;d++) //有d--的情况下(不论这个d--在哪个循环 ),都会卡到这个循环里
{
ledp0=_crol_(ledp0,1);
delay100ms();
}
for(d=7;d>0;d--)
{
ledp0=cror(ledp0,1);
delay100ms();
}
}
}

我用keil的调试窗口看是没问题的,没有卡住啊

#include <reg51.h>
#include <intrins.h>
#define uncr unsigned char
#define ledp0 P0
void Delay100ms(uncr x)
{
    unsigned char i, j, k;
    for(;x>0;x--)
    {
        _nop_();
        _nop_();
        i = 5;
        j = 52;
        k = 195;
        do
        {
            do
            {
                while (--k);
            } while (--j);
        } while (--i);
    }
}
    

void delay1s()
{
    Delay100ms(10);
}
void delay100ms()
{
    Delay100ms(1);
}
void main()
{
    uncr a,b,c,d;
    ledp0=0x00;
    a=CY;
    b=0x20;
    while(a!=1)
    {
        Delay100ms(10);
        ledp0=ledp0;
        delay1s();
        ledp0=ledp0;
        b=b<<1;
        a=CY;//溢出CY=1,则停止循环
    }
    delay1s();
    ledp0=0x01;
    delay100ms();
    for(c=0;c<3;c++)
    {
        for(d=0;d<7;d++) //有d--的情况下(不论这个d--在哪个循环 ),都会卡到这个循环里
        {
            ledp0=_crol_(ledp0,1);
            delay100ms();
        }
        for(d=7;d>0;d--)
        {
            ledp0=_cror_(ledp0,1);
            delay100ms();
        }
    }
}