I2Cの使い方 2

ここでは、I2C通信の応用として、EEPROMに格納した文字フォントをTFTに表示する方法を学ぶ。

TFT文字表示の仕組み


MEMEsにはTFTとSTN(16×2行)の二種類の液晶が搭載されている。

STN液晶にはCG(キャラクタジェネレータ)-ROMが搭載されており、文字コードを送るだけで文字を表示することができた。

それに対しTFT液晶はCG-ROMは持っていない。文字を表示する場合には、図形を描いた時と同じように、点の集合としての文字を描くことになる。この場合、文字のデータ(フォント)をどこかに保持しておき、その都度データを読み出してTFTに書き込むという処理が必要になる。

ここでは、文字フォントをEEPROMに格納しておき、TFTに文字を描くときにEEPROMから読み出してTFTに書き込む、という仕組みを実現する。EEPROMへの書き込み/読み出しにはI2C通信を使用する。

文字フォントをEEPROMに書き込んでおけば、電源を切っても消えることがなく、今後の演習などで便利に使うことができる。

 

フォントデータ


今回使用するフォントデータは、横16*縦32ドットの構成であり、1文字あたり64バイトのデータ量である。

このデータを、あらかじめEEPROMに書き込んでおき、プログラム起動時に読み出して、二次元配列font_data[][]に格納して、文字表示に使用する。

コンピュータでは、文字コードを使用して文字を指定している。例えば”1”の文字コードは0x31であり、”B”の文字コードは0x42である。

文字コード表(抜粋)

+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +f
0x00 NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI
0x10 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUM ESC FS GS RS US
0x20 ! # $ % & ( ) * + , . /
0x30 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
0x40 @ A B C D E F G H I J K L M N O
0x50 P Q R S T U V W X Y Z [ ] ^ _
0x60 ` a b c d e f g h i j k l m n o
0x70 p q r s t u v w x y z { | } ~ DEL

 

文字コードと二次元配列font_data[][]との関係であるが、この文字コードを配列のキーにしてデータを格納しても良いが、無駄が多い。

上の文字コード表で0x00~0x1fの部分は制御文字(改行やベルなど)であり、文字として画面に表示するものではないので、これらに配列を割り当てることは不要である。(例えば、文字コード0x08のBS(バックスペース)は、表示する文字(図形)がない)

そこで、ここでは文字コードを0x20シフトして配列のキーとする。例えば文字コード0x41の”A”のフォントデータは、二次元配列font_data[0x21][]に格納する。

EEPROMには、文字(図形)として意味のある、文字コード0x20以降を格納しておく。

EEPROM内のデータ

 

EEPROMに格納するフォントデータは次のようになっている。

実際のフォントデータ

 

このように、文字フォントの1ドットを、font_data[][]の1ビットに割り当てて格納している。

 

フォントデータの書き込みとテスト


ここでは、EEPROMへフォントデータを書き込み、正しく書き込めているかの確認を行う。

次のワークスペースをダウンロードして、展開する。

I2C_2.zip

・書き込み

I2C_21.cはEEPROMへの書き込みを行うプログラムである。

プログラムの先頭に格納するフォントデータが二次元配列の要素として存在している。これをI2C通信を使ってEEPROMへ書き込む。

ビルドして実行すると、EEPROMへの書き込みが行われる(30秒程度かかる)。書き込みが完了すると、メモリダンプ動作に入る。アドレスを入力すると、連続する256バイトのEEPROMデータを表示する。0xffの連続や、0x00の連続になっていない限り、ここではOKとする。

正しい文字になっているのかの確認は、次のテストプログラム(I2C_22)で行う。

 

・テスト

I2C_22.cは、I2C_21.cで書き込んだフォントデータを読み出して、Htermに簡易表示するためのテストプログラムである。

main()の先頭でEEPROMからフォントデータを読み出して、二次元配列font_data[][]に格納している。その後、font_data[][]内のデータを’*’の集合としてHtermに表示している。

課題1:未完成部分が一か所あるので、完成させよ。

図に示したように、表示する文字のフォントデータを、左上の点から順に0or1を調べ、1であれば’*’を表示し、’0’であれば’ ‘を表示する。

横16ドット、縦32ドット分の処理を行うと、1文字が完成する。

TFTへの文字表示


EEPROMに文字フォントが正しく書き込まれていることが確認できたので、次にTFTへの文字表示を行う。

使用するプロジェクトは”I2C_23″である。

先ほどのテストプログラムでは”*”を使ってHterm上に点を描いたが、ここではTFT上に点を打つことで文字を描いていく。

上のテストプログラム(I2C_22)と仕組みは同じである。Htermに表示するかわりに、TFTに点を描いていく。点を描く関数はTFT_draw_point()である。

 

課題2:未完成の関数TFT_putch()を完成させよ。

課題1で、Htermにprintf()している部分を、TFT_draw_point()に置き換える。

 

課題3:未完成の関数TFT_putstr()を完成させよ。

文字列から1文字取り出して、上のTFT_putch()を呼び出す。文字列が終了するまで処理を繰り返す。

 

Copyright © 2012-2020 ミームス(MEMEs)のサポートページ All rights reserved.
This site is using the Desk Mess Mirrored theme, v2.5, from BuyNowShop.com.