DL144128TF, 128dot x 128dot TFT LCD module driving program.

Dependencies:   mbed

128dot x 128dot TFT LCD表示

erecrowが販売しているTFTタイプのLCDモジュール、DL144128TFをmbedに接続してみました。

/media/uploads/morita/image_20140614132421a.jpg

Nokia5110 の同系モデルです。
このサイズでnokiaの流通品は殆どがCSTN(表記がTFTになっていたりして、売る方も混乱)に対し、こちらは本当のTFTです。
昨今のスマホ画面と比べるのは酷ですが、CSTNに比べると、さすがに綺麗です。

elecrowのページには、ライブラリが紹介されていますが、製品がSPIなのに、ライブラリはAVR用のパラレル接続になっています。
mbed用として、SPIに変更しました。
DL144128TFの信号名はSCKとSDAですが、SPIです。 I2C用の基板をそのまま流用したと思われます。
コントローラの信号説明とDL144128TFの信号名は一致しませんので、A0がレジスタ選択と推測しました。
LCDからのデータ出力線は無いようです。
このあたりは、かなり適当です。
元のライブラリで、lcdFilledRectangleプログラムのピクセル数計算が間違っていましたので、修正しました。

クラスを作らず、ライブラリをそのままmbedに持ち込みましたので、ピン番号設定のコンストラクタはありません。
ili9163lcd.cppを編集して、直接接続ピン番号を入れてください。

ili9163lcd.cppの37行目~

DigitalOut SCK_(D2);
DigitalOut SDA_(D3);
DigitalOut A0_(D4);
DigitalOut RESET_(D5);
DigitalOut CS_(D6);


デモ画面は基本オリジナルなままですが、Hello Worldは時間と共に、色が変化するようにしています。
プログラムの生死確認用にLD2(NUCLEO用)を点滅させています。

