首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keil Proteus中的数字时钟仿真

Keil Proteus中的数字时钟仿真
EN

Stack Overflow用户
提问于 2018-01-02 16:50:08
回答 1查看 316关注 0票数 1

这个C程序是用来模拟一个数字钟的。在Proteus程序中将有37个片段来显示小时、分钟和秒(就像一个数字时钟)

代码语言:javascript
复制
#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循环?此外,这些正在增加的是什么?

代码语言:javascript
复制
P2 = P2 + 0x06;

0x06是什么?最后,e在这段代码中应该做什么?

EN

回答 1

Stack Overflow用户

发布于 2018-01-02 21:05:41

下面的代码片段没有副作用。

代码语言:javascript
复制
for (k = 0; k<1000; k++)
    for (j = 0; j<142; j++);

因此,它可能被用作绝望的人的延迟,最里面的3个循环可以转换为

代码语言:javascript
复制
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

但是,如果我们继续下一行

代码语言:javascript
复制
P3 = 0x00;
P2++;

我们可以看到,P3在10个周期后被重置,因此这意味着只有最低有效位的低4位存储在P3中,下一位将存储在P2的低半字节中。为什么?因为分钟的十位数只能从0到5(由t计数)。P2和P0的增加和携带方式也与P3相同。

最后,当P0达到24时,它被重置为0,因此P0包含整个小时

代码语言:javascript
复制
if (P0 == 0x24){
    P0 = 0x00;
    e = 1;
}

现在您可以很容易地猜到e的用途了

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48058000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档