#include "msp430x44x.h " //------------------------------------------------------------- //MSP-Test44x Demo lcd ,led dishplay the timer // // MSP430F449 // ----------------- // /|\| XIN|- // | | | 74HC373(1)&(2) // LCD --|RST XOUT|- ------------- // ---------- | | | | // | COM0|<---|COM0 P3.1|------>|D0 | // | . | . | . . | . | | // | COM3|<---|COM3 P3.7|------>|D7 | // | S0 |<---|S0 P4.0|------>| | // | . | . | P4.1|------>| | // | S14|<---|S14 P1.3|------>INC // P1.2|------>DEC // P1.1|------>FUN // Yang Rui // Lierda, Inc // February 2004 // Built with IAR Embedded Workbench Version: 1.26B //--------------------------------------------------------- static unsigned char sec; //秒寄存器 static unsigned char min; //分寄存器 static unsigned char hour; //小时寄存器 static unsigned char led_disp_bit=0x40;//LED显示位寄存器 static unsigned char fun_buffer; //功能键缓存 static unsigned char key_flag; //按键标志 unsigned char key_temp; //按键时间累加 //---------------------------------------------------------- #define key_inc 0x08 //INC键定义 #define key_dec 0x04 //DEC键定义 #define key_fun 0x02 //FUN键定义 const unsigned char lcd_table[12]={ 0x7b, //*"0"*// 0x12, //*"1"*// 0x4f, //*"2"*// 0x1f, //*"3"*// //LCD显示代码表 0x36, //*"4"*// 0x3d, //*"5"*// 0x7d, //*"6"*// 0x13, //*"7"*// 0x7f, //*"8"*// 0x3f, //*"9"*// 0x00, //*"no"*// 0x00, //*"no"*// }; const unsigned char led_table[12]={ 0xd7, //*"0"*// 0x14, //*"1"*// 0xcd, //*"2"*// 0x5d, //*"3"*// //LED显示代码 0x1e, //*"4"*// 0x5b, //*"5"*// 0xdb, //*"6"*// 0x15, //*"7"*// 0xdf, //*"8"*// 0x5f, //*"9"*// 0x00, //*"no"*// 0x00, //*"no"*// }; void rtc(void); void display_rtc(void); void display_dec(unsigned char i,unsigned char j); void led_display(unsigned char i); void inc(void); void dec(void); void fun(void); //------------------------------------------------------------- //---------------主程序---------------------------------------- //------------------------------------------------------------- void main(void) { int i; WDTCTL = WDTPW + WDTHOLD; BTCTL=BTSSEL+BT_ADLY_500+BTFRFQ1; //BT 0.5S中断 IE2|=BTIE; P5SEL=0xfc; LCDCTL=LCDON+LCD4MUX+LCDP2; //LCD模块初始化 P1DIR&=~key_inc+key_dec+key_fun; //端口1初始化 P1IES=key_inc+key_dec+key_fun; P1IE=key_inc+key_dec+key_fun; P3DIR=0xff; //端口3初始化 P4DIR=0x03; //端口4初始化 P3OUT=0x00; //LED清屏 P4OUT|=0x02; P4OUT&=~0x02; P3OUT=0xff; P4OUT|=0x01; P4OUT&=~0x01; TACTL=TASSEL0+TACLR; //Timer_a 3ms中断 CCTL0=CCIE; CCR0=90; TACTL|=MC0; for (i=0; i<8; ++i) //LCD 清屏 LCDMEM[i] = 0x00; _EINT(); //允许中断 //*mainloop*// for(;;) { _BIS_SR(LPM3_bits); //进入低功耗模式3 _NOP(); //key value// //按键处理程序 _EINT(); switch (P1IN&0x0e) { case 6:inc();break; case 10:dec();break; case 12:fun(); } } } //------------------------------------------------------ // Basic Timer interrupt service routine interrupt[BASICTIMER_VECTOR] void basic_timer(void) { rtc(); //时钟处理 display_rtc(); //时钟LCD显示 } //------------------------------------------------------ // Timer_A interrupt service routine interrupt[TIMERA0_VECTOR] void Timer_A (void) { if(key_flag) { if (key_flag==8) { key_flag=0x00; if(0x0e!=(P1IN&0x0e)) _BIC_SR_IRQ(LPM3_bits); //延时,键盘去抖动,确认按键的有效性,有效,退出低功耗,按键处理 } else key_flag++; } led_disp_bit=led_disp_bit>0x01?led_disp_bit>>1:0x40; //LED显示处理 switch(led_disp_bit) //选择led的刷新位//3ms刷新一位 { case 1:if(sec&0x01&&fun_buffer==1) //选择是否抖动,如果需要抖动,相应的LED位为0, led_display(0x00); //如果不需要抖动,则正常显示 else led_display(led_table[hour/10]);break; case 2:if(sec&0x01&&fun_buffer==1) led_display(0x00); else led_display(led_table[hour%10]+0x20);break; case 4:if(sec&0x01&&fun_buffer==2) led_display(0x00); else led_display(led_table[min/10]);break; case 8:if(sec&0x01&&fun_buffer==2) led_display(0x00); else led_display(led_table[min%10]+0x20);break; case 16:if(sec&0x01&&fun_buffer==3) led_display(0x00); else led_display(led_table[(sec>>1)/10]);break; case 32:if(sec&0x01&&fun_buffer==3) led_display(0x00); else led_display(led_table[(sec>>1)%10]); } } //------------------------------------------------------ //PORT_1 interrupt service routine interrupt[PORT1_VECTOR] void Port_1(void) //如果有按键按下,设按键按下标志 { key_flag|=0x01; P1IFG=0x00; } //------------------------------------------------------- //-------时钟处理程序------------------------------------ //------------------------------------------------------- void rtc (void) { if (++sec < 120) return; sec = 0; if (++min < 60) return; min = 0; if (++hour < 24) return; hour = 0; } //-------------------------------------------------------- //--------时钟LCD显示程序--------------------------------- //-------------------------------------------------------- void display_rtc(void) { int i; i=sec; i=i>>1; display_dec(0,i); i=min; display_dec(2,i); i=hour; display_dec(4,i); LCDMEM[6]=0x00; } //-------------------------------------------------------- //--------LCD显示处理程序--------------------------------- //-------------------------------------------------------- void display_dec(unsigned char i,unsigned char j) { LCDMEM[i]=lcd_table[j%10]+0x80; LCDMEM[i+1]=lcd_table[j/10]; } //-------------------------------------------------------- //-------LED 1位显示程序---------------------------------- //-------I 为显示代码值----------------------------------- void led_display(unsigned char i) { P3OUT=i; P4OUT=0x02; P4OUT&=~0x02; P3OUT=~led_disp_bit; P4OUT=0x01; P4OUT&=~0x01; P3OUT=0x00; } //-------------------------------------------------------- //-------INC 按键处理程序--------------------------------- //-------------------------------------------------------- void inc (void) { switch (fun_buffer) { case 0:break; case 3:sec+=2;goto rtc_inc; case 2: min+=1;goto rtc_inc; case 1: hour+=1; rtc_inc: if (sec >119) sec = sec-120; if (min >59) min = min-60; if (hour > 23) hour = hour-24; } } //--------------------------------------------------------- //--------DEC 按键处理程序--------------------------------- //--------------------------------------------------------- void dec(void) { switch (fun_buffer) { case 0:break; case 3:sec-=2;goto rtc_dec; case 2:min-=1;goto rtc_dec; case 1:hour-=1; rtc_dec: if(sec>119) sec=256-137; if(min>59) min=256-197; if(hour>23) hour=256-233; } } //--------------------------------------------------------- //-------FUN 按键处理程序---------------------------------- //--------------------------------------------------------- void fun(void) { if(fun_buffer<3) fun_buffer++; else fun_buffer=0x00; }