というわけで前置きが長くなりましたが、いよいよプログラムです。
まずは画像を画面いっぱいに表示したいと思います。
表示する画像はもちろんエムクリちゃんです。(ともともさんいつも使わせてくれてありがとう)
これをペイントで縮小して128×64の画面に収めてから、モノクロビットマップで出力します。
モノクロビットマップから数値データに変換する方法は、電子工作の実験室様の【グラフィック画面変換ツール】を使わせていただきました。ありがとうございます。。。
プログラムの手順は、動作原理で説明した通りなので省略して、プログラムだけを載せておきます。
LCDにエムクリちゃんは表示されましたか?されたら嬉しいです(僕が)
次は英語やら数字やら記号やら日本語やらの文字列を表示してみましょう→
まずは画像を画面いっぱいに表示したいと思います。
表示する画像はもちろんエムクリちゃんです。(ともともさんいつも使わせてくれてありがとう)
これをペイントで縮小して128×64の画面に収めてから、モノクロビットマップで出力します。
モノクロビットマップから数値データに変換する方法は、電子工作の実験室様の【グラフィック画面変換ツール】を使わせていただきました。ありがとうございます。。。
プログラムの手順は、動作原理で説明した通りなので省略して、プログラムだけを載せておきます。
//DDRで入力か出力かを設定(0入力:1出力) //PORTで内部プルアップ設定(1有効) //PINからデータを読み込む #define ON(pin) pin(PORT,|=) #define OFF(pin) pin(PORT,&=~) #define GET(pin) pin(PIN,&) #define FLIP(pin) pin(PIN,|=) #define IN(pin) pin(DDR,&=~) #define OUT(pin) pin(DDR,|=) #define PinB0(n,op) ((n ## B) op _BV(0)) #define PinB1(n,op) ((n ## B) op _BV(1)) #define PinB2(n,op) ((n ## B) op _BV(2)) #define PinB3(n,op) ((n ## B) op _BV(3)) #define PinB4(n,op) ((n ## B) op _BV(4)) #define PinB5(n,op) ((n ## B) op _BV(5)) #define PinB6(n,op) ((n ## B) op _BV(6)) #define PinB7(n,op) ((n ## B) op _BV(7)) #define PinC0(n,op) ((n ## C) op _BV(0)) #define PinC1(n,op) ((n ## C) op _BV(1)) #define PinC2(n,op) ((n ## C) op _BV(2)) #define PinC3(n,op) ((n ## C) op _BV(3)) #define PinC4(n,op) ((n ## C) op _BV(4)) #define PinC5(n,op) ((n ## C) op _BV(5)) // C6はリセット #define PinD0(n,op) ((n ## D) op _BV(0)) #define PinD1(n,op) ((n ## D) op _BV(1)) #define PinD2(n,op) ((n ## D) op _BV(2)) #define PinD3(n,op) ((n ## D) op _BV(3)) #define PinD4(n,op) ((n ## D) op _BV(4)) #define PinD5(n,op) ((n ## D) op _BV(5)) #define PinD6(n,op) ((n ## D) op _BV(6)) #define PinD7(n,op) ((n ## D) op _BV(7)) // 1番(C6)はリセット #define Pin2 PinD0 #define Pin3 PinD1 #define Pin4 PinD2 #define Pin5 PinD3 #define Pin6 PinD4 // 7番はVcc // 8番はGND #define Pin9 PinB6 #define Pin10 PinB7 #define Pin11 PinD5 #define Pin12 PinD6 #define Pin13 PinD7 #define Pin14 PinB0 #define Pin15 PinB1 #define Pin16 PinB2 #define Pin17 PinB3 #define Pin18 PinB4 #define Pin19 PinB5 // 20番はAVCC // 21番はAREF // 22番はGND #define Pin23 PinC0 #define Pin24 PinC1 #define Pin25 PinC2 #define Pin26 PinC3 #define Pin27 PinC4 #define Pin28 PinC5 //ピン接続 #define DB2 Pin4 #define DB3 Pin5 #define DB4 Pin6 #define DB5 Pin11 #define DB6 Pin12 #define DB7 Pin13 #define RS Pin17 #define RW Pin18 #define E Pin19 #define DB0 Pin23 #define DB1 Pin24 #define CS1 Pin25 #define CS2 Pin26 void SET(){ //出力設定 OUT(DB0); OUT(DB1); OUT(DB2); OUT(DB3); OUT(DB4); OUT(DB5); OUT(DB6); OUT(DB7); OUT(CS1); OUT(CS2); OUT(RS); OUT(RW); OUT(E); //初めは0V OFF(DB0); OFF(DB1); OFF(DB2); OFF(DB3); OFF(DB4); OFF(DB5); OFF(DB6); OFF(DB7); OFF(CS1); OFF(CS2); OFF(RS); OFF(RW); OFF(E); } //レジスタ設定のところをまとめた //基本的にRW:0 - Write , RW:1 - Read //またDI:0 - ステータス情報 , 1 - 表示データ関連 //制御コマンド(Write):表示位置などのコマンドを送る void RS_lcd_com_write(void) { OFF(RW); OFF(RS); } //表示データ(Write):グラフィックメモリに表示データを書き込む void RS_lcd_data_write(void) { OFF(RW); ON(RS); } //ステータス情報(Read):現在の動作情報を読み出す void RS_lcd_state_read(void) { ON(RW); OFF(RS); } //表示データ(Read):グラフィックメモリのデータを読み出す void RS_lcd_data_read(void) { ON(RW); ON(RS); } void D_ALL_IN(void) { IN(DB0); IN(DB1); IN(DB2); IN(DB3); IN(DB4); IN(DB5); IN(DB6); IN(DB7); } void D_ALL_OUT(void) { OUT(DB0); OUT(DB1); OUT(DB2); OUT(DB3); OUT(DB4); OUT(DB5); OUT(DB6); OUT(DB7); } //ビジー状態待機 void busywait(void) { D_ALL_IN(); RS_lcd_state_read(); ON(E); OFF(E); D_ALL_OUT(); RS_lcd_com_write(); } //左半分 void left(void) { ON(CS1); OFF(CS2); } //右半分 void right(void) { OFF(CS1); ON(CS2); } //ビットデータに数値を振り分け void D_inlet(uint8_t c) { if( ( c & 0x01 ) == 0x01 ){ON(DB0);} else{OFF(DB0);} if( ( c & 0x02 ) == 0x02 ){ON(DB1);} else{OFF(DB1);} if( ( c & 0x04 ) == 0x04 ){ON(DB2);} else{OFF(DB2);} if( ( c & 0x08 ) == 0x08 ){ON(DB3);} else{OFF(DB3);} if( ( c & 0x10 ) == 0x10 ){ON(DB4);} else{OFF(DB4);} if( ( c & 0x20 ) == 0x20 ){ON(DB5);} else{OFF(DB5);} if( ( c & 0x40 ) == 0x40 ){ON(DB6);} else{OFF(DB6);} if( ( c & 0x80 ) == 0x80 ){ON(DB7);} else{OFF(DB7);} } //LCD場所指定 void lcd_cmd(uint8_t c) { busywait(); RS_lcd_com_write(); D_inlet(c); ON(E); OFF(E); } //LCDにビットデータ書き込み void lcd_data(uint8_t c) { busywait(); RS_lcd_data_write(); D_inlet(c); ON(E); OFF(E); } //LCD場所指定(x軸とy軸の値まとめた) void lcd_locate(uint8_t x, uint8_t y) { lcd_cmd(0x40 | (x & 0x3f)); lcd_cmd(0xb8 | (y & 7)); } //LCD初期化 void lcd_init(void) { DDRC = 0xff; // リセット for(uint8_t matsu = 0; matsu < 255; matsu++) PORTC = 0x00; //ちょっと待つ left(); lcd_cmd(0xc0); lcd_cmd(0x3f); right(); lcd_cmd(0xc0); lcd_cmd(0x3f); } //絵を表示 void draw(const uint8_t *p) { for(y = 0; y < 8; y++){ //左半分描写 left(); lcd_locate(0, y); for(x = 0; x < 64; x++) lcd_data(~(pgm_read_byte(p++))); //右半分描写 right(); lcd_locate(0, y); for(x = 0; x < 64; x++) lcd_data(~(pgm_read_byte(p++))); //画像をツール使って変換したら、~(pgm_read_byte(p++))と反転させる } }
//エムクリちゃんの画像 const PROGMEM uint8_t M_cre_chan[128*8] = { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0xCF,0xF7,0xFB,0xFB,0xF3,0xF7,0xF7, 0xEF,0xEF,0x6F,0x7F,0x5F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, 0x7F,0x7F,0x7F,0x7F,0x7F,0xBF,0xBF,0xBF,0xBF,0xDF,0x9F,0xBF,0xDF,0xDF,0xDF,0xFF, 0xBF,0xBF,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xBE,0xB9,0x27,0x1F,0xF,0x7,0x3,0x1, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x3,0x7,0xF,0x3F,0x7F,0x7F,0x3F,0xFF, 0xDF,0xEF,0xFB,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0x1,0xFE,0xFF,0xFF,0xFF,0x3,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x80,0x0,0x0,0x0,0x80,0xF0,0xFC,0xFE,0xF8,0xC0,0x0,0x0,0xC0, 0xD8,0xC0,0x0,0x0,0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xF,0xFC,0xFB, 0xEF,0x9F,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x5F,0x5F,0x5F,0x1F,0xFF,0xFF, 0xBF,0xBF,0x3F,0x1F,0xBF,0x3F,0x7F,0x7F,0xFF,0xFF,0xFF,0x7F,0xBF,0xDF,0xFF,0xFF, 0xFF,0xFF,0x1F,0x1F,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF,0xBF,0xBF,0x1F,0xBF,0xBF,0xBF, 0xFF,0xFF,0xFF,0x7F,0x7F,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0x3F,0x9F,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0x7F,0xBF,0x3F,0x3F,0xBF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFE,0xF9,0xFF,0xFD,0xFD,0xF0,0xF8,0x0,0x0,0x0,0x0,0x0, 0x80,0xFE,0xB6,0xB3,0xF9,0xF8,0xF8,0xF9,0xFF,0x7F,0x7F,0x3F,0x3F,0x3E,0x3D,0x3C, 0x7C,0xFD,0xF8,0xF0,0xFF,0xFF,0x1E,0x0,0x0,0x0,0x0,0x0,0x0,0xE0,0xFE,0xFD, 0xFF,0xFB,0xF9,0xFE,0xFF,0xFF,0xFF,0xFF,0xE7,0xF3,0xF9,0xFC,0xF0,0xEF,0xEF,0xEF, 0xFD,0xFA,0xE0,0xEF,0xEF,0xEF,0xE1,0xFF,0xFF,0xFF,0xFC,0xF9,0xF3,0xE7,0xFF,0xFF, 0xFF,0xFF,0xFC,0xFC,0xF7,0xF3,0xF8,0xFF,0xFF,0xFF,0xFF,0xFC,0xEC,0xEE,0xE6,0xF0, 0xFF,0xFF,0xFD,0xFD,0xF8,0xE0,0xFA,0xFA,0xFD,0xFF,0xE1,0xFC,0xFE,0xF0,0xEF,0xE7, 0xF1,0xFF,0xF8,0xF2,0xF3,0xF8,0xEF,0xE7,0xF3,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x80,0x0,0x0, 0x1,0x3,0x7,0xEF,0xEF,0xFF,0xDF,0x1F,0x18,0x0,0x0,0x80,0x80,0x80,0xC0,0xC0, 0xC0,0xEF,0xF,0x7,0x3,0x21,0x30,0x0,0x0,0x0,0x0,0xC0,0x0,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF,0x47,0xAF,0xAF,0xF,0xA7,0xA7,0xF7, 0xFF,0xBF,0x97,0xD7,0xD7,0x87,0x3F,0xFF,0xFF,0x7,0x7F,0xDF,0xDF,0xDF,0x7,0xDF, 0xFF,0x7F,0xF,0xA7,0x3F,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFC,0xFC,0xE5,0x0,0x0,0x0,0x0,0x0,0x0,0x1E,0xFF,0xFF,0xFF,0x3F, 0xF,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x23,0x7F,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0xFC,0xFD,0xF8,0xFA,0xFC,0xFD,0xFF, 0xFF,0xFF,0xFF,0xF9,0xFD,0xFC,0xFE,0xFF,0xFF,0xFC,0xFE,0xFF,0xF9,0xFC,0xFE,0xFF, 0xFF,0xF8,0xFF,0xFF,0xFC,0xFB,0xF9,0xFC,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFD,0x3C,0xBC,0xFF,0x3C,0x3C,0xFF,0x3E,0x1C,0xFF,0x3D,0x3C, 0xBF,0xFF,0xFD,0xFD,0xFD,0x0,0xF0,0xF0,0xF0,0x0,0xE0,0xC0,0xC1,0xC7,0xC0,0xC0, 0xE0,0xE0,0xE0,0xC0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1, 0xF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0x8F,0xBF,0xAF,0xAF,0xAF,0xA0,0xA5,0x9D,0xFF,0xFA,0xF9,0xF1,0xF0,0x0,0x0,0x0, 0x1,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0xC0,0xF3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, };
#include <avr/io.h> #define F_CPU 8000000UL #include <avr/pgmspace.h> //PROGMEM用 //グローバル変数==================================== volatile int8_t x=0, y=0; //座標用 //================================================== #include "LCD_control.h" #include "picture.h" int main() { lcd_init(); SET(); //エムクリちゃんを永遠に表示 while(1) draw(M_cre_chan); }
LCDにエムクリちゃんは表示されましたか?されたら嬉しいです(僕が)
次は英語やら数字やら記号やら日本語やらの文字列を表示してみましょう→
コメントをかく