はじめてのPICマイコン - LCD表示 1 -
マイコンで電子工作といえばPICマイコンが有名。
昔勉強しようと買ったPICマイコンがあるのを思い出したから
気晴らしに遊んでみた。
LCDに文字を表示するだけに2日もかかってしまった。
回路図は以下
プログラムは今更アセンブリは・・・
と思いC言語にしてみた。(アセンブリの方が良かったかも・・・)
コードは以下
0を3つ表示するだけ
// ファイル名 LCD_test1.c // 作成日 2012/09/08 // 機種 PIC16F84A // CLOCK 4MHz // コンパイラ MPLAB XC8 // //PortA bit0 ----- LCD RS pin //PortA bit1 ----- LCD E pin // //PortB bit4 ----- LCD 11pin //PortB bit5 ----- LCD 12pin //PortB bit6 ----- LCD 13pin //PortB bit7 ----- LCD 14pin #include "pic.h" __CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & CP_OFF ); //LCD制御ポート #define RS_P(x) PORTA = (PORTA & (0xFE)) | (x) #define E_P(x) PORTA = (PORTA & (0xFD)) | (x << 1) // ---------------- 1ms Wait ---------------- static void Delay_1ms() { unsigned int cnt; unsigned int i; cnt = 51;//51@4MHz for (i=0 ; i<cnt ; i++) { NOP(); } } // ---------------- 100us Wait ---------------- static void Delay_100us() { unsigned int cnt; unsigned int i; cnt = 4; //NOP 1us + for 2us @ 4MHz for (i=0 ; i<cnt ; i++) { NOP(); } } // ---------------- n ms Wait ---------------- static void Delay_ms(unsigned char ms) { unsigned char c; for (c=ms ; c>0 ; c--) { Delay_1ms(); } } static void write4(unsigned char dat) { PORTB = ( dat << 4 ); E_P(0x1); E_P(0x0); //10MHz以上で間にNOPを入れる。 } // ---------------- main処理 ---------------- main() { unsigned char loop; TRISA = 0x0; TRISB = 0x0; PORTA = 0x00; PORTB = 0x00; //本処理 Delay_ms(15); //電源ON後15ms Wait write4(0x3); Delay_ms(10); write4(0x3); Delay_ms(5); write4(0x3); Delay_100us(); write4(0x2); //4bit mode Delay_100us(); //Function Set (2行表示) write4(0x2); write4(0x8); Delay_100us(); //LCD表示ON write4(0x0); write4(0xC); Delay_100us(); //ディスプレイクリア write4(0x0); write4(0x1); Delay_ms(2); //Entry Mode Set(カーソル右移動、文字シフトなし) write4(0x0); write4(0x6); Delay_100us(); //ディスプレイクリア write4(0x0); write4(0x1); Delay_ms(2); for (loop=3 ; loop > 0 ; loop--) { Delay_100us(); RS_P(0x1); write4(0x3); //'0'表示 write4(0x0); RS_P(0x0); } while(1){ NOP(); } }
C言語で書くとポーリング時間や処理時間の推測が難しい。
ポーリング時間はロジアナ見ながら大体合うように調整。
やったね!