2016-10-08 3 views
0

스위치 구성으로 어떻게 상태를 증가시킬 수 있습니까? 나는 백작이 필요합니까? 스위치 (expr)에 [((button_in & 0x0040)! = 0)] 표현식을 넣었습니다. 이것은 저에게 제가 의도 한 처음 두 주를주었습니다. (1) 버튼 1을 누르면 0001이됩니다. (2) 버튼 2를 누르면 0010이됩니다. 프로그래밍 방법이 확실하지 않습니다 0010을 얻기 위해 버튼 1을 두 번 누르십시오. while 루프 내에 카운트를 구현합니까? while 표현식을 개수로 사용할 수 있습니까? 계단식으로 다른 루프를 배치해야합니까? 나는 내 주를 키우고 싶다. 0000, 0001 (5 센트), 0010 (10 센트), 0011 (15 센트), 0100 (20 센트), 1000 (25 센트), 0111 (변경)의 7 가지 상태가 있습니다. 본인의 의도를 명확하게 반영하기 위해 질문과 코드를 업데이트했습니다. 나는 프로그래머가 아니며 버튼을 누르면 내 친구가 언급했다. 현재 상태를 확인해야합니다. 그런 다음 내 코드를 프로그래밍하십시오. 그는 또한 이진 계산기를 언급했다. 어떤 방법이 가장 효율적입니까? 감사합니다C 스위치 증가 상태에 대한 카운트

int main() 
{ 
    char A; //placed for switch expression... (not needed?) 
    int button_in = 0; // button is set for 0 (not-engaged) 
    DeviceInit(); //set LED1 thru LED4 as digital output 
    DelayInit(); //Initialize timer for delay 
    int count; //maybe required for 5 button pushes. Requesting help with this 

    while (1) //Can I initiate a count? for a second button push? 
    { 
    button_in = PORTReadBits(IOPORT_A, BIT_6 | BIT_7); //Button 1 and button 2 defined 
    if (button_in != 0) //if button is engaged utilize switch statement 
    { 
     switch ((button_in & 0x0040) != 0) //if button1 is engaged 
     { 
     case 0: 
     ((button_in & 0x0080) != 0); //Statement: Button2 engages case0 
     PORTWrite(IOPORT_B, BIT_11); //State goes to 010 (BIT_11 lights up). 
     break; 

     default: ((button_in & 0x0040) != 0); //Statement: Button1 engages default. 
     PORTWrite(IOPORT_B, BIT_10); //This is state 0001 (BIT_10) lights up. 
     break; 
     } 

     DelayMs(100); //100millisecond delay for light shine 
     PORTClearBits(IOPORT_B, BIT_10 | BIT_11 | BIT_12 | BIT_13); //ClearLEDs 
    } 
    } 
} 
+0

나는 당신이 필요로하는 것은 내가 처음부터 문하지만 나를 위해 너무 원활하게 작동하지 않은 경우 구현하려 상태 머신 (state machine) – Mobius

답변

0

당신이 평소와 쉽게 읽을 수있을 것입니다 간단한 if 문으로 교체 할 수 있습니다 첫째, 내 의견으로는, switch ((button_in & 0x0040) != 0)을 수행하는 것은 피해야한다. 그것은 당신의 상태 문제에 관해서

그런 다음,이 특별한 경우에 어디 상태 머신은

전환 버튼 (1)을 누를 때마다 발생하는 것으로 보이는에서
(o)-->(s1)-->(s2)-->(s3)-->(s4)-->(s5)-->(s6)-->((s7)) 

, 당신은 단순히를 증가 할 수있다 카운터는 현재 상태를 나타냅니다 (터미널 1에서 초기 상태로 돌아가려면 모듈로 8). 카운터의 이진 값을 검사 한 후 IOPORT_B에 쓰는 올바른 값 ([1])은 루프에 들어가기 전에 배열에 저장할 수 있으며 arr[state]으로 검색 할 수 있습니다. 선택은 응용 프로그램과 값에 따라 다릅니다.

int main() 
{ 
    int state = 0; 
    while(1) 
    { 
     if (button 1 is pressed) 
     { 
     state = (state >= 7) ? 7 : (state + 1); 
     PORTWrite(IOPORT_B, ...);  // [1] 
     DelayMs(100);     // wait 
     PORTClearBits(IOPORT_B, ...); // Clear what you want to clear 
     } 
    } 
} 
+0

생각합니다. – Jeremiah

+0

나는 더 이상의 정보없이 더 많은 것을 도울 수 없다. 그것은'PORTReadBits'가 반환하는 것에 달려 있습니다. 하지만 확실히, 코드에서 이상한 일을하고 있습니다. 'case 0 :'과'default' 바로 뒤에있는 명령문과 마찬가지로, 단지 비교 일 뿐이며 결과를 사용하지 않는 것처럼 말이되지 않습니다. 어쩌면 당신은'switch' 문을 정말로 이해하지 못할 것입니다. –

+0

그것을 알아 냈습니다. 귀하의 의견을 보내 주셔서 감사합니다. – Jeremiah