目的是制作一个通过按键来改变亮度的小灯用占空比做
代码如下
#include <msp430x14x.h>
#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) //无限循环
{
void pwm_sel(KEY_VAL);
}
}
然后就在最后的选择程序里报这个错
时间很紧,求大神们指教,多谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
{
void pwm_sel(KEY_VAL);
}
把pwm_sel(KEY_VAL);前面的 void 去掉,你是调用函数,不是定义函数,不能加void 最佳答案
一周热门 更多>