请教一下这个控制LED灯亮度的程序

#include <reg51.h>

#define LED P1
sbit KEY = P1^6;

void delay (unsigned int d){ //延时功能函数,由d决定延时长度
unsigned char i;
while( --d != 0)(第1,我想问这条指令意思是先把d减1后再使用d值,但!=0的意思是不是如果把d减1后要看看是否不等于0在作为条件啊?)
{
for(i = 0; i < 2; i++);
}
}

void main (){
unsigned char a,b;(第2,a在主函数里面代入delay函数里面,但这里把a定义为无符号字符型,那么在上面delay后面的d是定义为无符号整型,这样会有冲突有问题吗?)

while (1){
LED = 0xff;
a = 0x00;(第3,这里的a赋值是0x00,那么后面a++的话到底会是变成一个怎样的数?)
for (b=250; b>0; b--)
{
a++;
delay (a); //延时长度随a而改变
LED = 0x00;
a = ~a; //a值取反,决定灯灭时的占空比
delay (a);
LED = 0xff;
a = ~a; //a值取反 使a回到原值继续循环
}
LED = 0x00;(第4,这个a的赋值能用其他数字代替吗?) //亮起LED
a = 0x00;
for (b=250; b>0; b--){
a++;
delay (a);
LED = 0xff;
a = ~a;
delay (a);
LED = 0x00;
a = ~a;
}
LED = 0xff;
}
}
还有一个问题,如果while( --d != 0)中的--d减1后赋值与0比较,那么省略!=0可以吗? 因为我见过有一些语句whlie(d--)的意识就是d减1后再看看d是否等于0。

第一:--d 减号在前表示先自减,后赋值。把d的值减一后与0比较,不为0执行循环体。
第二:不会,一般来说字符型(1字节)比整型(2字节)占用空间少一个字节。用作延时函数没什么区别,但要注意如果反过来的话,数据大于255会出错。
常识:延时函数往往循环次数比较多,建议用整型变量。
第三:0x01;不管什么类型(整型,字符型),在存储器中都是二进制形式存储的。也就是a=1了。
第四:不太明白你问的意思。0x是前缀表示16进制。也可以a=0;这里就是十进制了。

完全可以,不过while(d--)是先判断d是否等于0,然后d减一。也就是d相同情况下(当然要大于0),while(d--)比while(--d)多循环一次。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-06-09
我是过来学习的。
相似回答