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

2019-07-15 15:42发布

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

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
Rammsteinssss
1楼-- · 2019-07-15 20:44
有人吗啊啊啊啊啊啊啊啊啊啊啊啊啊啊
蒾丄nl嘚乞蒠
2楼-- · 2019-07-15 22:09
Rammsteinssss 发表于 2018-3-25 15:27
有人吗啊啊啊啊啊啊啊啊啊啊啊啊啊啊

定时器中断都没开
name001
3楼-- · 2019-07-16 01:36
 精彩回答 2  元偷偷看……
微笶低頭徊憶
4楼-- · 2019-07-16 06:19
你这个好多错的
彭忠元
5楼-- · 2019-07-16 08:01
#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)                              //无限循环
    {
   pwm_sel(KEY_VAL);
    }
}
彭忠元
6楼-- · 2019-07-16 11:55
 精彩回答 2  元偷偷看……

一周热门 更多>