这段程序在计时30秒期间,我按下按键,小灯不熄灭
时间: 2024-03-22 11:42:12 浏览: 96
小灯间隔30s亮灭.MCP
根据你的描述,可能是计时器中断服务函数中的逻辑有误导致按键按下后 LED 无法熄灭。在中断服务函数中,当按键按下且计数器 `count` 大于0 时,将标志位 `flag` 置为1,但是在下一次中断服务函数中并没有判断标志位 `flag` 的状态,直接将 LED 置为低电平,导致即使按键按下也无法熄灭 LED。
下面是修改后的代码:
```
#include <msp430g2553.h>
#define LED BIT2
#define BUTTON BIT0
volatile unsigned int count = 0;
volatile unsigned char flag = 0;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 停用看门狗定时器
P1DIR |= LED; // 使 P1.2 引脚输出
P7DIR &= ~BUTTON; // 使 P7.0 引脚输入
P7REN |= BUTTON; // 使 P7.0 引脚启用上拉电阻
P7OUT |= BUTTON; // 使 P7.0 引脚上拉
TA0CCTL0 = CCIE; // 使定时器 TA0 的 CCR0 中断使能
TA0CCR0 = 32768; // 设置定时器 TA0 的 CCR0 值,使其产生 1 秒的中断
TA0CTL = TASSEL_1 + MC_1; // 选择 ACLK 作为定时器 TA0 的时钟源,选择增计数模式
__enable_interrupt(); // 使总中断开关打开
while (1)
{
if ((P7IN & BUTTON) == 0) // 如果按键按下
{
count = 30; // 将计数器赋值为30
P1OUT |= LED; // 使 LED 引脚输出高电平
flag = 0; // 将标志位清零
}
if (count == 0) // 如果计数器为0
{
P1OUT &= ~LED; // 使 LED 引脚输出低电平
flag = 0; // 将标志位清零
}
}
}
#pragma vector=TIMER0_A0_VECTOR // 定时器 TA0 的 CCR0 中断服务函数
__interrupt void Timer_A(void)
{
if (count > 0) // 如果计数器大于0
{
count--; // 计数器减1
}
if ((P7IN & BUTTON) == 0 && count > 0) // 如果按键按下且计数器大于0
{
flag = 1; // 将标志位设置为1
}
else if (count == 0 && flag == 1) // 如果计数器为0且标志位为1
{
P1OUT &= ~LED; // 使 LED 引脚输出低电平
flag = 0; // 将标志位清零
}
}
```
在修改后的代码中,我们在中断服务函数中增加了一个判断语句,当计数器 `count` 为0且标志位 `flag` 为1时,将 LED 置为低电平,实现了按键按下后可以熄灭 LED 的功能。
阅读全文