0

我的 LED 有问题。2 个按钮作为输入,3 个 LED 和 7 段显示器作为输出。如果我们按下选择按钮一次,我们可以在 7 段显示中观察到“1”。按下确认按钮后,绿色 LED 会在按下确认按钮1 秒后亮起。

如果我们按两次选择按钮,我们可以在 7 段显示中观察到“2”。按下确认按钮时,黄色 LED 将在 2秒后亮起,然后按下确认按钮。

如果我们将选择按钮按三下,我们可以在 7 段显示中观察到“3”。按下确认按钮后,红色 LED 将在3 秒后亮起,然后按下确认按钮。

我必须使用端口中断和计时器。我找不到 LED 将如何在 1,2 和 3 秒后打开。我的代码正在运行,但是当我按下确认按钮时,立即打开并且有时会延迟。我不明白。细分市场也延迟了。这是我的代码:

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

1 回答 1

0

P1OUT =LedOff;被取代P1OUT =(P1OUT &= ~0x38)

此外,您正在使用定时器中断来处理用户输入。这意味着您的按钮按下将设置按钮中断标志,但是只有在您的计时器超时后才会检查此值。LED 当前正在同一例程中设置。

  • 您应该使用 gpio 中断处理程序来处理按钮中断。
  • 您的 gpio 中断应该以所需的超时时间启动计时器。
  • 您的定时器中断处理程序应禁用定时器,并打开所需的 LED。
于 2017-05-03T09:54:04.483 回答