Search Code
About VFD_fontx2_test1

First published 03 Nov 2011, with 2 revisions since.
Last update: 03 Nov 2011.
View history

Last change message: Alpha test version. 16dot font only.

Import this program

VFD_fontx2_test1

Published 03 Nov 2011, by   user Kazuhiro Ouchi   tag FONTX2, GP1059A01, VFD
Embed: (wiki syntax)

« Back to documentation index

You are viewing an out of date revision of VFD_fontx2_test1! View latest revision

Show/hide line numbers main.cpp Source File

main.cpp

00001 //
00002 // VFD test program
00003 //
00004 #include "mbed.h"
00005 #include "vfd_gp1059.h"
00006 
00007 /*
00008 =====================
00009 GP1059A01(I/O)
00010 ---------------------
00011 p9     1 (D0)  I/O
00012 p10     2 (D1)  I/O
00013 p11     3 (D2)  I/O
00014 p12     4 (D3)  I/O
00015 p13    5 (D4)  I/O
00016 p14    6 (D5)  I/O
00017 p15    7 (D6)  I/O
00018 p16    8 (D7)  I/O
00019 p21    10 (INT) O
00020 p22    11 (WR)  I
00021 p23    12 (RD)  I
00022 p24    13 (CS)  I
00023 p25    14 (C/D) I
00024 */
00025 
00026 VFD_GP1059   vfd(p9, p10, p11, p12, p13, p14, p15, p16,    p21, p22, p23, p24, p25);
00027 
00028 //
00029 // For SD_card
00030 //
00031 //#include "SDFileSystem.h"
00032 //SDFileSystem  sd(p5, p6, p7, p8, "sd");  //  mosi, miso, sclk, cs, name  (HW modification candidate)
00033 
00034 LocalFileSystem local("local");
00035 
00036 // LED Status
00037 DigitalOut led1(LED1);
00038 DigitalOut led2(LED2);
00039 DigitalOut led3(LED3);
00040 DigitalOut led4(LED4);
00041 
00042 
00043 const uint8_t LOW = 0;
00044 
00045 unsigned char reverse_bit(unsigned char x){
00046     const unsigned int bit[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
00047     unsigned char y = 0;
00048     for (int i = 0; i < 8; i++){
00049         if ((bit[i] & x) != 0){
00050             y |= bit[7-i];
00051         }
00052     }
00053     return(y);
00054 }
00055 
00056 
00057 
00058 
00059 //
00060 // FONTX2 test routine
00061 // @gingaxx
00062 //
00063 
00064 //#define  kanji_file    "/local/SHMZN16X.FNT"
00065 //#define  kanji_file  "/local/k12x10.fnt"
00066 #define kanji_file "/local/J2KZN16A.FNT"
00067 
00068 int cx = 0;
00069 int cy = 0;
00070 int offsety = 0;
00071 bool kstate = false;
00072 unsigned char kbuf;
00073 
00074 
00075     FILE *fp;   //File open buffer
00076 
00077     unsigned short start[92], end[92];
00078     unsigned char font[64];              
00079 
00080     char            Identifier[6+1];   
00081     char            FontName[8+1];    
00082     unsigned char    XSize;            
00083     unsigned char    YSize;            
00084     unsigned char    Size;            
00085     unsigned char    CodeType;        
00086     unsigned char    Tnum;            
00087 
00088 #define FONT_XBYTE        ((XSize + 7) >> 3)
00089 #define FONT_YBYTE        ((YSize + 7) >> 3)
00090 
00091 void kanji_init(){ 
00092     //move cursor 
00093     fp = fopen(kanji_file , "r");
00094 
00095     if(!fp) {
00096         printf("File could not be opened!\n");
00097         led1 = 1;
00098         exit(1);
00099     }
00100 
00101     fgets(Identifier,   6+1, fp);    // FONTX2
00102     fgets(FontName,     8+1, fp);        
00103     fread(&XSize,       1, 1, fp);        
00104     fread(&YSize,       1, 1, fp);        
00105     fread(&CodeType,    1, 1, fp);  
00106     fread(&Tnum,        1, 1, fp);
00107 
00108     printf("Identifier: %s\n\r",Identifier);
00109     printf("FontName: %s\n\r",FontName);
00110     printf("XSize: %d\n\r",XSize);
00111     printf("YSize: %d\n\r",YSize);
00112     printf("CodeType: %d\n\r",CodeType);
00113     printf("Tnum: %d\n\r",Tnum);
00114     
00115     // Table read
00116     for(int a=0;a< Tnum ;a++){
00117         fread(&start[a],1,2,fp);
00118         fread(&end[a]  ,1,2,fp);
00119     }
00120 }
00121 
00122 //Kanji puts  cr = kanji cord
00123 void k_puts(int cr){
00124 
00125     const unsigned char bit_chk[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
00126 
00127     //kanji address
00128     int c = 0;
00129     int adrs = 0;
00130     while(cr > start[c]){
00131         if(cr > end[c]){
00132             adrs += end[c]-start[c]+1;
00133         } else {
00134             adrs += cr - start[c];
00135         }
00136         c++;
00137     }
00138     c--;
00139     printf("C=%d,adrs=%d cr=%X \r\n",c,adrs,cr);
00140     
00141     // Kanji image Read
00142     fseek( fp, Tnum*4+18+32*adrs, SEEK_SET );
00143     fread( &font, 1, 32, fp);
00144     
00145     // debug dump
00146     for (int s = 0; s < 32 ; s++){
00147         printf(" %02x ",font[s]);
00148     }
00149     printf("\r\n"); 
00150 
00151     // kanji put
00152     c = 0;
00153     unsigned int vfd_address = cx * 8 * 16 + cy * 2;
00154     //printf("VFD address: %04x\r\n",vfd_address);
00155 
00156     int n = 0;
00157     for (int j = 0; j < 2 ; j++) {
00158         for (int x = 0; x < 8; x++) {
00159             //printf("set VFD address: %04x\r\n",vfd_address);
00160             vfd.set_write_read_address(vfd_address);
00161             int m = 0;
00162             for (int k = 0; k < 2 ; k++) {
00163                 unsigned int d = 0;      
00164                 for (int i = 0; i < 8; i++) {
00165                     if (font[m * 2 + j] & bit_chk[x]) {
00166                         //printf("BIT on!\r\n");
00167                         d = d | 1;
00168                     }   
00169                     if (i < 7) {
00170                         d = d << 1;
00171                     }
00172                     //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);
00173                     m++;
00174                 }
00175                 //printf("send_data: %02x\r\n",d);
00176                 vfd.send_data(d);
00177             }
00178             vfd_address = vfd_address + 8;
00179         }
00180         n++;
00181     }
00182     
00183 #ifdef TATEGAKI    // tategaki
00184     for (int x = 0; x < 16; x++){
00185         //printf("set VFD address: %04x\r\n",vfd_address);
00186         //printf("send_data: font[%d] = %02x\r\n",x,font[c]);
00187         vfd.set_write_read_address(vfd_address + 1);
00188         vfd.send_data(reverse_bit(font[c]));
00189         c++;
00190 
00191         //printf("set VFD address2: %04x\r\n",vfd_address);
00192         //printf("send_data2: font[%d] = %02x\r\n",x,font[c]);
00193         vfd.set_write_read_address(vfd_address);
00194         vfd.send_data(reverse_bit(font[c]));
00195         c++;
00196 
00197         vfd_address = vfd_address + 8;
00198     }
00199 #endif // TATEGAKI
00200 
00201     // move cursor 
00202     cx++;
00203     if (cx >= 15){   //LF control
00204         cx = 0;
00205         cy++;
00206     }
00207 }
00208 
00209 void kanji_end(){
00210     fclose(fp);
00211 }
00212 
00213 
00214 void blink_LED() {
00215     for (int i = 0 ; i < 5 ; i++) {
00216         led4 = 1;
00217         wait(0.2);
00218         led4 = 0;
00219         wait(0.2);
00220     }
00221     return;
00222 }
00223 
00224 int main() {
00225 
00226     led1 = LOW;
00227     led2 = LOW;
00228     led3 = LOW;
00229     led4 = LOW;
00230         
00231     // Start Sign
00232     blink_LED();
00233     
00234     vfd.cls();
00235         
00236     // FONTX2 test
00237     vfd.set_disp_start_address(0);  // Display address: 000000H
00238     vfd.luminance_adjustment(0x0f);    // 100%
00239 
00240     kanji_init();
00241     printf("kanji_init()\r\n");
00242     
00243     for (unsigned int kc = 0x8801; kc < 0x8820 ; kc++){
00244         k_puts(kc);  // 8abf
00245     }
00246     
00247     kanji_end();
00248     printf("kanji_end()\r\n");
00249     
00250     // END Sign
00251     blink_LED();    
00252 }