|
“while( --a != 0) 这句是a自减1,不等于0吗?但a并没有赋值呀。”
这句话的意思是a先自减,然后再判断A值是否不等于零。
若a不等于零,执行循环体内的语句。
若a等于零,则退出循环。
代码前面先定义了函数“Delay(unsigned char a)”,其中函数名“Delay”是延时的意思,“a”是此函数的参数,是个变量,调用函数时要为其幅值。“unsigned char a”的意思是定义变量a的数据类型为无符号整数。
后面的主程序里调用了Delay()函数, Delay(250)的意思是将250这个值赋给变量a,然后执行函数体内的语句。
while( --a != 0)
{
for(i = 0; i < 125; i++);
}
}
请问以上这段程序的执行过程是什么?
while是循环,循环条件是变量a不等于0,变量a的值是调用Delay()函数时传入的。
for(i = 0; i < 125; i++); 这句也是循环,跳出循环的条件是i < 125。每次循环i都自加1,循环125次后i等于125,此时不再小于125,跳出循环。
整个代码段是大循环里套着小循环,执行一次大循环就执行125次小循环。您这变量a传进来的值是250,意思是执行249次大循环,每执行一次大循环就执行125次小循环。这样每次调用Delay(250)函数,程序就在此往复循环了三万多次,期间什么都不做,就干耗时间,即所谓延时。
C语言入门并不难,现在有了AI,AI最擅长的就是干这个,哪里有不懂的就扔给AI,让它给您解释。
就比如您这代码,扔给AI让他详细给出注释,返回救过如下,比在论坛上询问简单省事、清晰明了:
#include<intrins.h> // 引入Keil C51移位函数库[6,7,8](@ref)
#include<reg51.h> // 引入51单片机寄存器定义头文件[9,10](@ref)
void Delay(unsigned char a) // 自定义延时函数,参数a控制延时倍数[1,3](@ref)
{
unsigned char i; // 定义内层循环计数器
while( --a != 0) // 外层循环:参数a递减至0时退出[4](@ref)
{
for(i = 0; i < 125; i++); // 内层空循环,约125μs@12MHz晶振[1,3](@ref)
}
}
void main(void)
{
unsigned char b, i; // 定义LED模式变量和循环计数器
while(1) // 主程序无限循环[6,7](@ref)
{
b = 0xfe; // 初始化LED模式:0xfe=11111110B(第1个LED亮)[6,10](@ref)
for(i = 0; i < 8; i++) // 循环8次实现8位流水灯效果[6](@ref)
{
P1 = _crol_(b, 1); // 循环左移1位,更新LED显示模式[6,7,8](@ref)
b = P1; // 将当前端口状态赋值回b变量[6](@ref)
Delay(250); // 延时约250×125μs=31.25ms[1,3](@ref)
}
}
}
|
|