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()を呼び出す。文字列が終了するまで処理を繰り返す。