#include <msp430.h>#define MCLK_C (1)#define Delay_us(n) __delay_cycles(n*MCLK_C)#define Delay_ms(n) __delay_cycles(n*(1000L)*MCLK_C)int b=1;int main(void){ WDTCTL = WDTPW+WDTHOLD; P1DIR|=BIT6; P1SEL|=BIT6; P1REN|=BIT3; P1OUT|=BIT3; P1IE|=BIT3; P1IES=BIT3; P1IFG&=~BIT3; CCR0=1000; CCTL1=OUTMOD_7; CCR1=0; TACTL=TASSEL_2+MC_1+TACLR; _EINT(); while(1) { if(b==1) { CCR1+=5; Delay_ms(10); if(CCR1>=1000&b==1) { while(b==1) { CCR1-=5; Delay_ms(10); if(CCR1<=0) { CCR1=0; break; } } } } if(b==0) { CCR1=0; while(b==0); } } }
#pragma vector=PORT1_VECTOR__interrupt void Port_1(void){ if(b==1) { b=0; P1IFG&=~BIT3; } if(b==0) { b=1; P1IFG&=~BIT3; }}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
定时器中断都没开
#include "Config.h" //开发板配置头文件,主要配置IO端口信息
#define KEY_IN (P1IN & 0xF0)
int KEY_VAL = 0;
//***********************************************************************
// MSP430IO口初始化
//***********************************************************************
void Port_Init()
{
LED8SEL = 0x00; //设置IO口为普通I/O模式,此句可省
LED8DIR = 0xFF; //设置IO口方向为输出
LED8PORT = 0xFF; //P2口初始设置为FF
DATASEL = 0x00; //设置IO口为普通I/O模式,此句可省
DATADIR = 0xFF; //设置IO口方向为输出
DATAPORT = 0xFF; //P4口初始设置为FF
CTRSEL = 0x00; //设置IO口为普通I/O模式,此句可省
CTRDIR |= BIT3 + BIT4; //设置IO口方向为输出,控制口在P63,P64
CTRPORT = 0xFF; //P6口初始设置为FF
P1IES = 0xF0; //P14~P17选择下降沿中断
P1IE = 0xF0; //打开中断使能
P1IFG = 0x00; //中断标志位清零
}
//***********************************************************************
// PWM初始化
//***********************************************************************
void PWM_Init1(void) //产生10KHZ、占空比为50%的PWM信号
{
P1SEL |= BIT2; //P12口输出PWM信号
P1DIR |= BIT2; //P12口接入一个LED发光二极管
TACCR0 = 800; //CCR0
TACCR1 = 200; //CCR1,占空比50%,可以更改,LED灯亮度会变化
TACCTL1 = OUTMOD0 + OUTMOD1 + OUTMOD2;//复位/置位
TACTL |= TASSEL1 + MC0; //SMCLK做时钟源,1分频,增加计数模式
}
void PWM_Init2(void) //产生10KHZ、占空比为50%的PWM信号
{
P1SEL |= BIT2; //P12口输出PWM信号
P1DIR |= BIT2; //P12口接入一个LED发光二极管
TACCR0 = 800; //CCR0
TACCR1 = 400; //CCR1,占空比50%,可以更改,LED灯亮度会变化
TACCTL1 = OUTMOD0 + OUTMOD1 + OUTMOD2;//复位/置位
TACTL |= TASSEL1 + MC0; //SMCLK做时钟源,1分频,增加计数模式
}
void PWM_Init3(void) //产生10KHZ、占空比为50%的PWM信号
{
P1SEL |= BIT2; //P12口输出PWM信号
P1DIR |= BIT2; //P12口接入一个LED发光二极管
TACCR0 = 800; //CCR0
TACCR1 = 600; //CCR1,占空比50%,可以更改,LED灯亮度会变化
TACCTL1 = OUTMOD0 + OUTMOD1 + OUTMOD2;//复位/置位
TACTL |= TASSEL1 + MC0; //SMCLK做时钟源,1分频,增加计数模式
}
void PWM_Init4(void) //产生10KHZ、占空比为50%的PWM信号
{
P1SEL |= BIT2; //P12口输出PWM信号
P1DIR |= BIT2; //P12口接入一个LED发光二极管
TACCR0 = 800; //CCR0
TACCR1 = 800; //CCR1,占空比50%,可以更改,LED灯亮度会变化
TACCTL1 = OUTMOD0 + OUTMOD1 + OUTMOD2;//复位/置位
TACTL |= TASSEL1 + MC0; //SMCLK做时钟源,1分频,增加计数模式
}
//*************************************************************************
// pwm选择函数
//*************************************************************************
void pwm_sel(int unm)
{
if(unm == 1)
{void PWM_Init1();}
else if(unm == 2)
{void PWM_Init2();}
else if(unm == 3)
{void PWM_Init3();}
else if(unm == 4)
{void PWM_Init4();}
}
//*************************************************************************
// 中断服务函数
//*************************************************************************
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
if(P1IFG & 0xF0)
{
switch(P1IFG&0xF0) //进行一个与操作,避免判断值出现其他影响
{
case 0x10:
if(KEY_IN == 0xE0) //如果是第一个按键被按下
{
delay_ms(20); //20ms的消抖时间
if(KEY_IN == 0xE0)
{
while(KEY_IN != 0xF0); //等待键释放
KEY_VAL = 1;
P1IFG = 0;
return;
}
}
case 0x20:
if(KEY_IN == 0xD0) //如果是第二个按键被按下
{
delay_ms(20);
if(KEY_IN == 0xD0)
{
while(KEY_IN != 0xF0); //等待键释放
KEY_VAL = 2;
P1IFG = 0;
return;
}
}
case 0x40:
if(KEY_IN == 0xB0) //如果是第三个按键被按下
{
delay_ms(20);
if(KEY_IN == 0xB0)
{
while(KEY_IN != 0xF0); //等待键释放
KEY_VAL = 3;
P1IFG = 0;
return;
}
}
case 0x80:
if(KEY_IN == 0x70) //如果是第四个按键被按下
{
delay_ms(20);
if(KEY_IN == 0x70)
{
while(KEY_IN != 0xF0); //等待键释放
KEY_VAL = 4;
P1IFG = 0;
return;
}
}
default:
while(KEY_IN != 0xF0); //等待键释放
P1IFG = 0;
return;
}
}
}
//*************************************************************************
// 主函数
//*************************************************************************
void main(void)
{
WDT_Init(); //看门狗设置
Clock_Init(); //系统时钟设置
Port_Init(); //端口初始化
Close_LED(); //关闭数码管显示
_EINT();
while(1) //无限循环
{
pwm_sel(KEY_VAL);
}
}
一周热门 更多>