这个C程序是用来模拟一个数字钟的。在Proteus程序中将有37个片段来显示小时、分钟和秒(就像一个数字时钟)
#include<reg51.h>
void main()
{
int t, i, j, k, a, b, c, d, e;
e = 0;
P3 = 0x00;
P2 = 0x00;
P0 = 0x00;
while (1)
{
P0 = 0x00;
for (c = 0; c<3; c++)
{
for (d = 0; d<10; d++)
{
for (a = 0; a<6; a++)
{
for (b = 0; b<10; b++)
{
for (t = 0; t<6; t++)
{
for (i = 0; i<10; i++)
{
for (k = 0; k<1000; k++)
for (j = 0; j<142; j++);
P3++;
}
P3 = P3 + 0x06;
}
P3 = 0x00;
P2++;
}
P2 = P2 + 0x06;
}
P2 = 0x00;
P0++;
if (P0 == 0x24){
P0 = 0x00;
e = 1;
}
if (e == 1)
break;
}
if (e == 1){
e = 0;
break;
}
P0 = P0 + 0x06;
}
}
}如果有人解释一下代码可以吗?我不理解代码开头的嵌套for循环?此外,这些正在增加的是什么?
P2 = P2 + 0x06;0x06是什么?最后,e在这段代码中应该做什么?
发布于 2018-01-02 21:05:41
下面的代码片段没有副作用。
for (k = 0; k<1000; k++)
for (j = 0; j<142; j++);因此,它可能被用作绝望的人的延迟,最里面的3个循环可以转换为
for (i = 0; i<10; i++)
{
delay(142000);
P3++;
}
P3 = P3 + 0x06;在实践中,整个延迟循环在优化后将被完全删除,因此应该调用库中的实际延迟函数
根据我所能猜到的,P3是3位数字的单位的BCD输出。每142000次循环增加1次。一旦它增加了10倍,即发生了溢出,0x06将被加到和中,以在I explained here时调整BCD加法(将进位移动到下一个数字)。
如果你在每个十六进制周期之后编写P3,那么得到0x00 0x01 0x02 0x03 ... 0x08 0x09 0x10 0x11 ... 0x19 0x20会更容易: 10个周期之后,我们就会得到0x0A + 0x06 = 0x10。
但是,如果我们继续下一行
P3 = 0x00;
P2++;我们可以看到,P3在10个周期后被重置,因此这意味着只有最低有效位的低4位存储在P3中,下一位将存储在P2的低半字节中。为什么?因为分钟的十位数只能从0到5(由t计数)。P2和P0的增加和携带方式也与P3相同。
最后,当P0达到24时,它被重置为0,因此P0包含整个小时
if (P0 == 0x24){
P0 = 0x00;
e = 1;
}现在您可以很容易地猜到e的用途了
https://stackoverflow.com/questions/48058000
复制相似问题