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
相关产品推荐
相关产品推荐

