怎样用msp430f5529设计一个万年历或改编下列的程序..

2019-07-15 16:49发布

#include "msp430x44x.h"//******定义子程序******void Init_Sys(void);            //初始化子程序void LEAP(void);               //判断闰年子程序void MAX(void);                //天数判断子程序void DISPLY(void);             //显示子程序void RTC(void);                //实时时钟程序void DIS_BIT(void);            //送显缓子程序void DLY_5ms(void);            //延时子程序unsigned char KEY_SET(void);   //返回按键标志0,1,2,3void DISPLY_Normal(void);void DISPLY_SETmin(void);void DISPLY_SEThour(void);void DISPLY_SETday(void);void DISPLY_SETmonth(void);void DISPLY_SETyear(void);//*****定义变量******** unsigned char max;         //当月最大的天数unsigned char sec=0;unsigned char min=35; unsigned char hour=13;unsigned char day=10;unsigned char month=2;unsigned int year=2011;unsigned char leap;      //闰年标志,1为闰年,0为平年unsigned char fct=0;      //功能标志,0显示时钟,1显示年月,2~6分别调整分、时、日、月、年unsigned char led_bit[6];     //led显示缓存unsigned char key_flag;               //按键是否按下标志,0为按下,1没有按下unsigned int dis_num;                //显示循环次数// LED显示代码LEDconst unsigned char LED_TAB[]={       0xd7,0x14,0xcd,0x5d,0x1e,           //0,1,2,3,4,    0x5b,0xdb,0x15,0xdf,0x5f,0X00       //5,6,7,8,9,灭标志符};//******主程序**********void main( void ){  Init_Sys();   _EINT();  while(1)  {     RTC();             //时钟处理程序    KEY_SET();        //返回key_flag,0没有按下,1功能键,2加1键,3减1键    if(key_flag==1)    {     fct++;     if (fct>=7)fct=0;    }     DIS_BIT();                       //将需要显示的字符送入显示缓存dis_bit[]    switch(fct)                  {    case 0:DISPLY_Normal();break;     //正常显示日时分    case 1:DISPLY_Normal();break;     //正常显示年月    case 2:DISPLY_SETyear();break;     //    case 3:DISPLY_SETmonth();break;    //    case 4:DISPLY_SETday();break;      //    case 5:DISPLY_SEThour();break;     //    case 6:DISPLY_SETmin();break;     //闪烁显示分,若key_flag=2,分加1,若=3,分减1    default:      {        fct=0;        TACTL|=TAIE;                //退出时间调整状态,开启TA中断        break;      }    }       }}//======================//****定时器中断****//**********************#pragma vector=tiMERA1_VECTOR__interrupt void TimerA1(void){  TACTL&=~TAIFG;  sec++;  P1OUT^=BIT0;}//=====================//***实时时钟子程序****//*********************void RTC(void)                                         {   if(sec>=60)  {    min++;    sec-=60;     if(min>=60)     {      hour++;      min=0;    if(hour>=24)    {      day++;       hour=0;      MAX();      if(day>=max+1)      {        month++;        day=1;         if(month>=13)        {          year++;          month=1;        }      }       }    }  }} //=====================//***闰年判断子程序****//***闰年leap=1,平年leap=0//*********************void LEAP(void){  if(year%4==0)  {    if(year%100==0)    {      if(year%400==0)        leap=1;      else        leap=0;    }    else      leap=1;  }  else    leap=0;    }//========================//*****天数判断子程序*****//**功能:判断当月天数max**//************************void MAX(void){  LEAP();  if((month==4)||(month==6)||(month==9)||(month==11))     max=30;  else if((month==2))  {    if(leap==1)      max=29;    else      max=28;  }  else    max=31;} //=====================//****送显示位子程序***//*********************void DIS_BIT(void){  if ((fct==0)||(fct==4)||(fct==5)||(fct==6))  {    led_bit[0]=min%10;    led_bit[1]=min/10;    led_bit[2]=hour%10;    led_bit[3]=hour/10;    led_bit[4]=day%10;    led_bit[5]=day/10;   }  else  {    led_bit[0]=month%10;    led_bit[1]=month/10;    led_bit[2]=year%10;    led_bit[3]=(year%100)/10;    led_bit[4]=(year%1000)/100;    led_bit[5]=year/1000;       }}//=====================/******显示子程序*******//*********************/void DISPLY(void){  unsigned char idis=0;  unsigned int wei=0x20;          //0010 0000  while(idis<=5)  {     P3OUT=LED_TAB[led_bit[idis]];       P4OUT|=BIT1;                  //开启寄存器送显示字符码    P4OUT&=~BIT1;                 //禁止段选寄存器输入    P3OUT =~wei;                 //1101 1111 共阴极数码管     P4OUT|=BIT0;                //开启寄存器送位选    P4OUT&=~BIT0;                //禁止位选寄存器输入    wei>>=1;                      //位选左移1位    DLY_5ms();     /////消鬼影//////    P3OUT =0xff;    P4OUT|=BIT0;                //开启寄存器送位选    P4OUT&=~BIT0;                //禁止位选寄存器输入    idis++;    }}//////1310*4/(32*32768)*1000约为5ms//////////for语句,判断为3个机周,减1为2个机周///void DLY_5ms(void){  unsigned int idly1;  for(idly1=1000;idly1>=1;idly1--); }//////////////////unsigned char KEY_SET(void)////按下功能键,key_flag=1退出,按下加1键,key_flag=2退出,//按下减1键,key_flag=3退出,没有按下,则key_flag=0////////////{  if((P1IN&BIT1)==0)       //扫描P1.1功能键是否按下,按下为0  {    //DLY_5ms();          //延时消斗    if((P1IN&BIT1)==0)      key_flag=1;  }  else if((P1IN&BIT2)==0)  //扫描P1.2加1键是否按下,按下为0  {   // DLY_5ms();          //延时消斗    if((P1IN&BIT2)==0)       key_flag=2;  }     else if((P1IN&BIT3)==0)  //扫描P1.3减1键是否按下,按下为0  {    //DLY_5ms();          //延时消斗    if((P1IN&BIT3)==0)       key_flag=3;  }   else key_flag=0;  return key_flag;}//////////初始化/////////////void Init_Sys(void){  WDTCTL = WDTPW + WDTHOLD;             //关闭看门狗  FLL_CTL0|=XCAP14PF;  TACTL=MC_1+TASSEL_1+TAIE+TACLR;      //Up模式,计数器中断使能,ACLK=32k  TACCR0=32767;                        //定时1s  P3OUT=LED_TAB[10];  P3DIR=0Xff;                          //IO口初始化  P4DIR|=BIT0+BIT1;  P1DIR&=(~BIT1)+(~BIT2)+(~BIT3);       //P1.1功能键,P1.2加1键,P1.3减1键  P1DIR|=BIT0;  LEAP();  MAX();}////////////各种状态下的显示子程序////////////////////void DISPLY_Normal(void){  TACTL|=TAIE;  P5DIR|=BIT1;  dis_num=0;  while(dis_num<=50)  {    DISPLY();    dis_num++;  }  ////////////////  P5OUT^=BIT1;   //测试频率  /////////////////////}///////分设置子程序///////////////闪烁间隔时间:5*6*16约为500ms///////////此处用30*20=600ms,及1.2s扫描一次按键////void DISPLY_SETmin(void){  KEY_SET();              if(key_flag==2)  {    min++;    if(min==60)min=0;  }  else if(key_flag==3)  {    if(min==0)min=59;    else min--;  }  led_bit[0]=min%10;  led_bit[1]=min/10;  for(dis_num=0;dis_num<=20;dis_num++)  {    DISPLY();   }  led_bit[0]=10;  led_bit[1]=10;  for(dis_num=0;dis_num<=20;dis_num++)    {     DISPLY();    }}/////////////////////////////void DISPLY_SEThour(void){  KEY_SET();              if(key_flag==2)  {    hour++;    if(hour>=24)hour=0;  }  else if(key_flag==3)  {    if(hour==0)hour=23;    else hour--;  }  led_bit[2]=hour%10;  led_bit[3]=hour/10;  for(dis_num=0;dis_num<=20;dis_num++)  {    DISPLY();   }  led_bit[2]=10;  led_bit[3]=10;  for(dis_num=0;dis_num<=20;dis_num++)    {     DISPLY();    }}//////////////////////////////void DISPLY_SETday(void){  MAX();  KEY_SET();              if(key_flag==2)  {    day++;    if(day>max)day=1;  }  else if(key_flag==3)  {    if(day==1)day=max;    else day--;  }  led_bit[4]=day%10;  led_bit[5]=day/10;  for(dis_num=0;dis_num<=20;dis_num++)  {    DISPLY();   }  led_bit[4]=10;  led_bit[5]=10;  for(dis_num=0;dis_num<=20;dis_num++)    {     DISPLY();    }}/////////////////////////////void DISPLY_SETmonth(void){  KEY_SET();              if(key_flag==2)  {    month++;    if(month>12)min=1;  }  else if(key_flag==3)  {    if(month==1)month=12;    else month--;  }  led_bit[0]=month%10;  led_bit[1]=month/10;  for(dis_num=0;dis_num<=20;dis_num++)  {    DISPLY();   }  led_bit[0]=10;  led_bit[1]=10;  for(dis_num=0;dis_num<=20;dis_num++)    {     DISPLY();    }}////////////////////////////void DISPLY_SETyear(void){  TACTL&=(~TAIE);       //进入时间调整状态,关闭TA中断  KEY_SET();              if(key_flag==2)  {    year++;  }  else if(key_flag==3)  {    year--;  }   led_bit[2]=year%10;   led_bit[3]=(year%100)/10;   led_bit[4]=(year%1000)/100;   led_bit[5]=year/1000;  for(dis_num=0;dis_num<=20;dis_num++)  {    DISPLY();   }  led_bit[2]=10;  led_bit[3]=10;  led_bit[4]=10;  led_bit[5]=10;  for(dis_num=0;dis_num<=20;dis_num++)    {     DISPLY();    } }           
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。