Sim's blog

電子工作はじめてみました

Nokia6100液晶って130x130なんですけど

2008-10-19 01:33:08 | AVR
Nokia6100液晶を使ってみるの続きです。

その後、すんさんがPIC24Fにソースを移植してくださいました。猫の写真を表示されています。

この液晶の名前ですが、元々使われていたNokia社の携帯電話の名前(Nokia6100とかNokia6610)を使って呼ばれているようです。なのでNokia6100液晶というのは正式な型番ではなく通称みたいです。また、複数の携帯で使われていたらしく呼ばれる名前も多少ゆれています。

液晶パネルですが、TFTではなくSTNです。TFTはドット毎の制御ですが、STNはライン毎の制御なので、にじみが出ます。背景が黒だと目立つので背景は白とかの方がにじみが目立たなくていいです。電子ボリュームの値を大きくすると、画面が明るくなってにじみが目立たなくなりますが、その分諧調が減ってしまいます。明るい方の色が全部飽和して一番明るい色になります。見やすいように電子ボリュームの値を調節できるようにするのがよさそうです。

SRAMは132x132あるみたいです。この液晶モジュールはSRAMの読み出しができないのでそれ以上存在するかどうかは確認できません。写真では(2,2)-(129,129)に赤い四角を描いています。左側と下側にすきまが見えますがここにも描画できます。実際に表示できる座標は(0,2)-(129,131)の130x130です。前回のコードでy座標に2を足しているのは、y座標が0と1は表示されなかったからです。

初期化のときのDATCTLコマンドの第1パラメータを変えることで表示の向きを変えることができます。このとき表示できる座標も変わります。例えばモード0では(0,2)-(129,131)ですが、モード1だと(0,0)-(129,129)を表示できて、その外側は表示できません。モードによって表示される座標が違うので補正も変える必要があります。モード0ではy座標を2増やしますが同じ補正をモード1で行うと下の2行が欠けてしまうことになります。
どのモードでも表示されるのは(2,2)-(129,129)の128x128の領域です。この領域だけを使うことにすれば補正はx, y座標とも2を増やせばいいことになり、モードによって補正を変える必要はなくなります。

DATCTLコマンドの第1パラメータを変えるとどうなるか具体的に見てみます。描画ルーチンは全て同じものを使っています。ここでx座標といっているのはCASETコマンドで設定するColumn Addressです。またy座標はPASETコマンドで設定するPage Addressのことです。

モード0

上と右が欠けているので表示される座標は(0, 2)-(129,131)です。

モード1

モード0と較べてy座標(Page Address)が反転しています。
表示される座標は(0, 0)-(129, 129)です。

モード2

モード0と較べてx座標(Column Address)が反転しています。
表示される座標は(2, 2)-(131, 131)です。

モード3

モード0と較べてx, y座標共に反転しています。
モード0から180度回転していることになるので、写真上側から見ると正常に見えることになります。
表示される座標は(2,0)-(131, 129)です。

モード4

今度はx座標とy座標が入れ替わっています。
表示される座標は(2,0)-(131,129)です。

モード5

モード4と較べてx座標(画面で見ると縦方向)が反転しています。
表示される座標は(0,0)-(129,129)です。
写真右方向から見ると正常に見えます。

モード6

モード4と較べてy座標(画面で見ると横方向)が反転しています。
表示される座標は(2,2)-(131,131)です。
写真左方向から見ると正常に見えます。

モード7

モード4と較べてx, y座標共に反転しています。
表示される座標は(0,2)-(129,131)です。

結構複雑ですね。実際は液晶モジュールのコントローラがCPU側から送られてきた座標をどのように解釈しているかという話になります。

今回の表示のコードです。
void plot(uint8_t x, uint8_t y, uint16_t c)
{
    lcd_cmd(CASET);
    lcd_data(x);
    lcd_data(x);
    lcd_cmd(PASET);
    lcd_data(y);
    lcd_data(y);

    lcd_cmd(RAMWR);
    lcd_data(c >> 8);
    lcd_data(c);
}

void test1(void)
{
    uint8_t i;

    lcd_puts_p(2, 2, PSTR("Hello, world"));
    lcd_puts_p(5, 8, PSTR("MODE"));
    lcd_putc(10, 8, '0' + MODE);

    for(i = 0; i < 132; i++){
        plot(2, i, 0xf00);
        plot(129, i, 0xf00);
        plot(i, 2, 0xf00);
        plot(i, 129, 0xf00);
    }
}


最新の画像もっと見る

コメントを投稿