新人求解

2019-03-24 09:57发布

msp430f149的板子,今天写了一个时钟程序,用的1602显示。按键中断修改时间,总中断加上后不能立即正常加时间了。


#include "msp430x14x.h"

#include "cry1602.h"

#include "cry1602.c"

#define CPU_F ((double)8000000)

#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))

#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

unsigned char Key_Value = 0;

//unsigned char keyscan()

//{

//  unsigned char key=P1IN&0x0f;

//  unsigned char keyvalue,i;

//  if(key!=0x0f)

//  {

//    delay_ms(10);

//    if(key!=0x0f)

//    {

//      keyvalue=key;

//      i=0;

//      while((i<50)&&(key!=0x0f))

//      {

//         delay_ms(1);

//        i++;

//      }

//    }

//  }

//  return keyvalue;

//}



void main( void )

{

  int z;

  // Stop watchdog timer to prevent time out reset

  WDTCTL = WDTPW + WDTHOLD;     //关闭看门狗



  /*------选择系统主时钟为8MHz-------*/

  BCSCTL1 &= ~XT2OFF;                 //打开XT2高频晶体振荡器

  do

  {

    IFG1 &= ~OFIFG;                 //清除晶振失败标志

    for (z = 0xFF; z > 0; z--);     //等待8MHz晶体起振

  }

  while ((IFG1 & OFIFG));             //晶振失效标志仍然存在?

  BCSCTL2 |= SELM_2 + SELS;           //MCLK和SMCLK选择高频晶振



  //初始化工作

  LcdReset();

  int day=29,mon=7,yea=2015,sec=0,min=29,clo=11,daymax;

  P1DIR&=BIT0 + BIT1 + BIT2 + BIT3;

  P1IE = 0xFF;



  while(1)

  {

    _EINT();

    switch(Key_Value)

      {

        case 1:sec++;break;

        case 2:min++;break;

        case 3:clo++;break;

        case 4:day++;break;

        default:break;

      }

    if(sec==60)

    {

      sec=0;

      min++;

    }

    if(min==60)

    {

      min=0;

      clo++;

    }

    if(clo==24)

    {

      clo=0;

      day++;

    }

    switch(mon)

    {

    case 1:case 3:case 5:case 7:case 8:case 10:case 12:daymax=31;break;

    case 4:case 6:case 9:case 11:daymax=30;break;

    case 2:{if((yea%4==0&&yea%100!=0)||yea%400==0)daymax=29;else daymax=28;}break;

    }

    if(day==daymax)

    {

      day=1;

      mon++;

    }

    if(mon==12)

    {

      mon=1;

      yea++;

    }

    _DINT();

    Disp1Char(0,0,yea/1000+0x30);

    Disp1Char(1,0,(yea/100)%10+0x30);

    Disp1Char(2,0,(yea/10)%10+0x30);

    Disp1Char(3,0,yea%10+0x30);

    Disp1Char(4,0,'/');

    Disp1Char(5,0,mon/10+0x30);

    Disp1Char(6,0,mon%10+0x30);

    Disp1Char(7,0,'/');

    Disp1Char(8,0,day/10+0x30);

    Disp1Char(9,0,day%10+0x30);

    Disp1Char(0,1,clo/10+0x30);

    Disp1Char(1,1,clo%10+0x30);

    Disp1Char(2,1,':');

    Disp1Char(3,1,min/10+0x30);

    Disp1Char(4,1,min%10+0x30);

    Disp1Char(5,1,':');

    Disp1Char(6,1,sec/10+0x30);

    Disp1Char(7,1,sec%10+0x30);

    delay_ms(1000);

    sec++;



  }

}

#pragma vector=PORT1_VECTOR

__interrupt void Port1()

{

  if((P1IFG & BIT0) == BIT0)

  {

    Key_Value = 1;

    P1IFG &= ~BIT0;     //清除中断标志  

  }

  else if((P1IFG & BIT1) == BIT1)

  {

    Key_Value = 2;

    P1IFG &= ~BIT1;     //清除中断标志  

  }

   else if((P1IFG & BIT2) == BIT2)

  {

    Key_Value = 3;

    P1IFG &= ~BIT2;     //清除中断标志  

  }

  else

  {

    Key_Value = 4;

    P1IFG &= ~BIT3;     //清除中断标志  

  }

}

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1条回答
huaiqiao
2019-03-24 10:14
总体的感觉,你写程序写的好乱,各个程序请按模块写。我举个例子。如显示模块啦,lcd初始化模块啦。而不是一堆,这样真没心思看啊。

一周热门 更多>

相关问题

    相关文章