#include<msp430x14x.h>
#define uint unsigned int
#define uchar unsigned char
#define keyin (P1IN & 0x0e)
uint num,num1,i;
uchar flag;
void delay(uint);
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 &=~XT2OFF;//XT2振荡器开启,下面切换到高频
do
{
IFG1 &=~OFIFG;//清楚OFIFG
for(i=0xFF;i>0;i--);
}
while((IFG1 & OFIFG));//再次检查OFIFG,如果任然置位,重复上次动作
BCSCTL2 |=SELM_2;//SELM_1置位,时钟源为LFXT1或者XT2
flag = 1;//标志位置1
//端口设置
P1DIR = 0x01;
P1OUT &=~BIT0;
P1IES =0x0e;//下降沿中断
P1IE = BIT1 + BIT2 + BIT3;//中断使能
P2DIR |= BIT3 + BIT4;
P2SEL |= BIT3 + BIT4; // P2.3输出波形占空比自动变化,P2.4占空比手动调节
//定时器A设置
CCR0 = 80;
CCTL1 = OUTMOD_7;//复位置位模式
CCR1 = num;
CCTL2 = OUTMOD_7;
CCR2 = num1;
TACTL = TASSEL_2 + MC_1;//选择主时钟,增计数模式
//定时器B设置
TBCCTL0 = CCIE;//定时器B使能
TBCCR0 = 720;//初值,9个方波的时间 ;
TBCTL = TBSSEL_2 + MC_1;//选择主时钟,增计数模式
_EINT();//全局中断使能
while(1);
}
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B (void)
{
if(flag == 1)
{
num++;
CCR1 = num;
if(num == 80)//占空比到达最大值
{
flag = 2;//标志位改变
}
}
if(flag == 2)
{
num--;
CCR1 = num;
if(num == 0)//占空比到达最小值
{
flag = 1;// 标志位改变
}
}
}
void delay(uint x)//延时函数
{
uint y,z;
for(y=x;y>0;y--)
for(z=10000;z>0;z--);
}
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
if(P1IFG & 0x0e)
{
switch(P1IFG)
{
case 0x02:
if(keyin == 0x0c)
{
delay(5);//消抖
while(keyin != 0x0e);//松手检测
num1 = num1 + 8 ;//占空比加10%
CCR2 = num1;
if(num1 == 80)
num1 = 72;
P1IFG = 0;//标志位清零
return;
}
case 0x04:
if(keyin == 0x0a)
{
delay(5);
while(keyin != 0x0e);
num1 = num1 -8;//占空比减10%
CCR2 = num1;
if(num1 == 0)
num1 = 8;
P1IFG = 0;
return;
}
case 0x08:
if(keyin == 0x06)
{
delay(5);
while(keyin != 0x0e);
num1++;//占空比加1%
CCR2 = num1;
if(num1 == 80)
num1 = 79;
P1IFG = 0;
return;
}
default :
{
while(keyin != 0x0e);
P1IFG = 0;
}
}
}
}