マイコンでテキスト文字以外のデータを表示したいときももちろんあります。しかしPIC16FマイコンでのグラフィックLCDの取り扱いは少々難がありメモリーを多く必要とします。サンプルのソースでは画面半分のデータを用意し、同じデータをもう半分にも表示させています。よって、実際には画面データを作りながら表示させたり、EEPROMに文字などのキャラクタを登録しておき、読み込みながら表示させるなどの工夫が必要です。
使用機器は下記のとおり。他、パソコンや電源、PICKIT2も当然ながら必要です。
バックライト付グラフィック液晶表示器Sunlike Display Tech. Corp. SG12864Aマイコンボード(PIC16F1947搭載)ZEATEC co.,ltd. ZT-PIC16F194701(5V仕様)
プロジェクトファイルも含めたサンプル zt-pic16f194701_sg12864a.zip
開発環境:MPLAB_IDE_8_92 + CCS-C PCMコンパイラVer.4.132
sg12864a_outの関数にデータと表示CS番号、データかコマンドかの識別番号を用意して実行すると事前に指定した場所に表示されます。場所の指定はページと列と行があり、ページは8までの数字、行や列は0~63までの数字を加算する事で任意の場所を指定することが出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//表示データ送信 void sg12864a_write(int *display_data){ int tmp_cs = 1; int tmp_x = 0; long tmp_y = 0; for(tmp_cs=1;tmp_cs<3;tmp_cs++){ for(tmp_y=0;tmp_y<8;tmp_y++){ sg12864a_out((0xb8+tmp_y),tmp_cs,0);//Page set plus 0 to 7 sg12864a_out(0x40,tmp_cs,0);//Start column 0. plus 0 to 63 sg12864a_out(0xc0,tmp_cs,0);//Start line 0. plus 0 to 63 for(tmp_x=0;tmp_x<8;tmp_x++){ sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)],tmp_cs,1); sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+1],tmp_cs,1); sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+2],tmp_cs,1); sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+3],tmp_cs,1); sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+4],tmp_cs,1); sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+5],tmp_cs,1); sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+6],tmp_cs,1); sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+7],tmp_cs,1); } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
//LCDを初期化 void sg12864a_ini(){ //初期値 output_bit(PIN_E4,0);// D/I Hで表示データ Lで制御コード output_bit(PIN_E5,1);// E 立下りでコードの読み込み output_bit(PIN_E6,1);// CS1 Hレベルで左半分を選択 output_bit(PIN_E7,0);// CS2 Hレベルで右半分を選択 sg12864a_out(0x3f,1,0);//Display1 on. sg12864a_out(0x3f,2,0);//Display2 on. delay_us(10); } //LCDへデータ・コマンド送信 void sg12864a_out(int data,int chip,int flag){ if(flag == 0){ //コマンドの場合 output_bit(PIN_E4,0); }else{ //データの場合 output_bit(PIN_E4,1); } if(chip == 1){ //CS1を有効 output_bit(PIN_E6,1); output_bit(PIN_E7,0); }else{ //CS2を有効 output_bit(PIN_E6,0); output_bit(PIN_E7,1); } //データ出力 output_f(data); //H→Lでデータ適用 output_bit(PIN_E5,1); output_bit(PIN_E5,0); output_bit(PIN_E5,1); delay_us(1); } |
©ZEATEC co.,ltd.