【问题标题】:Configure port1 of 8051 micro-controller as input将 8051 微控制器的端口 1 配置为输入
【发布时间】:2011-12-22 04:06:57
【问题描述】:

我正在编写一个非常简单的应用程序,它允许人们改变温度。温度显示采用 LEDS(BCD 格式)

我在Keil C51中写了如下代码:

#include< REG51.h>

sbit select = P1^7;
sbit up = P1^0;
sbit down = P1^1;
int data room = 24;

void main()
{   int prog;
    P2 &=0x00;
    P1 |=0x83;
    prog = 0;
    while (1)
    {
        if(select == 1)
            prog++;
        if(prog == 1)
        {
            if(up == 1)
                room++;
            if(down == 1)
                room--;

            P2 = room;
        }
    }
}

然后我遵从了这个并获得了 Intel hex 文件,然后我尝试使用 Edsim 进行模拟。

根据 C 代码,当 prog=1 以及按下 up(p1.0) 或 down(p1.1) 时 temp 应该会发生变化,但在模拟中它只会在两者都 select(p1.7) 时发生变化并按下上/下!

为什么会这样?

【问题讨论】:

    标签: c 8051 keil


    【解决方案1】:

    prog++ 表示prog 的值在select == 1 为真时每次增加1。这意味着条件prog == 1 仅在它递增的第一次迭代中为真。

    尝试将prog++ 更改为prog = 1

    编辑:根据 cmets 中的讨论,如果您希望跟踪 select 上升的次数,您需要等待它再次为 0,然后再让 prog 再次递增。例如:

    int prev = select;
    …
    if (select != prev) {
        // select has changed from its previous state
    
        prev = select;
        if (prev) {
            // select went from 0 to 1
            ++prog;
    
            if (prog == 1) {
               // code to be executed once only on the first press
            } else if (prog == 2) {
               // code to be executed once only on the second press
            } else if (prog >= 3) {
               // code to be executed once on every subsequent press
            }
        } else {
            // select went from 1 to 0
        }
    }
    
    if (prev) {
       // select is being pressed
    
       if (prog == 1) {
           // code to be executed _continuously_ while select is held down
           // (after first press only)
       }
       // ...
    }
    

    【讨论】:

    • 我做了prog++ 因为我会添加更多条件来扩展我的程序的功能(即添加if==2 等)。还有这有什么帮助?在我当前的程序中,每当select==1 第二次时,prog 将等于 2,因此它不应进入 if 构造
    • 如果prog 等于2,那么if (prog == 1) 显然是错误的,因为2 != 1。在任何情况下,您都必须记住 if (select == 1) 不仅计算选择从 0 变为 1 的次数,还计算它为 1 的迭代次数(不一定在两者之间的任何时候都为 0 )。如果您想添加更多条件,可以将其更改为if (prog &gt;= 1),但您会一次又一次地遇到同样的问题。
    • 好的,有道理。但是现在我该怎么做呢?开关盒会产生同样的问题。我想要的是,当我第一次按select 时,它应该执行温度代码,第二次它应该执行素数函数(尚未实现),当第三次执行其他操作时。这就像根据select 被按下的次数从一个函数跳转到另一个函数。
    • 等待select 再次为0,然后再递增prog,例如类似if (select) { if (!wasOn) { ++prog; wasOn = 1; } } else { wasOn = 0; }
    【解决方案2】:

    我认为你的代码没有反映你想要它做什么。

    if(select == 1)
                prog++;
            if(prog == 1)
            {
    

    prog 最初为 0,因此 prog==1 仅在您第一次按下 select 时为真。

    当时它进入 IF 并检查

    if(up == 1)
                    room++;
                if(down == 1)
                    room--;
    
                P2 = room;
    

    如果按下向上或向下,则将房间当前温度更改为 +1 或 -1。因为你是用按钮模拟的,这意味着当你按下选择时应该按下任何一个按钮。

    然后将数据输出到P2

    你需要做的是:

    while (1)
    {
        if(select== 1)
        {   
            P2 = room;
        }
    
    
       if(up == 1)
           room++;
       if(down == 1)
           room--; 
    }
    

    您仍然需要按选择来更新温度,然后按上/下来更改温度。如果你能让自己更清楚它是如何工作的,也许我可以提供更多帮助。

    【讨论】:

    • 我计划扩展我的代码以添加额外的功能(即select==2等时的其他内容)。所以我想要的是,当我按下select 时,它应该进入温度部分,然后只在按下向上/向下时改变温度。但同时不应该需要按select 来使用向上/向下。希望我足够清楚!
    • 我知道如果我想用不同的select 值完成各种事情,最好使用 switch case,但最初我正在学习和测试,所以稍后会切换到那个
    【解决方案3】:

    您应该尝试将prog++ 更改为prog = 1。让我知道这是否有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多