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);//打开中断
}
posted @ 2021-10-26 22:06  胡不归来  阅读(708)  评论(0编辑  收藏  举报