VFD(FUTABA GP1059A01)にFONTX2形式の16ドットフォントを表示します。

Dependencies:   mbed

Revision:
0:f4f140765442
Child:
1:c40b9c81a2ba
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Nov 03 10:44:37 2011 +0000
@@ -0,0 +1,252 @@
+//
+// VFD test program
+//
+#include "mbed.h"
+#include "vfd_gp1059.h"
+
+/*
+=====================
+GP1059A01(I/O)
+---------------------
+p9     1 (D0)  I/O
+p10     2 (D1)  I/O
+p11     3 (D2)  I/O
+p12     4 (D3)  I/O
+p13    5 (D4)  I/O
+p14    6 (D5)  I/O
+p15    7 (D6)  I/O
+p16    8 (D7)  I/O
+p21    10 (INT) O
+p22    11 (WR)  I
+p23    12 (RD)  I
+p24    13 (CS)  I
+p25    14 (C/D) I
+*/
+
+VFD_GP1059   vfd(p9, p10, p11, p12, p13, p14, p15, p16,    p21, p22, p23, p24, p25);
+
+//
+// For SD_card
+//
+//#include "SDFileSystem.h"
+//SDFileSystem  sd(p5, p6, p7, p8, "sd");  //  mosi, miso, sclk, cs, name  (HW modification candidate)
+
+LocalFileSystem local("local");
+
+// LED Status
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+
+
+const uint8_t LOW = 0;
+
+unsigned char reverse_bit(unsigned char x){
+    const unsigned int bit[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
+    unsigned char y = 0;
+    for (int i = 0; i < 8; i++){
+        if ((bit[i] & x) != 0){
+            y |= bit[7-i];
+        }
+    }
+    return(y);
+}
+
+
+
+
+//
+// FONTX2 test routine
+// @gingaxx
+//
+
+//#define  kanji_file    "/local/SHMZN16X.FNT"
+//#define  kanji_file  "/local/k12x10.fnt"
+#define kanji_file "/local/J2KZN16A.FNT"
+
+int cx = 0;
+int cy = 0;
+int offsety = 0;
+bool kstate = false;
+unsigned char kbuf;
+
+
+    FILE *fp;   //File open buffer
+
+    unsigned short start[92], end[92];
+    unsigned char font[64];              
+
+    char            Identifier[6+1];   
+    char            FontName[8+1];    
+    unsigned char    XSize;            
+    unsigned char    YSize;            
+    unsigned char    Size;            
+    unsigned char    CodeType;        
+    unsigned char    Tnum;            
+
+#define FONT_XBYTE        ((XSize + 7) >> 3)
+#define FONT_YBYTE        ((YSize + 7) >> 3)
+
+void kanji_init(){ 
+    //move cursor 
+    fp = fopen(kanji_file , "r");
+
+    if(!fp) {
+        printf("File could not be opened!\n");
+        led1 = 1;
+        exit(1);
+    }
+
+    fgets(Identifier,   6+1, fp);    // FONTX2
+    fgets(FontName,     8+1, fp);        
+    fread(&XSize,       1, 1, fp);        
+    fread(&YSize,       1, 1, fp);        
+    fread(&CodeType,    1, 1, fp);  
+    fread(&Tnum,        1, 1, fp);
+
+    printf("Identifier: %s\n\r",Identifier);
+    printf("FontName: %s\n\r",FontName);
+    printf("XSize: %d\n\r",XSize);
+    printf("YSize: %d\n\r",YSize);
+    printf("CodeType: %d\n\r",CodeType);
+    printf("Tnum: %d\n\r",Tnum);
+    
+    // Table read
+    for(int a=0;a< Tnum ;a++){
+        fread(&start[a],1,2,fp);
+        fread(&end[a]  ,1,2,fp);
+    }
+}
+
+//Kanji puts  cr = kanji cord
+void k_puts(int cr){
+
+    const unsigned char bit_chk[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
+
+    //kanji address
+    int c = 0;
+    int adrs = 0;
+    while(cr > start[c]){
+        if(cr > end[c]){
+            adrs += end[c]-start[c]+1;
+        } else {
+            adrs += cr - start[c];
+        }
+        c++;
+    }
+    c--;
+    printf("C=%d,adrs=%d cr=%X \r\n",c,adrs,cr);
+    
+    // Kanji image Read
+    fseek( fp, Tnum*4+18+32*adrs, SEEK_SET );
+    fread( &font, 1, 32, fp);
+    
+    // debug dump
+    for (int s = 0; s < 32 ; s++){
+        printf(" %02x ",font[s]);
+    }
+    printf("\r\n"); 
+
+    // kanji put
+    c = 0;
+    unsigned int vfd_address = cx * 8 * 16 + cy * 2;
+    //printf("VFD address: %04x\r\n",vfd_address);
+
+    int n = 0;
+    for (int j = 0; j < 2 ; j++) {
+        for (int x = 0; x < 8; x++) {
+            //printf("set VFD address: %04x\r\n",vfd_address);
+            vfd.set_write_read_address(vfd_address);
+            int m = 0;
+            for (int k = 0; k < 2 ; k++) {
+                unsigned int d = 0;      
+                for (int i = 0; i < 8; i++) {
+                    if (font[m * 2 + j] & bit_chk[x]) {
+                        //printf("BIT on!\r\n");
+                        d = d | 1;
+                    }   
+                    if (i < 7) {
+                        d = d << 1;
+                    }
+                    //printf("i:%d, k:%d, m:%d, font:%02x, bit_chk:%02x, data:%02x\r\n",i,k,m,font[m*2+j],bit_chk[x],d);
+                    m++;
+                }
+                //printf("send_data: %02x\r\n",d);
+                vfd.send_data(d);
+            }
+            vfd_address = vfd_address + 8;
+        }
+        n++;
+    }
+    
+#ifdef TATEGAKI    // tategaki
+    for (int x = 0; x < 16; x++){
+        //printf("set VFD address: %04x\r\n",vfd_address);
+        //printf("send_data: font[%d] = %02x\r\n",x,font[c]);
+        vfd.set_write_read_address(vfd_address + 1);
+        vfd.send_data(reverse_bit(font[c]));
+        c++;
+
+        //printf("set VFD address2: %04x\r\n",vfd_address);
+        //printf("send_data2: font[%d] = %02x\r\n",x,font[c]);
+        vfd.set_write_read_address(vfd_address);
+        vfd.send_data(reverse_bit(font[c]));
+        c++;
+
+        vfd_address = vfd_address + 8;
+    }
+#endif // TATEGAKI
+
+    // move cursor 
+    cx++;
+    if (cx >= 15){   //LF control
+        cx = 0;
+        cy++;
+    }
+}
+
+void kanji_end(){
+    fclose(fp);
+}
+
+
+void blink_LED() {
+    for (int i = 0 ; i < 5 ; i++) {
+        led4 = 1;
+        wait(0.2);
+        led4 = 0;
+        wait(0.2);
+    }
+    return;
+}
+
+int main() {
+
+    led1 = LOW;
+    led2 = LOW;
+    led3 = LOW;
+    led4 = LOW;
+        
+    // Start Sign
+    blink_LED();
+    
+    vfd.cls();
+        
+    // FONTX2 test
+    vfd.set_disp_start_address(0);  // Display address: 000000H
+    vfd.luminance_adjustment(0x0f);    // 100%
+
+    kanji_init();
+    printf("kanji_init()\r\n");
+    
+    for (unsigned int kc = 0x8801; kc < 0x8820 ; kc++){
+        k_puts(kc);  // 8abf
+    }
+    
+    kanji_end();
+    printf("kanji_end()\r\n");
+    
+    // END Sign
+    blink_LED();    
+}
\ No newline at end of file