MSP430技术论坛
直播中

Rammsteinssss

6年用户 11经验值
私信 关注
[问答]

谁能帮忙找下错误,按键控制呼吸灯亮灭就是不行啊,程序贴底下了

#include
#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;
  }
}


回帖(8)

Rammsteinssss

2018-3-25 15:27:15
有人吗啊啊啊啊啊啊啊啊啊啊啊啊啊啊
举报

祝云生

2018-3-26 09:45:31
引用: Rammsteinssss 发表于 2018-3-25 15:27
有人吗啊啊啊啊啊啊啊啊啊啊啊啊啊啊

定时器中断都没开
举报

向前

2018-3-27 00:47:30
引用: Rammsteinssss 发表于 2018-3-25 15:27
有人吗啊啊啊啊啊啊啊啊啊啊啊啊啊啊

你这程序编译过了吗,定时寄存器名称写错了吧,呼吸灯渐亮渐灭程序用两个for循环就好了,没必要写那些重复多余的语句
                                         —————小白上路,如有错误不当之处,还望各路大神批评指正
举报

微笶低頭徊憶

2018-4-2 21:14:11
你这个好多错的
举报

彭忠元

2018-4-18 23:18:41
#include
#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);
    }
}
举报

彭忠元

2018-4-18 23:18:59
#include
#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);
    }
}
举报

刘蔚漳

2018-4-19 10:05:54
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);
            }
这段程序太冗杂了吧!太多的重复判定,太多的无用语句。编辑器都不一定能编辑正确
举报

刘蔚漳

2018-4-19 10:10:00
if(wifi_led_cnt<5)
{
        Fcard_WIFI=0;
}
else if(wifi_led_cnt>wifi_led_Speed)
{
        wifi_led_cnt=0;
}
else
{
        Fcard_WIFI=1;
}参照下这段,把wifi_led_cnt丢进定时器就行了
举报

更多回帖

发帖
×
20
完善资料,
赚取积分