Committer:
morita
Date:
Sat Jun 14 02:27:06 2014 +0000
Revision:
0:c0be4e018a09
DL144128TF driving Test.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
morita 0:c0be4e018a09 1 /**
morita 0:c0be4e018a09 2 * @file main.c
morita 0:c0be4e018a09 3 * @brief ILI9163/DL144128TF 128x128 TFT LCD Test code
morita 0:c0be4e018a09 4 *
morita 0:c0be4e018a09 5 * This program is free software: you can redistribute it and/or modify
morita 0:c0be4e018a09 6 * it under the terms of the GNU General Public License as published by
morita 0:c0be4e018a09 7 * the Free Software Foundation, either version 3 of the License, or
morita 0:c0be4e018a09 8 * (at your option) any later version.
morita 0:c0be4e018a09 9 *
morita 0:c0be4e018a09 10 * This program is distributed in the hope that it will be useful,
morita 0:c0be4e018a09 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
morita 0:c0be4e018a09 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
morita 0:c0be4e018a09 13 * GNU General Public License for more details.
morita 0:c0be4e018a09 14 *
morita 0:c0be4e018a09 15 * You should have received a copy of the GNU General Public License
morita 0:c0be4e018a09 16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
morita 0:c0be4e018a09 17 *
morita 0:c0be4e018a09 18 * @author Jun Morita (iccraft)
morita 0:c0be4e018a09 19 *
morita 0:c0be4e018a09 20 * @copyright Copyright (C) 2012 Simon Inns
morita 0:c0be4e018a09 21 * @author Simon Inns <simon.inns@gmail.com>
morita 0:c0be4e018a09 22 */
morita 0:c0be4e018a09 23
morita 0:c0be4e018a09 24 #include "mbed.h"
morita 0:c0be4e018a09 25 #include "ili9163lcd.h"
morita 0:c0be4e018a09 26
morita 0:c0be4e018a09 27 DigitalOut LED(LED1);
morita 0:c0be4e018a09 28
morita 0:c0be4e018a09 29 int main()
morita 0:c0be4e018a09 30 {
morita 0:c0be4e018a09 31 uint8_t tm=10;
morita 0:c0be4e018a09 32 uint8_t R=0,G=0,B=0;
morita 0:c0be4e018a09 33 uint8_t RGB_state=0;
morita 0:c0be4e018a09 34
morita 0:c0be4e018a09 35 lcdInitialise(LCD_ORIENTATION3);
morita 0:c0be4e018a09 36
morita 0:c0be4e018a09 37 lcdClearDisplay(decodeRgbValue(0, 0, 0));
morita 0:c0be4e018a09 38
morita 0:c0be4e018a09 39 lcdLine(0, 0, 127, 127, decodeRgbValue(31, 31, 31));
morita 0:c0be4e018a09 40 lcdLine(0, 127, 127, 0, decodeRgbValue(31, 31, 31));
morita 0:c0be4e018a09 41 lcdCircle(64, 64, 32, decodeRgbValue(31, 0, 0));
morita 0:c0be4e018a09 42 lcdCircle(64, 64, 40, decodeRgbValue(0, 31, 0));
morita 0:c0be4e018a09 43 lcdCircle(64, 64, 48, decodeRgbValue(0, 0, 31));
morita 0:c0be4e018a09 44
morita 0:c0be4e018a09 45 lcdPutS("Hello World!", lcdTextX(4), lcdTextY(0), decodeRgbValue(0, 0, 0), decodeRgbValue(31, 31, 31));
morita 0:c0be4e018a09 46
morita 0:c0be4e018a09 47 lcdPutS("The quick brown fox jumped over the lazy dog 0123456789", lcdTextX(0), lcdTextY(2), decodeRgbValue(0, 31, 31), decodeRgbValue(0, 0, 0));
morita 0:c0be4e018a09 48
morita 0:c0be4e018a09 49 lcdFilledRectangle(0, 64, 127, 127, decodeRgbValue(0, 0, 0));
morita 0:c0be4e018a09 50 lcdRectangle(0, 64, 127, 127, decodeRgbValue(31, 31, 31));
morita 0:c0be4e018a09 51
morita 0:c0be4e018a09 52 // Run the LCD test
morita 0:c0be4e018a09 53 uint8_t ballX = 64, ballY = 96;
morita 0:c0be4e018a09 54 int8_t ballSpeed = 1;
morita 0:c0be4e018a09 55 int8_t xDir = ballSpeed, yDir = ballSpeed;
morita 0:c0be4e018a09 56
morita 0:c0be4e018a09 57 // Bouncy ball demo
morita 0:c0be4e018a09 58 while(1)
morita 0:c0be4e018a09 59 {
morita 0:c0be4e018a09 60 // Delete the ball
morita 0:c0be4e018a09 61 lcdFilledRectangle(ballX-2, ballY-1, ballX+2, ballY+1, decodeRgbValue(0, 0, 0));
morita 0:c0be4e018a09 62
morita 0:c0be4e018a09 63 // Delete the bat
morita 0:c0be4e018a09 64 lcdFilledRectangle(ballX-4, 121, ballX+4, 123, decodeRgbValue(0, 0, 0));
morita 0:c0be4e018a09 65
morita 0:c0be4e018a09 66 // Move the ball
morita 0:c0be4e018a09 67 ballX += xDir;
morita 0:c0be4e018a09 68 ballY += yDir;
morita 0:c0be4e018a09 69
morita 0:c0be4e018a09 70 // Range check
morita 0:c0be4e018a09 71 if (ballX > 120) xDir = -ballSpeed;
morita 0:c0be4e018a09 72 if (ballX < 7) xDir = ballSpeed;
morita 0:c0be4e018a09 73
morita 0:c0be4e018a09 74 if (ballY > 120) yDir = -ballSpeed;
morita 0:c0be4e018a09 75 if (ballY < 70) yDir = ballSpeed;
morita 0:c0be4e018a09 76
morita 0:c0be4e018a09 77 // Plot the ball
morita 0:c0be4e018a09 78 lcdFilledRectangle(ballX-2, ballY-1, ballX+2, ballY+1, decodeRgbValue(31, 31, 31));
morita 0:c0be4e018a09 79
morita 0:c0be4e018a09 80 // Plot the bat
morita 0:c0be4e018a09 81 lcdFilledRectangle(ballX-4, 121, ballX+4, 123, decodeRgbValue(31, 0, 31));
morita 0:c0be4e018a09 82
morita 0:c0be4e018a09 83 // lcdPutS("Hello World!", lcdTextX(4), lcdTextY(0), decodeRgbValue(0, 0, 0), decodeRgbValue(31, 31, 31));
morita 0:c0be4e018a09 84 lcdPutS("Hello World!", lcdTextX(4), lcdTextY(0), decodeRgbValue(0, 0, 0), decodeRgbValue(R, G, B));
morita 0:c0be4e018a09 85 switch (RGB_state){
morita 0:c0be4e018a09 86 case 0:
morita 0:c0be4e018a09 87 if(++R >= 31)RGB_state++;
morita 0:c0be4e018a09 88 break;
morita 0:c0be4e018a09 89 case 1:
morita 0:c0be4e018a09 90 if(--R == 0)RGB_state++;
morita 0:c0be4e018a09 91 break;
morita 0:c0be4e018a09 92 case 2:
morita 0:c0be4e018a09 93 if(++G >= 31)RGB_state++;
morita 0:c0be4e018a09 94 break;
morita 0:c0be4e018a09 95 case 3:
morita 0:c0be4e018a09 96 if(--G == 0)RGB_state++;
morita 0:c0be4e018a09 97 break;
morita 0:c0be4e018a09 98 case 4:
morita 0:c0be4e018a09 99 if(++B >= 31)RGB_state++;
morita 0:c0be4e018a09 100 break;
morita 0:c0be4e018a09 101 case 5:
morita 0:c0be4e018a09 102 if(--B == 0)RGB_state++;
morita 0:c0be4e018a09 103 break;
morita 0:c0be4e018a09 104 case 6:
morita 0:c0be4e018a09 105 if(++R >= 31)RGB_state++;
morita 0:c0be4e018a09 106 B = R;
morita 0:c0be4e018a09 107 break;
morita 0:c0be4e018a09 108 case 7:
morita 0:c0be4e018a09 109 if(-- R== 0)RGB_state++;
morita 0:c0be4e018a09 110 B = R;
morita 0:c0be4e018a09 111 break;
morita 0:c0be4e018a09 112 case 8:
morita 0:c0be4e018a09 113 if(++R >= 31)RGB_state++;
morita 0:c0be4e018a09 114 G = R;
morita 0:c0be4e018a09 115 break;
morita 0:c0be4e018a09 116 case 9:
morita 0:c0be4e018a09 117 if(-- R== 0)RGB_state++;
morita 0:c0be4e018a09 118 G = R;
morita 0:c0be4e018a09 119 break;
morita 0:c0be4e018a09 120 case 10:
morita 0:c0be4e018a09 121 if(++G >= 31)RGB_state++;
morita 0:c0be4e018a09 122 B = G;
morita 0:c0be4e018a09 123 break;
morita 0:c0be4e018a09 124 case 11:
morita 0:c0be4e018a09 125 if(-- G== 0)RGB_state++;
morita 0:c0be4e018a09 126 B = G;
morita 0:c0be4e018a09 127 break;
morita 0:c0be4e018a09 128 case 12:
morita 0:c0be4e018a09 129 if(++R >= 31)RGB_state++;
morita 0:c0be4e018a09 130 B = G = R;
morita 0:c0be4e018a09 131 break;
morita 0:c0be4e018a09 132 case 13:
morita 0:c0be4e018a09 133 if(--R == 0)RGB_state = 0;
morita 0:c0be4e018a09 134 B = G = R;
morita 0:c0be4e018a09 135 break;
morita 0:c0be4e018a09 136 }
morita 0:c0be4e018a09 137 wait_ms(10);
morita 0:c0be4e018a09 138 if(--tm==0){
morita 0:c0be4e018a09 139 tm=10;
morita 0:c0be4e018a09 140 LED = LED ^ 1;
morita 0:c0be4e018a09 141 }
morita 0:c0be4e018a09 142 }
morita 0:c0be4e018a09 143 }