430钟表程序设计的问题。。。新人求罩

2019-07-15 16:41发布

用430f437在写钟表程序的时候,怎么使写的程序在按动按键的时候秒钟还能够继续走。我写的程序现在不具备这个功能
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
guybeast
2019-07-16 00:34
#include<msp430x43x.h>
#define unit  unsigned int
#define uchar unsigned char
#define hourH LCDMEM[10]
#define hourL LCDMEM[11]
#define miniteH LCDMEM[12]
#define miniteL LCDMEM[13]
#define secondeH LCDMEM[0]
#define secondeL LCDMEM[1]
#define yearH LCDMEM[14]
#define yearL LCDMEM[15]
#define monthH LCDMEM[16]
#define monthL LCDMEM[17]
#define dayH  LCDMEM[18]
#define dayL LCDMEM[19]
#define KEY4 BIT0
#define KEY3 BIT1
#define KEY2 BIT2
#define KEY1 BIT3
uchar seconde=0;                       //秒
uchar minite=0;                       //分
uchar hour=0;                         //时
uchar day=0,month=0,year=0;          //年月日
uchar hfsec;  
int setflag;
char lcd_seg[10]={0x5f,0x50,0x3d,0x79,0x72,0x6b,0x6f,0x51,0x7f,0x7b};     //上0.1.2.3.4.5.6.7.8.9
char tab[10]={0xbf,0xb0,0xdb,0xf9,0xf4,0x7d,0x7f,0xb8,0xff,0xfd};        //下0 1 2 3 4 5 6 7 8 9,带第八位
char lcd_sed[10]={0xaf,0xa0,0xcb,0xe9,0xe4,0x6d,0x6f,0xa8,0xef,0xed};   //下0 1 2 3 4 5 6 7 8 9 不带第八位
char lcd_tab[3]={0x00,0x50,0x60};                                      //时钟的显示 时 的高位
/*定义一个延时函数*/
void delay(unit k)
{
  unit j,l;
  for(j=0;j<k;j++)
    for(l=0;l<100;l++);              //去按键抖动
}
/****LCD初始化*************/
void LCD_clear(){
  unsigned char i;
  for(i=0;i<20;i++)
    LCDMEM=0x00;
}
void P2_Init(void)
{ P2DIR&=~(KEY1|KEY2|KEY3);     //KEY1和KEY2,KEY4为input
//P2OUT|=KEY1|KEY2;
P2IE|=KEY1|KEY2|KEY3;         //开中断
P2IES|=KEY1|KEY2|KEY3;       //下降沿
}  
void LCDInit()
{
  WDTCTL = WDTPW + WDTHOLD;
  LCDCTL=0XFD;
  BTCTL=0x2d;                   //定时器时钟设置 中断频率为2^15/256/64
  SCFQCTL=SCFQ_64K;
  P5SEL=0XFC;
  P4SEL|=0XFC;               //P4端口功能选择外接模块
  LCD_clear();
}
/*********LCD全部置零********/
void Resit()
{
  for(int i=0;i<2;i++)
    LCDMEM=0x5F;
  
  for(int j=10;j<20;j++)  
  {
    LCDMEM[j]=0xAF;
  }
  LCDMEM[10]=0x00;
}
//显示函数放在中断中则 初始值定义无效
void display()//
{   
    secondeL=lcd_seg[seconde%10];
    secondeH=lcd_seg[seconde/10];
    dayL=lcd_sed[day%10];//天低位   
    dayH=lcd_sed[day/10];//天的高位
    monthL=lcd_sed[month%10];//月低位
    monthH=lcd_sed[month/10];//月高位
    yearL=lcd_sed[year%10];//年低位
    yearH=lcd_sed[year/10];  //年高位
    miniteL=lcd_sed[minite%10];//分的低位
    miniteH=lcd_sed[minite/10];//分的高位
    hourL=lcd_sed[hour%10];//时的低位
    hourH=lcd_tab[hour/10];//时的高位
}
void main()
{
  WDTCTL = WDTPW + WDTHOLD;
  FLL_CTL0|=XCAP18PF;
  IE2|=0x80;
  P2_Init();
  LCDInit();
  Resit();
  _EINT();
  for(;;)
  {                                     //display();//显示程序放在主程序中不能闪烁显示
    LPM3;
  }
}
#pragma vector=PORT2_VECTOR           //P2端口中断子程序
__interrupt void PORT2_ISR(void)
{
  LPM3_EXIT;
if(P2IFG&KEY1)
{  
   delay(200);
  if(P2IFG&KEY1)
  {
    setflag++;
    setflag&=0x07;
    display();
    P2IFG&=~KEY1;  
  }
}
/*按键设置为加计数*/
else if(P2IFG&KEY2)
{
  delay(200);

  if(P2IFG&KEY2)
  {
    {
    switch(setflag)
    {
    //case 0:
       // break;
    case 1:
      hour++;
      if(hour==24)
        hour=0;
      hourL=lcd_sed[hour%10];//时低位
      hourH=lcd_tab[hour/10];  //时高位
      break;
    case 2:
      minite++;
      if(minite==60)
        minite=0;
      miniteL=lcd_sed[minite%10];//分低位
      miniteH=lcd_sed[minite/10];//分高位
      break;
    case 3:
      day++;
      if(day==30)
        day=0;
      dayH=lcd_sed[day/10];
      dayL=tab[day%10];
      break;
    case 4:
      month++;
      if(month==13)
        month=0;
      monthH=lcd_sed[month/10];
      monthL=lcd_sed[month%10];
      break;
    case 5:              //CASE语句的顺序不能变,否则会出现按键错乱
      year++;
      if(year==99)
        year=0;
      yearH=lcd_sed[year/10];
      yearL=lcd_sed[year%10];
   case 6:
      seconde++;
      if(seconde==60)
        seconde=0;
      secondeH=lcd_seg[seconde/10];
      secondeL=lcd_seg[seconde%10];
//  case 7:
   //   break;
    default:
      break;     
    }
   
   }
  }
    P2IFG&=~KEY2;
  
  }
/*按键设置为减计数*/
else if(P2IFG&KEY3)
{
  delay(200);

  if(P2IFG&KEY3)
  {
    {
    switch(setflag)
    {
    //case 0:
       // break;
    case 1:
      hour--;
      if(hour==0)
        hour=24;
      hourL=lcd_sed[hour%10];//时低位
      hourH=lcd_tab[hour/10];  //时高位
      break;
    case 2:
      minite--;
      if(minite==0)
        minite=60;
      miniteL=lcd_sed[minite%10];//分低位
      miniteH=lcd_sed[minite/10];//分高位
      break;
    case 3:
      day--;
      if(day==0)
        day=30;
      dayH=lcd_sed[day/10];
      dayL=tab[day%10];
      break;
    case 4:
      month--;
      if(month==0)
        month=12;
      monthH=lcd_sed[month/10];
      monthL=lcd_sed[month%10];
      break;
    case 5:              //CASE语句的顺序不能变,否则会出现按键错乱
      year--;
      if(year==0)
        year=99;
      yearH=lcd_sed[year/10];
      yearL=lcd_sed[year%10];
   case 6:
      seconde--;
      if(seconde==0)
        seconde=60;
      secondeH=lcd_seg[seconde/10];
      secondeL=lcd_seg[seconde%10];
//  case 7:
   //   break;
    default:
      break;     
    }
   
   }
  }
    P2IFG&=~KEY3;
  
  }


}
#pragma vector=BASICTIMER_VECTOR      //基础定时器中断子程序
__interrupt void BT_ISR(void)
{  
LPM3_EXIT;
hfsec++;
hfsec&=0x01; //满2进1
LCDM12^=0X10; //秒点闪烁,不改变其他位
LCDM16^=0x10;
if(setflag)
{
    switch (setflag)
    {
      case 1:
        hourH=hfsec*lcd_tab[hour/10];
        hourL=hfsec*lcd_sed[hour%10];
        break;
      case 2:
        miniteH=hfsec*lcd_sed[minite/10];
        miniteL=hfsec*lcd_sed[minite%10];
        break;
      case 3:
       dayH=hfsec*lcd_sed[day/10];
       dayL=hfsec*lcd_sed[day%10];
        break;
      case 4:
       monthH=hfsec*lcd_sed[month/10];
       monthL=hfsec*lcd_sed[month%10];
       break;
      case 5:
       yearH=hfsec*lcd_sed[year/10];
       yearL=hfsec*tab[year%10];
       break;
      case 6:
       secondeH=hfsec*lcd_seg[seconde/10];
       secondeL=hfsec*lcd_seg[seconde%10];
      //case 7:
      // LCDMEM[2]=hfsec*0x5f;
      // delay(1000);
      // LCDMEM[2]=0x00;
      default:
        break;
    }
}
   
  else if(hfsec)
  {
   seconde++;
   secondeL=lcd_seg[seconde%10];
   secondeH=lcd_seg[seconde/10];
   if(seconde==60)
   {
     minite++;
     seconde=0;
     miniteL=lcd_sed[minite%10];//分低位
     miniteH=lcd_sed[minite/10];//分高位
    if(minite==60)
    {
      hour++;
      minite=0;
      hourL=lcd_sed[hour%10];//时低位
      hourH=lcd_tab[hour/10];  //时高位
     if(hour==24)
     {
       hour=0;
       day++;
       dayL=lcd_sed[day%10];
       dayH=lcd_sed[day/10];
       if(day==30)
       {
         month++;
         day=0;
         monthL=lcd_sed[month%10];
         monthH=lcd_sed[month/10];
         if(month==12)
         {
           year++;
           month=0;
           yearL=lcd_sed[year%10];
           yearH=lcd_sed[year/10];
           if(year==99)
           {
             year=0;
           }
         }
        }
       }   
     }
    }
  }
}
附上我的程序[[/color]

一周热门 更多>