You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MSP430F427双按键多功能实现及Button B控制LED异常问题求助

MSP430F427双按键多功能实现及Button B控制LED异常问题求助

各位大佬好,我现在在做一个基于MSP430F427的项目,用了两个外部上拉的按键,系统时钟用的是32kHz外部振荡器。目前主要卡在Button B的功能实现上,先跟大家说下我的需求和遇到的问题:

按键功能需求

Button A(P1.2)

  • 短按:唤醒/开机设备
  • 长按5秒:关闭设备
  • 计数运行状态下短按:重置计数器

Button B(P1.3)

  • 短按:点亮P1.1引脚的LED,30秒后自动熄灭
  • 长按5秒:切换计数单位(第一次长按切换为英寸,第二次切换为厘米)

当前进展与问题

我先从相对简单的Button B入手(暂时不用涉及低功耗睡眠模式),但写出来的代码运行时出现了好几个异常。先贴出我的代码:

volatile uint16_t ctr1 = 0;
volatile uint16_t ctr2 = 0;
volatile uint16_t ctr3 = 0;    // 用于LED点亮计时的计数器

void Init_Timer_A (void)
{
    // Timer_A0 配置
    TA0CCTL0 = CCIE;             // 使能Timer_A中断
    TA0CCR0 = 33;                // 设置计数上限,实现1ms定时间隔(32768Hz / 33 ≈ 993Hz,接近1ms)
    TA0CTL = TASSEL_1 + MC_1;    // 选择ACLK(32.768kHz外部晶振),向上计数模式
}

#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
    if (counter1_enable_flag)
    {
        if (ctr1 <= 5000)
        {
            ctr1++;
            if (ctr1 >= 100)
            {
                ctr3++;
                if (ctr3 <= 4000)
                {
                    P1OUT |= BIT1;
                }
                else
                {
                    P1OUT &= ~(BIT1);
                }
            }
        }
        else
        {
            P1OUT |= BIT1;
            ctr1 = 0;
        }
    }
}

int main(void)
{
    initialize();
    GPIO_init();
    Init_Timer_A();
    __enable_interrupt();

    while (1)
    {
        if ((P1IN & BIT2) == 0)    // Button A(P1.2)被按下
        {
            counter1_enable_flag = 1;
        }
    }
}

我本来想先实现Button B的基础功能:短按后LED亮30秒,长按5秒先让LED保持常亮,但实际运行时出现了这些问题:

  • 代码里if (ctr3 <= 4000)这一行,只能让LED亮4秒;如果改成5000,LED就一直亮着不会熄灭;
  • 如果保留else语句,LED会每隔5秒闪烁一次,而且按按键后也不会保持亮4秒,只会持续闪烁;
  • 如果去掉else语句,第一次按按键LED能正常亮4秒,也不会闪烁,但第二次按按键时LED完全不亮了。

想请教大家,我的定时器计数逻辑哪里出问题了?怎么才能正确实现Button B短按亮30秒、长按5秒触发其他功能的需求?

备注:内容来源于stack exchange,提问作者Bravo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 13:53:07