gpt4 book ai didi

c - 在 CCS 上使用端口中断和定时器

转载 作者:行者123 更新时间:2023-11-30 16:46:26 28 4
gpt4 key购买 nike

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

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

如果我们按三下选择按钮,我们可以在七段显示器上观察到“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
}

最佳答案

P1OUT =LedOff; 替换为 P1OUT =(P1OUT &= ~0x38)

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

  • 您应该使用 GPIO 中断处理程序来处理按钮中断。
  • 您的 GPIO 中断应以所需的超时启动计时器。
  • 您的定时器中断处理程序应禁用定时器,并打开所需的 LED。

关于c - 在 CCS 上使用端口中断和定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43741693/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com