aitendo C128X64SPI-12P-M with FRDM KL25Z

Dependencies:   mbed

/media/uploads/masato/c128x64spi-12p_2.jpg

aitendo の FSTN液晶モジュール(128x64/SPI)[C128X64SPI-12P-M] を KL25Z につないでみました。今のところ、ドット、ライン操作までしか用意できていません。コントローラ仕様によるとデバイスからデータを取得することができるのですが、シリアル(SPI)ではできないことになっているため、フレームバッファは自前で持っています。テスト用にドラゴン曲線を表示させてみました。

ところで aitendo の商品説明ページ中の FPCケーブル取り付け例の写真は誤っていました(修正された模様)。また、キャリーボードでの LCD とバックライトの GND と電源は直結されているようです。ついでにサンプルのコードでのフレームバッファの使い方にも誤りがありますからドット単位で操作する場合には注意が必要です。

2014.03.12
q61.org さんの Chibimo 表示器として使えるようにしてみました。ドラゴン曲線を描いた後、ホストからの Chibimo データを処理します。KL05 とトラ技 ARM ライタ基板でも動作を確認していますが、Chibimo として使うには USB シリアルの使える KL* が良いでしょう。

/media/uploads/masato/12876787564_6915e1f553_z.jpg

Revision:
1:84b2d36d57f0
Parent:
0:b06afbefd350
Child:
2:f6b27ec62471
--- a/main.cpp	Sun Jun 16 13:50:27 2013 +0000
+++ b/main.cpp	Mon Mar 03 03:28:29 2014 +0000
@@ -1,8 +1,22 @@
+/* ---
+ aitendo C128X64SPI-12P-M with FRDM-KL25Z, KL05Z and TRAGI-ARM Writer
+ 
+ * supports Chibimo
+ --- */
+
 #include "mbed.h"
 #include "c128x64spi.h"
 
-c128x64spi fstn(PTD2, PTD3, PTD1, PTD0, PTD5, PTA13); // mosi, miso, sclk, cs, rs, reset
+// -- for KL25Z
+// c128x64spi fstn(PTD2, PTD3, PTD1, PTD0, PTD5, PTA13); // mosi, miso, sclk, cs, rs, reset
+// Serial pc(USBTX, USBRX);
+// -- for KL05Z
+c128x64spi fstn(PTA7, PTA6, PTB0, PTA5, PTB11, PTB10); // mosi, miso, sclk, cs, rs, reset
 Serial pc(USBTX, USBRX);
+// -- for TORA-GI U35
+// c128x64spi fstn(P0_21, P0_22, P1_15, P0_6, P0_11, P0_12); // mosi, miso, sclk, cs, rs, reset
+// Serial pc(P0_19, P0_18);
+
 #define COLOR 1
 #define BG_COLOR 0
 
@@ -67,8 +81,8 @@
 int main() {
   int i, x, y;
 
-  pc.baud(9600);
-  pc.printf("start\r\n");
+  pc.baud(115200);
+  // pc.printf("start\r\n");
 #if 0
   for (y = 0; y < 64; y++)
     for (x = 0; x < 128; x++)
@@ -98,13 +112,55 @@
   wait(1);
 #endif  
   // Dragon
-  while (1) {
+  // while (1) 
+  {
     for (i = 0; i < 12; i++) {
-      pc.printf("dragon %d\r\n", i);
+      // pc.printf("dragon %d\r\n", i);
       fstn.clr(BG_COLOR);
       Dragon(32, 42, 96, 42, i);
       wait(0.5);
     }
     wait(20);
   }
+  
+  unsigned char ph = 0; // state
+  unsigned char pxdt[20]; // buffer
+  unsigned char dt;
+  while (1) {
+    if (pc.readable()) {
+      dt = pc.getc();
+      switch (ph++) {
+      case 0: // reset state - get locate Y
+        if (dt & 0xC0) {
+          ph = 0; // invalid address, reset state
+        } else {
+          // lcd locate Y
+          y = dt >> 3;
+          x = dt & 0x07;
+          fstn.locate_y(y);
+          x <<= 4;
+        }
+        break;
+      case 1: // get pxdt[1]
+        // delayMicroseconds(5);
+        fstn.locate_x(x);
+        pxdt[ph] = dt;
+        break;
+      case 2: case 3: case 4: case 5: case 6: case 7:
+      case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: // 
+        fstn.wr_dat(pxdt[ph - 1]);
+        pxdt[ph] = dt;
+        break;
+      case 16:
+        fstn.wr_dat(pxdt[ph - 1]);
+        // delayMicroseconds(5);
+        fstn.wr_dat(dt);
+        ph = 0;
+        break;
+      default:
+        ph = 0;
+        break;
+      }
+    }
+  }
 }