MSP430中断小实验——通过按键改变小灯闪烁频率
本小实验基于MSP430f5529,不同的型号可能管脚和中断配置有所不同。
实现的功能为:
第一次按下按键后,系统以每 2 秒钟,指示灯暗 1 秒,亮 1 秒的方式闪烁。程序采用默认时钟配置;
第二次按下按键后,系统以每 4 秒钟,指示灯亮 2 秒,暗 2 秒钟方式闪烁。
第三次按下按键后,系统以每 4 秒钟,指示灯亮 1 秒,暗 3 秒方式闪烁。程序基于定时器配置。
/*
* main.c
* 第一次按下按键后,系统以每 2 秒钟,指示灯暗 1 秒,亮 1 秒的方式闪
烁,程序采用默认时钟配置;
第二次按下按键后,系统以每 4 秒钟,指示灯亮 2 秒,暗 2 秒钟方式闪
烁。
第三次按下按键后,系统以每 4 秒钟,指示灯亮 1 秒,暗 3 秒方式闪
烁,程序基于定时器配置。
*/
#include <msp430f5529.h>
int count = 0; //计数
int t1_50ms = 20; //一个单位对应50ms(亮)
int t2_50ms = 20; //一个单位对应50ms(灭)
int flag = 0; //闪烁频率标志
int flag_t = 1; //亮灭标志
int main(void) {
WDTCTL = WDTPW+WDTHOLD;
//时钟中断配置
P1DIR |= BIT0;
TA0CCTL0 = CCIE;//使能定时器中断
TA0CCR0 = 50000;
TA0CTL = TASSEL_2 + MC_1 + TACLR;//配置为SMCLK,升计数模式,初始化时钟
//S1配置
P1IE |= BIT7; //允许P1.7中断
P1IES |= BIT7; //设置为下降沿中断
P1IFG &= ~BIT7; //设置为输入
P1REN |= BIT7; //启用上下拉电阻
P1OUT |= BIT7; //将电阻设置为上拉
__bis_SR_register(LPM0_bits+GIE); //打开中断
return 0;
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
if(count==t1_50ms&&flag_t==1) //灯亮
{
P1OUT |= BIT0;
count=0;
flag_t=0;
}
else if(count==t2_50ms&&flag_t==0) //灯灭
{
P1OUT &=~BIT0;
count = 0;
flag_t=1;
}
else count++;
}
#pragma vector=PORT1_VECTOR;
__interrupt void botton (void)
{
__delay_cycles(75);//延时消抖
switch(flag)//flag决定闪烁频率
{
case 0:
t1_50ms = 20;t2_50ms = 20;break;//1秒亮 1秒暗
case 1:
t1_50ms = 40;t2_50ms = 40;break;//2秒亮 2秒暗
case 2:
t1_50ms = 60;t2_50ms = 20;break;//3秒亮 3秒暗
}
flag++;//状态变化
if(flag>2) flag = 0;//flag归位
P1IFG &=~ BIT7; //清除中断标志位
__bis_SR_register(LPM0_bits+GIE);//打开中断
}