2017-05-02 63 views
0

LEDに問題があります。入力として2つのボタン、出力として3つのLEDと7つのセグメント表示。 選択ボタンを1回押すと、7セグメント表示で "1"が観測されます。確認ボタンを押すと、確認ボタンを押した後、緑色LEDが1秒後にになります。CCSでのポート割り込みとタイマーの使用

ボタンを2回押すと、7セグメント表示で「2」が観察されます。確認ボタンが押されると、イエローLEDが点灯して2秒後にと表示され、その後確認ボタンが押されます。

ボタンを3回押すと、7セグメント表示で「3」が観察されます。確認ボタンが押されると、3秒後に赤色LEDが点灯し、と表示され、その後確認ボタンが押されます。

私はポート割り込みとタイマーを使用する必要があります。 1,2秒後と3秒後にLEDがどのように点灯するのか分かりませんでした。私のコードは機能していますが、確認ボタンを押すとすぐにオンになり、時には遅れることがあります。わかりません。また、セグメントも遅れています。ここに私のコードは次のとおりです。

#include <msp430.h> 

#define BUTTON1 0x04 //confirmation Button P1.2 
#define BUTTON2 0x02 

#define Yellow (P1OUT |= 0x10) 
#define Red (P1OUT |= 0x20) 
#define Green (P1OUT |= 0x08) 
#define LedOff (P1OUT &= ~0x38) 


int counter =0; 

int main(void) { 
    WDTCTL = WDTPW|WDTHOLD; 

    P2SEL &= ~0x40; 
    P1DIR |= (BIT5|BIT4|BIT3); // Set the LEDs on P1.5, P1.4, P1.3 as outputs 
    P1OUT = 0; 


    P2DIR |= (0x01|0x02|0x04|0x08|0x10|0x20|0x40); //segments 

    P1OUT = LedOff; 
    P2OUT = ~0x7F; 

    P1IE =BUTTON2|BUTTON1; // interrupt enable 
    P1IES=BUTTON2|BUTTON1; //interrupt edge select from high to low 
    P1IFG=0x00; 

    BCSCTL3 |= LFXT1S_2; 

    TACTL = TASSEL_2|ID_1|MC_3|TAIE|TACLR; 
    TACCR0 = 3000; 



    _enable_interrupts();//enable all interrupts 


    LPM0; 
} 

#pragma vector=TIMER0_A1_VECTOR 

__interrupt void bahar(void){ 

          if(P1IFG==BUTTON2){ 
           P2OUT = ~0x7F; 
           counter++; 
             if(counter==1){ 
              P2OUT = 0x06; // 1 
             } 
             if (counter == 2) { 
              P2OUT = 0x5b; // 2 
              } 
             if (counter == 3) { 
               P2OUT = 0x4F; // 3 
               counter =0; 
             } 

          } 

          if(P1IFG==BUTTON1){ 
           P1OUT =LedOff; 
           if (counter == 1) { 
               Green; 
               } 
              if (counter == 2) { 
               Yellow; 
              } 
              if (counter == 0) { 
               Red; 
              } 
             // TACTL |= TACLR; 
             } 
          P1IFG=0x00; //clear the interrupt flag 
} 

答えて

0

P1OUT =LedOff;はさらに、ユーザー入力を処理するためのタイマ割り込みを使用しているP1OUT =(P1OUT &= ~0x38)

で置換されています。つまり、ボタンを押すとボタンの割り込みフラグが設定されますが、タイマーがタイムアウトしてからこの値がチェックされた後でなければなりません。 LEDは現在同じルーチンで設定されています。

  • ボタン割り込みを処理するにはgpio割り込みハンドラを使用する必要があります。
  • gpio割り込みは、希望のタイムアウトでタイマーを開始する必要があります。
  • タイマ割り込みハンドラは、タイマをディセーブルし、希望のLEDをオンにする必要があります。
関連する問題