Настройте порт 1 микроконтроллера 8051 как вход - PullRequest
0 голосов
/ 04 ноября 2011

Я пишу очень простое приложение, которое позволяет изменять температуру. Температура отображается с использованием светодиодов (формат 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, который затем попытался смоделировать с помощью Edsim .

В соответствии с кодом C температура должна меняться, когда prog = 1 и когда нажата кнопка вверх (p1.0) или вниз (p1.1), но в симуляции она меняется только при выборе обоих (p1.7) и вверх / вниз нажата!

Почему это происходит?

Ответы [ 3 ]

2 голосов
/ 04 ноября 2011

Я думаю, что ваш код не отражает то, что вы хотите, чтобы он делал.

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

prog изначально равен 0, поэтому prog == 1 будет истинно только при первом нажатии кнопки select.

в это время он входит в ПЧ и проверяет

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

            P2 = room;

, чтобы изменить текущую комнатную температуру на +1 или -1, если нажата кнопка вверх или вниз.Поскольку вы имитируете с помощью кнопок, это означает, что при нажатии кнопки выбора нужно нажать любую из кнопок.

, а затем она выводит данные в P2

, что вам нужно сделать:1013 *

while (1)
{
    if(select== 1)
    {   
        P2 = room;
    }


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

Вам все равно нужно будет нажать кнопку выбора, чтобы обновить температуру, и вверх / вниз, чтобы изменить температуру.Если вы сможете лучше понять, как это работает, возможно, я смогу помочь больше.

2 голосов
/ 04 ноября 2011

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)
   }
   // ...
}
0 голосов
/ 30 мая 2012

Вы должны попробовать изменить prog++ на prog = 1. Дайте мне знать, если это поможет!

...