⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 colck-x41x.c

📁 里面包括很多的驱动程序的
💻 C
字号:
//#pragma  language=extended
#include "msp430x41x.h" 
//#include "turkynew.s43"
//***************************************************
//* 时钟程序version1.1
//* BLY
//*此程序是MSP430  C语言示范程序
//**********标号**************************************
#define     DSC            0X2
#define     DS1            0X1 //92H
#define     DS2            0X2
#define     DS3            0X8
#define     DS4            0X4
#define     SET_FUNCTION   0x8
#define     SET_ACTION     0x20
#define     SET_ALERT      0X80
#define     FALSE          0
#define     TRUE           1
//**********函数声明**********************************
void init_io(void);
void display(void);
void setuplcd(void);
void delay(long v);
void alarm(long t);
void disp(char a,int lcdmem);
void flashdisp(char b,int lcdadd);
//*****************************************************
//**********全局变量***********************************
typedef struct { 
                  char second;
                  char minute;
                  char hour;
               } TIME;
no_init TIME cur_time,set_time1,set_time2,adj_time;
int count; 
//int *look=&count;
char adjust=FALSE;
char flash,k,ALARMFLAG,count2;
volatile char h,flag;               
//*****************数码表*******************************
char table[17]={
    0xD7,         // displays "0"
    0x06,         // displays "1"
    0xE3,         // displays "2"
    0xA7,         // displays "3"
    0x36,         // displays "4"
    0xB5,         // displays "5"
    0xF5,         // displays "6"
    0x07,         // displays "7"
    0xF7,         // displays "8"
    0xB7,         // displays "9"
    0x77,         // displays "A"
    0xF4,         // displays "B"
    0xD1,         // displays "C"
    0xE6,         // displays "D"
    0xF1,         // displays "E"
    0x71,         // displays "F"
//    0x00,         // displays "灭零"
    };
    char b[]="Hello";
