If you want to try this program, u will need fontfiles. You can download zipfile from http://j.mp/mbedjpfont2 . Documents include but only Japanese. Screen shot on http://twitpic.com/s2rvv .

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
utaani
Date:
Fri Dec 04 11:41:55 2009 +0000
Commit message:

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Dec 04 11:41:55 2009 +0000
@@ -0,0 +1,230 @@
+// AD-12864-SPI test program
+// About AD-12864-SPI, see http://www.aitendo.co.jp/product/1622.
+
+// Pin allocation
+// 1 p21 #CS1 with 10k ohm pull-up
+// 2 p22 #RESET with 10k ohm pull-up
+// 3 p23 A0 ... 0:command 1:data
+// 4 p13 SCK
+// 5 p11 MOSI
+// 6     Vdd
+// 7     Vss
+// 8 NC  LED_A
+
+// Japanese Character Version:
+// UTF Font from e-font http://openlab.ring.gr.jp/efont/unicode/
+// and row-col convert with information from:
+// http://todotani.cocolog-nifty.com/blog/2009/07/arduino-d98c.html
+// Font data file based on
+// http://todotani.cocolog-nifty.com/blog/files/glcdfont_12_ucs2.zip
+// make binary and split binary 
+
+#include "mbed.h"
+
+DigitalOut cs(p21);
+DigitalOut rst(p22);
+DigitalOut a0(p23);
+SPI spi(p11, p12, p13); // mosi, miso, sclk
+
+LocalFileSystem local("local");
+
+#ifdef DEBUG
+Serial pc(USBTX, USBRX); // tx, rx
+#endif
+
+void regwrite(unsigned char c) {
+    cs = a0 = 0;
+    spi.write(c);
+    cs = 1;
+}
+
+void datawrite(unsigned char c) {
+    cs = 0;
+    a0 = 1;
+    spi.write(c);
+    cs = 1;
+}
+
+// set position (x, 8*y)
+void locate(int x, int y) {
+    regwrite(0xb0 | (y & 0x0f)); // Page Address Set (see 2.4.3)
+    regwrite(0x10 | (x >> 4 & 0x0f)); // Column Address Set (see 2.4.4)
+    regwrite(x & 0x0f);
+}
+
+void cls(void) {
+    int x, y;
+    for (y = 0; y < 8; y++) {
+        locate(0, y);
+        for (x = 0; x < 128; x++) datawrite(0x00);
+    }
+}
+
+void plot(int x, int y) {
+    locate(x, y >> 3);
+    datawrite(1 << (y & 7));
+}
+
+void init() {
+    spi.format(8,0); // nazo
+    spi.frequency(10000000); // modify later
+
+    // reset
+    wait_ms(200);
+    rst = 0;
+    wait_ms(200);
+    rst = 1;
+
+    // initialize sequence
+    regwrite(0xaf);    // display on (see 2.4.1)
+    regwrite(0x2f);    // power control set (see 2.4.16)
+    regwrite(0x81);    // set electronic volume mode (see 2.4.18)
+//    regwrite(0x1f);    // electronic volume data 00-3f
+    regwrite(0x00);    // electronic volume data 00-3f
+    regwrite(0x27);    // V5 Volatge Regulator Internal Resister Ratio Set (see 2.4.17)
+    regwrite(0xa2);    // LCD Bias Set ... 1/9 bias (see 2.4.11)
+    regwrite(0xc8);    // Common Output Mode Select ... Reverse (see 2.4.15)
+    regwrite(0xa0);    // ADC Select ... Normal (see 2.4.8)
+    regwrite(0xa4);    // Display All Points ON/OFF ... normal (see 2.4.10)
+    regwrite(0xa6);    // Display Normal/Reverse ... normal (see 2.4.9)
+    regwrite(0xac);    // Static Indicator ... off (see 2.4.19)
+    regwrite(0x00);    // off
+    regwrite(0x40);    // Display Strat Line Set ... 0 (see 2.4.2)
+    regwrite(0xe0);    // Write Mode Set
+}
+
+void drawchar24(int x, int y, unsigned int c) {
+    unsigned char buf[24];
+    char fname[20];
+    int width,base;
+
+    if((c >= 0x0020) && (c <= 0x00FE)) {
+      width=12;
+      base=0x0020;
+      sprintf(fname,"/local/002000FE.dat");
+    }
+    else if((c >= 0x0100) && (c <= 0x05F3)) {
+      width=12;
+      base=0x0100;
+      sprintf(fname,"/local/010005F3.dat");
+    }
+    else if((c >= 0x1E00) && (c <= 0x1F72)) {
+      width=12;
+      base=0x1E00;
+      sprintf(fname,"/local/1E001F72.dat");
+    }
+    else if((c >= 0x2010) && (c <= 0x28FE)) {
+      width=12;
+      base=0x2010;
+      sprintf(fname,"/local/201028FE.dat");
+    }
+    else if((c >= 0x3000) && (c <= 0x33DD)) {
+      width=24;
+      base=0x3000;
+      sprintf(fname,"/local/300033DD.dat");
+    }
+    else if((c >= 0x4E00) && (c <= 0x9FA4)) {
+      width=24;
+      base=0x4E00;
+      sprintf(fname,"/local/4E009FA4.dat");
+    }
+    else if((c >= 0xF900) && (c <= 0xFA26)) {
+      width=24;
+      base=0xF900;
+      sprintf(fname,"/local/F900FA26.dat");
+    }
+    else if((c >= 0xFF00) && (c <= 0xFF5E)) {
+      width=24;
+      base=0xFF00;
+      sprintf(fname,"/local/FF00FF5E.dat");
+    }
+    else if((c >= 0xFF60) && (c <= 0xFF9F)) {
+      width=12;
+      base=0xFF60;
+      sprintf(fname,"/local/FF60FF9F.dat");
+    }
+    else if((c >= 0xFFE0) && (c <= 0xFFE6)) {
+      width=24;
+      base=0xFFE0;
+      sprintf(fname,"/local/FFE0FFE6.dat");
+    }
+    else {
+      return;
+    }
+    
+    FILE *fp = fopen(fname,"rb");
+    fseek(fp,(c-base) * width,SEEK_SET);
+    fread(buf, sizeof(unsigned char), width, fp);
+    fclose(fp);
+
+    #ifdef DEBUG
+    int i;
+    pc.printf("DEBUG:%s:%04.4x -> ",fname,c);
+    for(i=0;i<width;i++) {
+        pc.printf("%02.2x ",buf[i]);
+    }
+    pc.printf("\r\n");
+    #endif
+        
+    if(width == 24) {
+      locate(x,y);
+      datawrite(buf[0]); datawrite(buf[1]); datawrite(buf[2]);
+      datawrite(buf[3]); datawrite(buf[4]); datawrite(buf[5]);
+      datawrite(buf[6]); datawrite(buf[7]); datawrite(buf[8]);
+      datawrite(buf[9]); datawrite(buf[10]); datawrite(buf[11]);
+      locate(x,y+1);
+      datawrite(buf[12]>>4); datawrite(buf[13]>>4); datawrite(buf[14]>>4);
+      datawrite(buf[15]>>4); datawrite(buf[16]>>4); datawrite(buf[17]>>4);
+      datawrite(buf[18]>>4); datawrite(buf[19]>>4); datawrite(buf[20]>>4);
+      datawrite(buf[21]>>4); datawrite(buf[22]>>4); datawrite(buf[23]>>4);
+    }
+    else if(width == 12) {
+      locate(x,y);
+      datawrite(buf[0]); datawrite(buf[1]); datawrite(buf[2]);
+      datawrite(buf[3]); datawrite(buf[4]); datawrite(buf[5]);
+      locate(x,y+1);
+      datawrite(buf[6]); datawrite(buf[7]); datawrite(buf[8]);
+      datawrite(buf[9]); datawrite(buf[10]); datawrite(buf[11]);
+    }
+}
+/*
+void drawtext(const char *s) {
+    unsigned char c;
+    while ((c = *s++) != '\0') drawchar(c);
+}
+*/
+
+int main() {
+    init();
+    cls();
+    locate(0, 0);
+    // http://www.unicode.org/charts/PDF/U3040.pdf
+    // http://ash.jp/code/unitbl21.htm
+    drawchar24(0,0,0x3053);  // KO on UCS2
+    drawchar24(12,0,0x3093); // N
+    drawchar24(24,0,0x306b); // NI
+    drawchar24(36,0,0x3061); // CHI
+    drawchar24(48,0,0x306F); // HA
+    drawchar24(0,2,0x65E5);  // NI
+    drawchar24(12,2,0x672C); // HON
+    drawchar24(24,2,0x8A9E); // GO
+    drawchar24(36,2,0x8868); // HYO
+    drawchar24(48,2,0x793A); // JI
+    drawchar24(60,2,0x306E); // NO
+    drawchar24(72,2,0x30C6); // TE
+    drawchar24(84,2,0x30B9); // SU
+    drawchar24(96,2,0x30C8); // TO
+    drawchar24(108,2,0x3002);// MARU
+    drawchar24(0,4,0xFF21);   // zenkaku-A
+    drawchar24(12,4,0xFF22);  // zenkaku-B
+    drawchar24(24,4,0xFF23);  // zenkaku-C
+    drawchar24(36,4,0xFF24);  // zenkaku-D
+    drawchar24(48,4,0xFF25);  // zenkaku-E
+    drawchar24(60,4,0xFF26);  // zenkaku-F
+    drawchar24(72,4,0xFF27);  // zenkaku-G
+    drawchar24(84,4,0xFF28);  // zenkaku-H
+    drawchar24(96,4,0xFF29);  // zenkaku-I
+    drawchar24(108,4,0xFF2A); // zenkaku-J
+
+    while (1) {}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Dec 04 11:41:55 2009 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/49a220cc26e0