2019年1月23日水曜日

320*240 中華カラーグラフィックLCDの使い方



Amazonで数百円程度で入手できる320*240のカラーGLCDの使い方をPIC32MX270f256bを例に軽く紹介していきます。
この記事はArduinoなどで制御してみたいと思っている方にはあまり参考にならないかと思います(既存のライブラリがあるから)。

この記事ではPIC32mxを例に使いますが、SPI1バイト書き込み関数&ディレイ関数さえ用意できれば、他のc言語環境(AVR-GCCやPIC16のXC8)へ簡単に移植できます。

・ピンアサイン
上の写真をみるとGLCDからは9つのピン(SDカード関連を除く)が出ており、上(1番)からVCC,GND,CS,RESET,RS,SDI(MOSI),SCK,LED,SDO(MISO)となっています。
各ピンの説明をしておくと、VCC,GNDは文字通り電源です。
CSはチップセレクトという名前のピンでCS=0ならglcdはSPI信号を受け取るというもので、SPIバスに同じGLCDを2つ繋いで異なる制御をしたいという場面でもない限りCSはgndに落としておいても動きます。
RESETは文字通りリセットするピンでアクティブローです(Lでリセット有効)。
RSは送信するデータの種別(コマンドか表示データか)を選択するもので、Lでコマンド,Hでデータとなります。
LEDは液晶のバックライトLEDのアノード側のピンになります。
その他(SDI,SDO,SCK)はSPI関係のピンになります。

・lcdの概要(表示までの簡単な流れ)
ここでglcdに色つき四角形を表示する流れをglcdの特徴の説明を混ぜながら説明していきます。
マイコンはまずLCDに対して初期化処理を行います。
これには後で説明するglcd_init()という関数を呼ぶだけで終了します。
これで初期化は終了したので次に四角形を表示するための処理をします。
四角形を表示するためにはまず、四角形の二点の座標をaddset(後で説明します)関数でセットします。
四角形の座標の取り方ですが、一つの点は原点(x=0,y=0)に近い点、もう一つはさっきの点の対角の点です。
addset関数にて二点の座標をセットしたら、次に四角形を構成する一点一点に色データを設定します。
このLCDでは1ピクセルに2バイト使い、色を表現するので1ピクセルあたり2バイト送信します。
2バイトの内訳はRGB565という方式になっていて、上位バイトのうちの上位5ビットで赤の濃さを決め、上位1バイトの下位3ビット+下位バイトの上位3ビットで緑の濃さを決め、下位バイトの下位ビットで青の濃さを決めています。
もし意味がわからない場合google等で調べてみてください。
またピクセルに色を設定する際の順序ですが、まずx軸正の方向へ順に設定していき端まで行けばyを+1して、またx軸正の方向へ順へ設定します。

なので例えば、addsetで(0,0)と(1,1)という四角形を指定した時、この四角形のピクセル数は4つで、各ピクセルの座標は(0,0),(1,0),(0,1),(1,1)となり、色の設定の順番は(0,0)→(1,0)→(0,1)→(1,1)となります。

・glcdにおける座標
このglcdにおける座標の取り方は上の画像の赤い矢印の様になっています。
なのでglcd右上が(0,0)、右下が(239,0)、左上が(0,319)、左下が(239,319)となっています。
これ座標系だと使いにくい時があるので、黒い矢印の座標系を使うようにした関数がいくつかあります(あとで紹介します)。

・プログラム
プログラムはここよりダウンロードしてください。

・各関数の機能説明

  • glcd_init() 
    • この関数はglcdを初期化するためのものです。

  • write_command(unsigned char cmd)
    • この関数はglcdにコマンドを送信します。

  • write_data(unsigned char data)
    • この関数はglcdに表示データを送信します。

  • glcd_clear(unsigned char R,unsigned char G,unsigned char B)
    • 引数で指定された色で画面をクリアします。このglcdはrgb565なのでR,Bには2^5以上の値、Gには2^6以上の値を設定しても無意味です。

  • addset(unsigned int x,unsigned int y,unsigned xx ,unsigned int yy)
    • 第一,第二引数のx,yで原点よりの四角形の座標を設定し、第三,第四引数のxx,yyで先の点の対角の点を設定します。
    • この関数の後、write_data()でピクセルのデータを送っていきます。

  • addset_t(unsigned int x,unsigned int y)
    • この関数は先程の画像の黒い矢印の座標系を引数に取ります。関数内でglcdの座標系(赤い矢印)に変換しています。
    • この関数を用いて画面を操作する際、1ピクセルごとにこの命令でアドレスセットをする必要があります。
    • 後で登場する"_t"がつく関数は黒い矢印の座標系をしようします。

  • glcd_chr(unsigned int x , unsigned int y, unsigned char moji) 
    • 指定された座標に第三引数の文字を表示します。
    • 文字の左上端が指定された座標になります。
    • 使用可能な文字は基本的にアスキー文字です。

  • glcd_str(unsigned char x , unsigned char y , char *str) 
    • 指定された座標から文字列を表示します。
    • 使用可能な文字は基本的にアスキー文字です。

  • glcd_chr_t 及び glcd_str_t
    • 先程紹介した2つの関数の黒い矢印座標系版です。



  • glcd_square(unsigned int x,unsigned int y,unsigned xx ,unsigned int yy,unsigned char dh,unsigned char dl)
    • (x,y)と(xx,yy)で表される四角形を表示します。
    • 色はglcd_clearのようにrgbしてではなく、2byteによる指定です。(面倒だった)

  • glcd_array(unsigned int x,unsigned int y,unsigned xx ,unsigned int yy,unsigned char *data)
    • glcd_squareはすべてのピクセルに同じデータを送っていたので単色ですが、この関数は引数の配列から順にデータを取っていきます。
    • 例えばa[]という配列にa[0]=0b11111000,a[1]=0,a[2]=0,a[3]0b11111と定義しglcd_array()に渡すと、1ピクセル目はa[0],a[1]が適用され赤に、2ピクセル目はa[2],a[3]が適用され青となります。

  • glcd_all(unsigned char *data)
    • glcd_array()の全画面版です。

  • glcd_all_p(unsigned char *data)
    • 圧縮されたデータが格納された配列用です。
    • また別の記事にて紹介したいと思います。


・移植について
このライブラリを他の環境で使用したい場合、まずgcolor.cとgcolor.hをプロジェクトに入れます。
一番変更に手間がかかる部分は多分write_command()とwrite_data()です。
ここには自分が使うマイコンに応じてSPIの1バイト書き込み処理を記述します。
次にglcd_init()内のdelay_ms関数を自分の環境に応じて変更してください。
その他注意する点はソースコードに書いてあります。

・回路図、PICの動作モード
右のコネクタがglcdを表しています。
またパスコン等は省いています。
PIC32MXはPLLで48MHz駆動にしています。