这个C程序应该模拟一个数字时钟。 Proteus程序中将有3个7段显示小时,分钟和秒(如数字时钟)
#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
应该在这段代码中做什么?
答案 0 :(得分:1)
以下代码段没有副作用
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以调整BCD添加(将进位移动到下一位)作为I explained here。
如果您在每个周期后以十六进制编写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
用于