当ブログに何度か登場している、128×160ピクセルの小型カラー液晶モジュールですが、そのコントローラST7735には「7735, 7735B, 7735R, 7735S」というバリエーションがあり、このうち7735Rと7735Sには縦スクロールの機能があります。
MicroPython用のST7735ドライバモジュールに、この機能を追加実装してみました。
コードは以下のGitHubリポジトリにアップロードしてあります。
boochow/MicroPython-ST7735: ST7735 TFT LCD driver for MicroPython
この機能については、このリポジトリのIssuesに「ST7735ドライバをMicroPythonのFrameBufコンパチブルにしてはどうか」というコメントがあり、そこで教えていただきました。
詳細については、以下のリンク先が参考になります。
Differences in ST7735 Versions ?
ST7735 TFT Vertical Scrolling example with CCS C Compiler
スクロール機能の概要は以下の図のようになります。この図はST7735SのマニュアルのP70に掲載されているものです。
2つのパラメータTFA(Top Fixed Area)とBFA(Bottom Fixed Area)で、画面上端からTFAピクセル分、画面下端からBFAピクセル分を「スクロールしない範囲」として指定します。
それらに挟まれた部分(VSA=Vertical Scrolling Area)はループ状(両端がつながった状態)でスクロールします。
ST7735を使った液晶の画素数は通常128×160ピクセルですが、TFA+VSA+BFA = 162となっており、2ピクセルの非表示部分があります。
非表示部分は可視部分の上と下にそれぞれ1ピクセルずつです。
スクロール値は絶対値で指定します。
このとき、スクロールによって液晶コントローラ内のフレームバッファ上のデータは更新されません。
その代わり、下図のように液晶へ表示する際のフレームバッファの読み出し開始位置が変化します。
図の左がフレームバッファの構成で、縦162ピクセルあり、上からTFAまでが非スクロール領域です。
スクロール値にADDRを指定したとします(ADDR > TFAです)。すると、表示は図の右のように、TFA領域のあとにADDR位置~BFA直前までのフレームバッファの内容が表示され、そのあとにTFA~ADDRのフレームバッファの内容が表示されます。
また、フレームバッファの先頭と末尾1ピクセル分は表示されません。(この非表示領域の設定は、コマンド0x2Bで行うことができます。このドライバでは、初期化の際に設定しています。)
TFAとBFAの指定はコマンド0x33、ADDRの指定はコマンド0x37で行います。
それぞれTFTクラスのメソッド
setvscroll(self, tfa, bfa)
_vscrolladdr(self, addr)
として定義しました。
スクロールを指定するときに、上の図のADDRの値を直接指定すると、常にTFAの値を意識する必要があるため直感的ではありません。
そこで、スクロール用のメソッド
vscroll(self, value)
は別に用意しました。
valueが0のときスクロール無しになり、valueが正なら上、負なら下へスクロールします(FrameBufferクラスのスクロール指定とはvalueの正負が逆になっています)。
最後にESP32でのサンプルコードと結線を載せておきます。
コメント