2011-11-04 9 views
0

나는 온도를 변경할 수있는 아주 간단한 응용 프로그램을 작성 중입니다. 나는 다음이를 준수하고 난 다음 Edsim를 사용하여 시뮬레이션을 시도 인텔 헥사 파일을 얻을입력으로 8051 마이크로 컨트롤러의 포트 1을 구성하십시오.

#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; 
     } 
    } 
} 

: 온도는 LED가에게 (BCD 형식)를 사용하여 표시됩니다

나는 Keil의 C51에 다음 코드를 썼다.

C 코드에 따르면 prog = 1 일 때와 up (p1.0) 또는 down (p1.1)을 누르면 temp가 변경되지만 시뮬레이션에서는 select (p1.7)) 위/아래 버튼을 누르면!

왜 이런 일이 발생합니까?

답변

2

prog++select == 1 조건에 해당하는 1 마다 의해 prog 증분 값. 즉, 조건 prog == 1이 증가하는 첫 번째 반복에서만 참이라는 의미입니다.

prog++prog = 1으로 변경해보십시오.

편집 : 댓글의 토론에 따라 select이 올라간 횟수를 추적하려면 prog을 다시 증가 시키려면 먼저 다시 0이 될 때까지 기다려야합니다. 예 :

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

필자는 프로그램의 기능을 확장하기 위해 더 많은 조건을 추가 할 것이므로 (예 :'if == 2' 등을 추가)'prog ++ '를했습니다. 또한 어떻게 도움이됩니까? 현재 프로그램에서 두 번째 시간에'select == 1 '이 올 때마다'prog'는 2와 같을 것이므로 if 구조체를 입력하면 안됩니다 – Saurabh

+0

'prog'가 2이면'if (prog == 1)'는'2! = 1'이므로 분명히 거짓입니다.어쨌든'if (select == 1)'은 select가 0에서 1까지 간 횟수를 세지 않고, 1이던 반복 횟수를 반드시 계산해야한다는 것을 기억해야한다. 0 사이의 모든 지점에서). 더 많은 조건을 추가하고 싶다면'if (prog> = 1)'로 바꿀 수 있지만, 같은 문제가 계속 반복 될 것입니다. – Arkku

+0

좋습니다. 하지만 지금은 어떻게해야합니까? 스위치 케이스도 같은 문제를 일으킬 것입니다. 내가 원하는 것은 주전원 시간에'select'를 누르면 온도 코드를 수행해야한다는 것입니다. 두 번째 시간에는 소수 함수 (아직 구현되지 않음)를 실행해야하고, 세 번째 시간은 다른 작업을 수행해야합니다. 그것은'select'가 눌러 진 횟수에 따라 하나의 함수에서 다른 함수로 점프하는 것과 같습니다. – Saurabh

2

나는 코드가 원하는 것을 반영하지 않는다고 생각합니다.

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

prog는 처음에는 0이므로 prog == 1은 처음 select를 할 때만 true입니다.

는 IF로 전환 당시

하고 +1에

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

      P2 = room; 

변화를 방 현재 온도를 확인 -1 가압 상하 또는 경우. 버튼을 시뮬레이션하기 때문에 선택을 누를 때 버튼 중 하나를 눌러야 함을 의미합니다.

그리고 그것은 당신이해야 할 것은 P2

에 데이터를 출력합니다

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


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

여전히 온도를 변경하려면 아래/온도를 업데이트 선택을 눌러해야 할 것이다. 그것이 어떻게 작동하는지에 관해 더 분명하게 할 수 있다면 아마도 더 많은 것을 도울 수 있습니다.

+0

추가 기능 (예 :'select == 2' 등)을 추가하기 위해 코드를 확장하려고합니다. 그래서 내가 원하는 것은 '선택'을 누르면 온도 부분으로 가야하고 위쪽/아래쪽을 누르면 온도 만 변경됩니다. 그러나 같은 시간에 up/down을 사용하기 위해'select'를 누를 필요는 없습니다. 바라기를 나는 충분히 명확하다! – Saurabh

+0

스위치 케이스를 사용하는 것이 더 좋을 것이라는 것을 알고 싶습니다. 여러 가지 일을 여러 가지 '선택'값으로 처리하기를 원하지만 초기에 배우고 테스트하면 나중에 전환됩니다. – Saurabh

0

prog++prog = 1으로 변경해야합니다. 도움이되는지 알려주세요!