用msp430f6638单片机外部中断程序流水灯在用另一个按键按两下所有灯关闭
时间: 2024-05-05 12:21:02 浏览: 96
STM8-利用外部中断编写两个按键控制灯的亮灭
以下是一个可能的实现:
```c
#include <msp430.h>
#define LED1 BIT0
#define LED2 BIT1
#define LED3 BIT2
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // 停用看门狗定时器
P1DIR = LED1 | LED2 | LED3; // 将 LED 引脚设为输出
P1OUT = 0; // 关闭所有 LED
P2IE = BIT0; // 使能 P2.0 外部中断
P2IES = BIT0; // P2.0 下降沿触发
P2IFG &= ~BIT0; // 清除 P2.0 中断标志
__bis_SR_register(GIE); // 全局中断使能
int led_state = 0; // 0 表示所有灯关闭,1 表示流水灯运行中
while (1)
{
if (led_state == 1)
{
P1OUT = LED1; // 打开 LED1
__delay_cycles(100000); // 延时
P1OUT = LED2; // 打开 LED2
__delay_cycles(100000); // 延时
P1OUT = LED3; // 打开 LED3
__delay_cycles(100000); // 延时
P1OUT = 0; // 关闭所有 LED
__delay_cycles(100000); // 延时
}
}
}
#pragma vector=PORT2_VECTOR // 处理 P2 中断
__interrupt void Port2_ISR(void)
{
static unsigned int last_press_time = 0;
unsigned int current_time = TA0R; // 当前计时器计数值
if (current_time - last_press_time < 500) // 判断两次按键间隔是否小于 500 个计时器时钟周期
{
P1OUT = 0; // 关闭所有 LED
__delay_cycles(1000000); // 延时
last_press_time = 0; // 重置上次按键时间
}
else
{
last_press_time = current_time; // 更新上次按键时间
}
P2IFG &= ~BIT0; // 清除 P2.0 中断标志
}
```
程序中使用 P2.0 作为按键输入,P1.0、P1.1 和 P1.2 分别对应三个 LED 灯。程序使用一个全局变量 `led_state` 来记录流水灯的状态,0 表示所有灯关闭,1 表示流水灯运行中。在 `main` 函数的主循环中,如果 `led_state` 为 1,则运行流水灯程序。在 `Port2_ISR` 函数中,使用一个静态变量 `last_press_time` 记录上次按键时间,并判断两次按键间隔是否小于 500 个计时器时钟周期。如果小于,则关闭所有灯;否则,更新 `last_press_time`。在 `Port2_ISR` 函数末尾,需要清除 `P2.0` 中断标志。
需要注意的是,程序中使用了一个计时器 `TA0`。在实际应用中,需要根据计时器的时钟频率和计数值的大小,调整 `500` 和 `1000000` 两个参数的值,以便实现期望的按键功能和流水灯效果。
阅读全文