【发布时间】:2018-04-29 11:35:03
【问题描述】:
我正在学习8051 MCU编程,我现在正在做一个LED闪烁的迷你项目。我想要做的是,当我按下按钮时,LED 会慢速闪烁。相反,当我松开按钮时,LED 会更快地闪烁。我使用嵌入式 C,这是我的代码:
#include <reg51.h>
sbit LED = P0^0;
sbit SW = P1^0;
void T0delay(int num);
void main()
{
while (1)
{
LED = ~LED;
if (SW == 0)
{
T0delay(4);
}
else
{
T0delay(2);
}
}
}
void T0delay(int num)
{
**unsigned char i;
unsigned char a;**
for (a=0;a<num;a++)
{
for (i=0;i<num;i++)
{
TMOD = 0x01;
TL0 = 0xFE;
TH0 = 0xA5;
TR0 = 1;
while (TF0 == 0);
TR0 = 0;
TF0 = 0;
}
}
}
但是我发现当我在for循环外将变量a和i声明为0时,LED会闪烁得更快。
#include <reg51.h>
sbit LED = P0^0;
sbit SW = P1^0;
void T0delay(int num);
void main()
{
while (1)
{
LED = ~LED;
if (SW == 0)
{
T0delay(4);
}
else
{
T0delay(2);
}
}
}
void T0delay(int num)
{
**unsigned char i = 0;
unsigned char a = 0;**
for (a;a<num;a++)
{
for (i;i<num;i++)
{
TMOD = 0x01;
TL0 = 0xFE;
TH0 = 0xA5;
TR0 = 1;
while (TF0 == 0);
TR0 = 0;
TF0 = 0;
}
}
}
谁能解释它为什么会这样?我的声明方式有什么问题导致这个结果吗?专业工程师声明变量的良好做法是什么?对不起我的英语不好。如果我的问题有任何不清楚的地方,请告诉我。谢谢!
【问题讨论】:
-
这两个语句:
for (a;a<num;a++) { for (i;i<num;i++)将导致编译器输出关于第一个参数是“什么都不做”的两个警告消息。编译时,始终启用警告,然后修复这些警告 -
为什么会有两个嵌套循环,而不是一个递增到
num * num,尽管在任何情况下,其输入平方的延迟都是一种奇怪的设计。不要发布无法编译的代码;如果要突出显示代码区域,请使用有效的 cmets。 -
num是int,但i和a是char。通过传递num说 256,此代码很容易破解。