//***************************************************************
void main(void)
{ 
  int i;  
  WDTCTL=WDTPW+WDTHOLD;//终止看门构 
  FLL_CTL0|=XCAP14PF;
  init_io();
  TACTL=TASSEL0+MC0;   //增计数模式
  CCTL0=CCIE;
  CCR0=0x4000;
  for(i=0;i<7;i++)
  {
    LCDMEM[i]=0;
  }
  setuplcd();
  LCDMEM[0]=DSC;  
  alarm(10000);
//  set_time1.hour=8;
//  set_time1.minute=30;
  set_time2.hour=11;
  set_time2.minute=30;
  while(1)               
  { 
    P2IES=0XFF;
    P2IE|=0XC8; //三个中断:设定时间、 闹钟、清闹钟报警
    _EINT();
    //_OPC(0XC8);
    LPM3; 
  }
}
void setuplcd(void)
{
  LCDCTL=LCDON+LCD4MUX+LCDP0+LCDLOWR;//LCDCTL=3F
  BTCTL=BTFRFQ0+BTIP0+BTIP1+BTIP2;
  P5SEL=0XFC;
}  
void init_io(void)
{
  P1DIR=0xFF;
  P1OUT=0x22;
  P2OUT=0xff;
  P6DIR=0XFF;
  P6OUT=0X17;
}
interrupt [PORT2_VECTOR]void PORT2(void)
{ 
  if(P2IE&SET_FUNCTION)
  {
    if(P2IFG&SET_FUNCTION)      //调整时间
    {
        delay(3000);
        if(!(P2IN&SET_FUNCTION))   
        {    
            LCDMEM[1]=0;
            LCDMEM[1]|=0X34;  //显示"::"和"4"             
            adjust=TRUE;
            flag=1;           //调整标志  
            P2IE&=~SET_ALERT;
            switch(count2%4)
            {
              case 0:{ 
                       adj_time.hour=cur_time.hour;
                       disp(adj_time.hour,6);
                       P2IE|=SET_ACTION;
                       flash=TRUE;                        
                     }break;
              case 1:{
                       adj_time.minute=cur_time.minute;
                       disp(adj_time.hour,6);
                       flash=TRUE;
                     }break;
              case 2:{
                       adj_time.second=cur_time.second;
                       disp(adj_time.minute,4);
                       flash=TRUE; 
                     }break;
              default:{
                        count2=0xff;
                        cur_time.hour=adj_time.hour;
                        cur_time.minute=adj_time.minute;
                        cur_time.second=adj_time.second;                       
                        P2IE&=~SET_ACTION;
                        P2IE|=SET_ALERT; 
                        adjust=FALSE;
                        LCDMEM[1]&=~DS4;
                      }                                   
            } 
            count2++; 
        }    
    }
  }  
  if(P2IE&SET_ACTION)
  {
    if(P2IFG&SET_ACTION)
    { 
      flash=FALSE;
      switch(count2%4)
              {
                case 1:{ 
                         adj_time.hour++;
                         if(adj_time.hour>=24)
                         {
                           adj_time.hour=0;
                         }
                         disp(adj_time.hour,6);              
                       }break;
                case 2:{
                         adj_time.minute++;
                         if(adj_time.minute>=60)
                         {
                           adj_time.minute=0;
                         }
                         disp(adj_time.minute,4);
                       }break;
                case 3:{
                         adj_time.second++;
                         if(adj_time.second>=60)
                         {
                           adj_time.second=0;
                         }
                         disp(adj_time.second,2); 
                       }break;
                default:{
                          count2=0;
                          cur_time.hour=adj_time.hour;
                          cur_time.minute=adj_time.minute;
                          cur_time.second=adj_time.second;                       
                          P2IE&=~SET_ACTION; 
                          adjust=FALSE;
                          display();
                        }                                    
              }
    }
  }    
  if(P2IFG&0X40)    //关闹钟
  {
    ALARMFLAG^=1;
    if(!ALARMFLAG)
    {
      LCDMEM[1]|=DS1;
      LCDMEM[1]&=~(DS2+DS3+DS4);
    }
    else
    {
      LCDMEM[1]|=DS2;
      LCDMEM[1]&=~(DS1+DS3+DS4);
    }
  }
  if(P2IE&SET_ALERT) 
  {
    if(P2IFG&SET_ALERT)    //设闹钟
    {
      delay(2000);
      if(!(P2IN&SET_ALERT))
      {
        LCDMEM[1]=0;
        LCDMEM[1]|=0X38;  //显示"::"和"3"
        adjust=TRUE;
        flag=2;      //设闹钟标志  
        P2IE&=~SET_FUNCTION;
        switch(count2%4)
           {
             case 0:{ 
                      adj_time.hour=set_time1.hour;
                      disp(set_time1.hour,6);
                      disp(set_time1.minute,4);
                      disp(set_time1.second,2);
                      P2IE|=SET_ACTION;
                      flash=TRUE;                        
                    }break;
             case 1:{
                      adj_time.minute=set_time1.minute;
                      disp(adj_time.hour,6);
                      flash=TRUE;
                    }break;
             case 2:{
                      adj_time.second=set_time1.second;
                      disp(adj_time.minute,4);
                      flash=TRUE; 
                    }break;
             default:{
                       count2=0xff;
                       set_time1.hour=adj_time.hour;
                       set_time1.minute=adj_time.minute;
                       set_time1.second=adj_time.second;                       
                       P2IE&=~SET_ACTION;
                       P2IE|=SET_FUNCTION; 
                       adjust=FALSE;
                       LCDMEM[1]&=~DS3;
                     }                                   
           } 
           count2++;
      }     
    }
  }   
  P2IFG=0; 
}
//#pragma function=interrupt
//#pragma INTVEC=TIMERA0_VECTOR 
//[TIMERA0_VECTOR] void Timer(void)
interrupt [TIMERA0_VECTOR]void Timer(void)
{  
  count++;
  if(count%2)
  {
   cur_time.second++;
   if(cur_time.second>=60)
   {
     cur_time.second=0;
     cur_time.minute++;
     if(cur_time.minute>=60)
     {
       cur_time.minute=0;
       cur_time.hour++;
       if(cur_time.hour>=24)
       cur_time.hour=0;
     }
   }
  }
  if(!adjust)         
  {
    display();
    LCDMEM[1]^=0X30;
    if((cur_time.second==0)&&(cur_time.minute==0))     
    {
      h=cur_time.hour%12;
      if(!h)
      h=12;
      h*=2;
      h-=1;
    }  
    if(h)      
    { 
      h--;
      if(count%2)
      alarm(10000);  //整点报警    
    }           
    if(!ALARMFLAG)
    {
      if((cur_time.minute==set_time1.minute)&&(cur_time.hour==set_time1.hour))
      {alarm(10000);} //8:30报警
    }
    if(ALARMFLAG)
    {if((cur_time.minute==set_time2.minute)&&(cur_time.hour==set_time2.hour))
      {alarm(10000);} //11:30报警
    }  
  }
  else
  { if(flash)  //闪烁
    { k^=1;
      switch(count2%4)
      {
        case 1:{ 
                flashdisp(adj_time.hour,6);
               } break;
        case 2:{ 
                 flashdisp(adj_time.minute,4);
               } break;       
        case 3:{ 
                 flashdisp(adj_time.second,2);
               } break;        
      } 
    }  
  }  
}   
#pragma function=default
void alarm(long t)
{
  P6OUT|=0x80;
  delay(t);
  P6OUT&=0X7F;
} 
void delay(long v)
{
  while(v!=0)v--;
}
void flashdisp(char b,int lcdadd)
{
   if(k)
   disp(b,lcdadd);
   else
  {
    LCDMEM[lcdadd]=0;
    LCDMEM[lcdadd+1]=0;
  }
}
void disp(char a,int lcdmem)
{ 
    LCDMEM[lcdmem]=table[a%10];
    LCDMEM[lcdmem+1]=table[a/10];
}
void display(void)
{
 LCDMEM[2]=table[cur_time.second%10];
 LCDMEM[3]=table[cur_time.second/10];
 LCDMEM[4]=table[cur_time.minute%10];
 LCDMEM[5]=table[cur_time.minute/10];
 LCDMEM[6]=table[cur_time.hour%10];
 LCDMEM[7]=table[cur_time.hour/10];
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -