RaspberryPiからaitendoのLCD[C128X64SPI-12P]への文字表示 (2) - 解説
前記事の解説・補足です。
LCDモジュールの組み立て
商品ページの通りに組み立てれば問題ないです。このときLCDの向きに注意してください。ディスプレイの下に小っちゃい長方形が付いている面が表です。
裏のパターンを見ると丸っこい模様付きのパッドが4つ、カクカクした模様付きのパッドが1つあります。前者がチップコンデンサで、後者がチップ抵抗です。そのまんまです。BL+端子とグランド間に3.3V印加してバックライトがちゃんと付くか試しておきましょう。
RaspberryPiとの接続
RaspberryPiのRevesionは2.0の前提で進めていきますが、1.0でも同じはずです。
LCD | RaspberryPi(ピン番号) | プログラム |
---|---|---|
GND | Ground(P6 or P9 or P14 or P20 or P25) | - |
BL+ | 3V3Power(P1) | - |
GND | Ground | - |
3.3V | 3V3Power | - |
DAT | GPIO10(MOSI)(P19) | LCD_SDA |
CLK | GPIO11(SCLK)(P23) | LCD_SCL |
A0 | GPIO25(P22) | LCD_A0 |
RST | 3V3Power | - |
CS | GPIO8(P24) | LCD_CS |
A0はコマンドモードとデータモードの切り替えを行う端子です。他の3端子は#defineしてますが、RaspberryPiがうまくやってくれているので使っていません。
プログラム解説
- void glcd_write_data(unsigned char dat)
- void glcd_write_cmd(unsigned char cmd)
それぞれLCDにデータモードとコマンドモードで出力します。
- void glcd_init(void)
LCDを初期化します。
- void glcd_set_axis(int x, int page)
page行目のx列目にカーソル位置をセットします。
この液晶128x64ですが、白黒なので一回のglcd_write_dataで8ピクセル分書き込めます。この8ピクセルは横縦1x8で、これが横に128個(列)ならんだものが、さらに縦に8行(ページ)分ならんだような構造になってます。
glcd_write_dataで書き込んだ後は自動的に右の列に移動します。なので単純な文字列を表示するときは行の移動時だけ実行すればいいです。
- void output_font(char code)
- void output_font2(char upper, char lower)
- void output_text(char* text, int size)
それぞれ半角1文字、全角1文字、文字列をLCDに出力します。半角文字の場合、大抵の文字コードはASCII文字コードと互換性があるので問題ないですが、全角文字の時は注意しないといけません。
- void utf2sjis(char utf8code, char outbuf)
で、その注意しないと行けない文字コードを変換する関数です。文字列の文字コードをUTF-8からSJISに変換します。
実際の所、わざわざここで変換しなくても、プログラムファイルを保存するときにSJISで保存すれば問題ないのですが、文字化けとか嫌なのでUTF-8で統一することにしています。というのもRaspberryPiの初期化時にロケール設定をUTF-8にしたからです。
iconvってのが必要になりますが、Raspbianには最初から入ってるみたいです。
- int fontOpen()
フォントを読み込みます。AVRとかPICみたいにRAMが数kBしかない、なんてことはないので全部読み込んじゃいます。富豪的プログラミングですね。
- int main()
wiringPiの初期化と文字列の出力です。ポインタややこしいです。
わりと一瞬で文字の表示が終わります。
今後の予定
このLCDに画像を表示させたいです。普通の白黒画像だと簡単すぎるので4階調程度のグレースケール画像を表示しようかと思ってます。白黒ディスプレイなので「あの」方法を使います。