● 実験テーマ160
「PIC32MXによる、QVGAカラー液晶の表示実験2」
(今年のaitendo福BOXに入っていた2.8inchTFT液晶モジュール:M028C8347D8の表示実験です。横表示にしました。)
■ 2025.06.04
・aitendoの当該製品ページにある内蔵コントローラ:HX8347Dのデータシート及び、ApplicationNote、参考コード(STM32F103)
を参考にPIC32MXでこの液晶の表示実験をします。
参考コードでは縦表示ですが、これを横表示設定に変更しました。
まずは、実験回路図とテストベンチ用の液晶モジュールを取付ける台をユニバーサル基板で作成しました。
・NotePCで大元のソースファイルをエディットし、開発環境は別室のDiskTopPCにインストールされているMPLAB
X IDEを使い
C32コンパイラーでコンパイル作業を行いました。
また作成されたHEXファイルは、PICKit2にて書込みを行いました。
尚、表示テストプログラム内のテストメニューは以前作成したものと同じにしました。
・コンパイルは通ってHEXファイルも出来た。
早速動作チェックを行ったが、中途半端に動いた。
@ 縦表示になっている。
A バックグランドがクリア(黒バック)されてなくゴミが表示されている。(最初の文字列表示は文字数が少ないのが幸いして正常に表示してる。)
B 何故か、各色で全画面クリアするメニュー以降が動かない。
■ 2025.06.10
・次の2点を修正してみた。
@ 0x0022:SRAM Write Controlレジスタは、例えばGRAM領域を複数セット後、まとめてSRAMに書込むコマンド
なので、現状のレジスタ設定とデータ出力を一緒にした関数をやめ、
レジスタ設定関数:void WriteComm(unsigned int index)
データ出力関数 :void WriteData(unsigned int data)
に分けて記述した。
A 初期化関数において、GRAM領域を複数セット後、以下の横置き表示コマンド書込み追加
WriteComm(0x0016);WriteData(0x0060); // 横置き表示 MY=0,MX=1,MV=1
この時点ではGRAM Xend=239,Yend=319にセットしていた。GRAMエリアは縦配置固定で
このコマンドで回転するイメージでいた。
結果:横置き表示にはなったが、バックは部分的にしかクリア(黒)されない。
■ 2025.06.16
・この上手くいかない件、Windows10に搭載されているChatGPTと類似の「Copilot」に初めて問合せしてみた。
質問コメント:横表示モードのGRAMアドレス設定を詳しく説明して
回答:
横表示モードでのGRAMアドレス設定とは?
LCDコントローラでは、GRAM(Graphics RAM)に描画するアドレスの順序を、
表示モード(縦/横)によって切り替える必要があります。
特に横表示(ランドスケープ)に切り替えると、X軸とY軸の関係が変わるため、GRAMのアドレス設定も調整が必要です。
※ 設定のキーポイント
1. MADCTLレジスタの設定
- 横表示では、行と列のスキャン方向を変更します。
- MADCTL (Memory Access Control) のビットを以下のように設定します:
ビット名 |
説明 | 横表示での推奨値 |
MY | Y方向反転 | 0 |
MX | X方向反転 | 1 |
MV | 行列の入れ替え | 1 |
ML | 行順序 | 0 |
RGB | カラー順序(RGB) | 0 または 1 |
MH | 水平更新方向 | 0 |
※ 例えば、MADCTL = 0x28(0b00101000)など。
2. GRAMの開始/終了アドレスの設定
横表示では、X軸とY軸が入れ替わるため、描画範囲のアドレス設定も変わります。
- 通常の縦表示:
setColumnAddress(0, 239); // X方向(列)
setPageAddress(0, 319); // Y方向(行)
- 横表示にするなら:
setColumnAddress(0, 319); // X方向(列) ← 元のY方向
setPageAddress(0, 239); // Y方向(行) ← 元のX方向
3. GRAMへの書き込み
アドレス設定後、以下のようにGRAMに書き込み開始します:
writeCommand(0x22); // GRAMへの書き込み開始コマンド
writeData(pixelData); // ピクセルデータ送信
============================================================================================================
・初期化関数末尾の設定のみ横表示設定に修正(XYを入替えた)
//// GRAM領域設定(横表示設定)
WriteComm(0x0002);WriteData(0x0000); // Column Start Address Upper
WriteComm(0x0003);WriteData(0x0000); // Column Start Address Lower
WriteComm(0x0004);WriteData(0x0001); // Column End Address Upper
WriteComm(0x0005);WriteData(0x003F); // Column End Address Lower:319
WriteComm(0x0006);WriteData(0x0000); // Row Start Address Upper
WriteComm(0x0007);WriteData(0x0000); // Row Start Address Lower
WriteComm(0x0008);WriteData(0x0000); // Row End Address Upper
WriteComm(0x0009);WriteData(0x00EF); // Row End Address Lower:239
WriteComm(0x0016);WriteData(0x0060); // 横置き表示 MY=0,MX=1,MV=1
WriteComm(0x0022); // SRAM write
→ これでやっと動いた!!
今回初めて「Copilot」とチャットしてみたが、こんな有用なツールとは思わなかった。
前にも書いたが私の頭の中では、GRAM領域の各アドレスは縦配列固定で、MADCTLレジスタの設定で横方向に回転させる
イメージでいたので中々先に進めなかった。
→ と思って後から良く見たら、指定色と実際の表示色が合ってない。
下表示例で、白と緑は合っているが、青の所は赤が正解、シアンの所は黄色が正解
→ どうもRとGが逆のパネルのようなので、MADCTLレジスタのRGB-BGR ORDERビットの設定を変えてみる。
WriteComm(0x0016);WriteData(0x0060); // 横置き表示 MY=0,MX=1,MV=1, RGB=0 (RGB配列パネル)
これを以下のように修正
WriteComm(0x0016);WriteData(0x0068); // 横置き表示 MY=0,MX=1,MV=1, RGB=1(BGR配列パネル)
→ これでようやくokになる。
以下に全ての表示例を示した。(全画面クリアの色は2色の例のみ掲載しました。)
<回路図>
こちらからどうそ→ PIC32MX_カラーQVGA実験_2
<最終ソース及び、ヘッダーファイル>
・こちらから、どうぞ→ QVGAlcd_HX8347D_TEST.c
QVGAlcd_HX8347D_lib.c
QVGAlcd_HX8347D_lib.h
ASCII12dot.h (12*12_フォントデータ: 後閑氏が作成された、アスキー文字データ)
imagedata.h (イメージ・データ: 後閑氏が作成されたオリジナルに、WIN標準のお絵かきソフトで書いたオシロのイメージを追加しました。)