配置8051微控制器的port1作为输入

时间:2011-11-04 16:04:49

标签: c 8051 keil

我正在编写一个非常简单的应用程序,可以让人改变温度。使用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;
        }
    }
}

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

根据C代码,当prog = 1并且按下向上(p1.0)或向下(p1.1)时温度应该改变,但是在模拟中它只在两个选择时都改变(p1.7)并按下向上/向下!

为什么会这样?

3 个答案:

答案 0 :(得分:2)

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

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

编辑:根据评论中的讨论,如果您希望跟踪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)
   }
   // ...
}

答案 1 :(得分:2)

我认为您的代码并不反映您希望它执行的操作。

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

prog最初为0,因此只有第一次按select时,prog == 1才会为真。

那时它会进入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--; 
}

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

答案 2 :(得分:0)

您应该尝试将prog++更改为prog = 1。如果有帮助,请告诉我!