//#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]; }