求助各位大神,给初学者指导一下

2019-03-24 11:50发布

小妹是刚刚接触430的初学者,SOS
想做一个电子时钟,MSP430F437上,FET仿真器,液晶屏是定制的,现在做的程度是能在LCD上每秒增加,秒满60进分,分满60进小时这样的。想增加一个设置时间的功能,碍于中断了解不是很懂,程序加上我main里面的anjian()之前每秒在跑的就停止了,不知如何往下做,求指导


加红部分是自己瞎写的地方,不知如何改可以设置时间
想要的功能是 K1键为功能键,按一下移动到秒的个位上——闪烁提示可以修改,再按就往秒十位移动,以此类推
                      K2、K3配合K1使用                       K2为减               K3为加


附上已写乱七八糟的代码


#include<msp430x43x.h>

#define uint unsigned int
#define uchar unsigned char

uchar table[]={0XAF,0XA0,0XCB,0XE9,0XE4,0X6D,0X6F,0XA8,0XEF,0XED};
uchar numxiaoshi,numfenzhong,nummiao,xiaoshishi,xiaoshige,fenzhongshi,fenzhongge,miaoshi,miaoge,keybuf;
void delayms(uint z)//延时函数
{
  uint i,j;
  for(i=z;i>0;i--)
    for(j=110;j>0;j--);
}
void display()//显示函数
{
  //以下4行显示小时
  LCDMEM[1]=table[xiaoshishi];
  delayms(10);
  LCDMEM[2]=table[xiaoshige];
  delayms(10);
  //以下4行显示分钟
  LCDMEM[3]=table[fenzhongshi];
  delayms(10);
  LCDMEM[4]=table[fenzhongge];
  delayms(10);
  //以下4行显示秒
  LCDMEM[6]=table[miaoshi];
  delayms(10);
  LCDMEM[7]=table[miaoge];
  delayms(10);
}
void init()//定时器A初始化
{
  WDTCTL=WDTPW+WDTHOLD;
  P3DIR=0x00;
  P4DIR=0xff;
  P5DIR=0xff;

  P2DIR=0xff;
  P3SEL=0;

  P2SEL=0;
  P4SEL=0;
  P5SEL=0;
  //BCSCTL1=CALBC1_1MHZ;
  //DCOCTL=CALBC1_1MHZ;
  //TACTL=TASSEL_2+MC_3+ID_3;
  TACTL|=TASSEL0+MC0;
  CCTL0=CCIE;
  CCR0=32768;
  _EINT();
}
void init_lcd (void)
{
   int j;
   FLL_CTL0|=XCAP14PF;
   BTCTL=BTDIV+BT_fCLK2_DIV4;
   LCDCTL=LCDON+LCD4MUX+LCDP2;
   BTCTL|=BTFRFQ1;
   P5SEL=0XFC;
   for(j=0;j<14;j++)
  {
    LCDMEM[j]=0;
  }

}
/************端口P1初始化,设置时间*****K3/P1.0   K2/P1.3   K1/P1.4 ****/
void anjian()                  
{                                       
  P1DIR|=0X00;                 // 设置P1.0 P1.3 P1.4 为输入方向
  P1IE|=0X19;                 // 设置P1.0 P1.3 P1.4 可以中断
  P1IES|=0X19;                 // 设置P1.0 P1.3 P1.4 为下降沿中断
  P1IFG&=~0X19;
  _EINT();
  while(1)
  {
    if(keybuf==0) //如果按键为K1
     {
       delayms(10);
       if(keybuf==0)
       {
         while(!(P1IN==0x19));
            _DINT();
         while(1)
         {
           miaoshi=nummiao/10;
           miaoge=nummiao%10;
           fenzhongshi=numfenzhong/10;
           fenzhongge=numfenzhong%10;
           xiaoshishi=numxiaoshi/10;
           xiaoshige=numxiaoshi%10;
           display();
           if(keybuf==1)
           {
             delayms(10);
             if(keybuf==1)
             {
               while(!(P1IN==0x19));
               nummiao++;
               if(nummiao>59)
                 nummiao=0;
             }
           }
           if(keybuf==2)
           {
             delayms(10);
             if(keybuf==2)
             {
               while(!(P1IN==0x19));
               numfenzhong++;
               if(numfenzhong>59)
                 numfenzhong=0;
             }
           }
           /*if(P1IN==0x01)
           {
             delayms(10);
             if(P1IN==0x01)
             {
               while(!(P1IN==0x19));
               numxiaoshi++;
               if(numxiaoshi>23)
                 numxiaoshi=0;
             }
           }*/
           if(keybuf==0)
           {
             delayms(10);
             if(keybuf==0)
             {
               while(!(P1IN==0x19));
               _EINT();
               break;
              }
            }
          }
        }
       }
  }
  
}
unsigned char keycode()
{
  unsigned char x;
  if((P1IN&0x19)== 0x09) // 是否第一个按键K1   
  {
    delayms(10);
    if((P1IN&0x19)== 0x09)
      x=0;
  }
  else
  if((P1IN&0x19)== 0x11) // 是否第二个按键K2
  {
     delayms(10);
     if((P1IN&0x19)== 0x11)
       x=1;
  }
  else
  if((P1IN&0x19)== 0x18) // 是否第三个按键K3
  {
     delayms(10);
     if((P1IN&0x19)== 0x18)
      x=2;
  }
  return(x);
}
void main(void)
{
  init();
  init_lcd();

  while(1)
  {   
    //anjian();                           /*****设置时间*****/
    miaoshi=nummiao/10;
    miaoge=nummiao%10;
    fenzhongshi=numfenzhong/10;
    fenzhongge=numfenzhong%10;
    xiaoshishi=numxiaoshi/10;
    xiaoshige=numxiaoshi%10;

    LCDMEM[5]=0x32;   
    display();
  }
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A()
{
  nummiao++;
  LCDMEM[5]=0x00;
  if(nummiao>59)
  {
    nummiao=0;
    numfenzhong++;
  }
  if(numfenzhong>59)
  {
    numfenzhong=0;
    numxiaoshi++;
  }
  if(numxiaoshi>23)
  {
    numxiaoshi=0;
  }   
}
/******************P1中断*********************************/
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{ //端口1 的中断服务程序
  P1IFG&=~0X19;
  while((P1IN&0X19)!=0x19) //没有按键按下,返回全1――0x19
  {
    delayms(50); //延时消除抖动
    while((P1IN&0X19)!=0x19)
    {
       keybuf = keycode();
      while((P1IN&0X19)==0); //等待按键松开   
    }
  }
  //_BIC_SR_IRQ(LPM3_bits);
}

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
youki12345
2019-03-24 16:54
< 这个太长了吧,建议把流程图画出来,然后再看

一周热门 更多>

相关问题

    相关文章