おいおい、またLCDか?、、て言わないで。LCDが一番わかりやすい、動作が目に見えるし。。。
今回使ったのは、有る所から入手した4bit転送のLCDでした。初期化とか説明書通り。
気をつける必要があるのは、「MSP430の電源は上限3.3V(公称)」と言う事。PICの様に5Vでも3Vでもというわけには行かず、LCDを5V品にすると、LDOなんぞが必要になる。
コアクロックはデフォルトの内部クロック、1MHz。
void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P1SEL = 0x00; P1SEL2= 0x00; P1DIR = 0x01; // Set P1.0 to output direction P1OUT = 0x38; P1REN = 0x38; // Set 出力HしてからRENをセットするとPullUpになる模様 P2DIR |= 0x3F; // Set P2 Out ---- LCD初期化し表示(省略) ---- lcd_puts("LCD Watch");
SWを3つ、P1に割り振る。
// Pi interrupt enable P1IE = 0x38; P1IES = 0x38; // P1.3-5 エッジ割り込みH->L P1IFG &= ‾0x38; // P1.3-5 割り込みフラグクリア
タイマを外部の低周波数CLK、ACLKだったかな、にする。ここに、32768Hzの水晶振動子を付けて、15bitカウントしたら時計を1秒進ませる。
// Timer A setting TACTL = TASSEL_1 + MC_1 ;// ACLK, up to ccr, interrupt TACCR0 = 32768; // キャプチャ コンペアの値 TACCTL0 |= CCIE; // enable interrupt
ここまで書いたら、割り込み有効で、LPM3モード(ACLKのみ生きてて、MCLKもCPUもsleepしている)へ移行する。下記一文でその場で停止。後は割り込み処理で動作を継続する。
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/interrupt
ちなみに、LPM4はACLKまですべてのCLKとCPUが停止するモードで、外部割り込みのみresumeできる。
//A0_VECTOR : Timer0_A CC0 #pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A (void) { jikan += 1; // 1秒進める。jikanは秒数で、24時間を考慮してlongで定義 if(jikan==86400)jikan=0;// 24:00:00 → 00:00:00 ここに時計データの表示処理が入る。 }
// Port 1 interrupt service routine #pragma vector=PORT1_VECTOR __interrupt void Port_1(void) { P1IFG &= ‾0x38; // P1.4 IFG cleared ポート処理を入れる。 }