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

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

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 FUTABA VFD 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 const uint8_t LOW = 0;
00043 
00044 unsigned char reverse_bit(unsigned char x){
00045     const unsigned int bit[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
00046     unsigned char y = 0;
00047     for (int i = 0; i < 8; i++){
00048         if ((bit[i] & x) != 0){
00049             y |= bit[7-i];
00050         }
00051     }
00052     return(y);
00053 }
00054 
00055 //
00056 // FONTX2 test routine
00057 // @gingaxx
00058 //
00059 
00060 //#define  kanji_file    "/local/SHMZN16X.FNT"
00061 //#define  kanji_file  "/local/k12x10.fnt"
00062 #define kanji_file "/local/J2KZN16A.FNT"
00063 
00064 int cx = 0;
00065 int cy = 0;
00066 //int offsety = 0;
00067 //bool kstate = false;
00068 //unsigned char kbuf;
00069 
00070 FILE *fp;   // File open buffer
00071 
00072 unsigned short  start[92], end[92]; // table
00073 unsigned char   font[64];           // kanji image read buffer              
00074 
00075 char            Identifier[6+1];    // 00-05 "FONTX2"   
00076 char            FontName[8+1];      // 06-13 Font name    
00077 unsigned char   XSize;              // 14            
00078 unsigned char   YSize;              // 15
00079 unsigned char   CodeType;           // 16 0:ASCII, 1:KANJI   
00080 unsigned char   Tnum;               // 17 Table entry number
00081 
00082 //#define FONT_XBYTE        ((XSize + 7) >> 3)
00083 //#define FONT_YBYTE        ((YSize + 7) >> 3)
00084 
00085 void kanji_init(){ 
00086     //move cursor 
00087     fp = fopen(kanji_file , "r");
00088 
00089     if(!fp) {
00090         printf("File could not be opened!\n");
00091         led1 = 1;
00092         exit(1);
00093     }
00094 
00095     fgets(Identifier,   6+1, fp);    // FONTX2
00096     fgets(FontName,     8+1, fp);        
00097     fread(&XSize,       1, 1, fp);        
00098     fread(&YSize,       1, 1, fp);        
00099     fread(&CodeType,    1, 1, fp);  
00100     fread(&Tnum,        1, 1, fp);
00101 
00102     printf("Identifier: %s\n\r",Identifier);
00103     printf("FontName: %s\n\r",FontName);
00104     printf("XSize: %d\n\r",XSize);
00105     printf("YSize: %d\n\r",YSize);
00106     printf("CodeType: %d\n\r",CodeType);
00107     printf("Tnum: %d\n\r",Tnum);
00108     
00109     // Table read
00110     for (int a = 0; a < Tnum; a++){
00111         fread(&start[a], 1, 2, fp);
00112         fread(&end[a]  , 1, 2, fp);
00113     }
00114 }
00115 
00116 //Kanji puts  cr = kanji cord
00117 void k_puts(int cr){
00118 
00119     const unsigned char bit_chk[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
00120 
00121     // calculate kanji address
00122     int c = 0;
00123     int adrs = 0;
00124     while(cr > start[c]){
00125         if (cr > end[c]){
00126             adrs += end[c] - start[c] + 1;
00127         } else {
00128             adrs += cr - start[c];
00129         }
00130         c++;
00131     }
00132     c--;
00133     printf("cr=%X, table num=%d, adrs=%d \r\n",cr,c,adrs);
00134     
00135     // Kanji image Read
00136     fseek( fp, Tnum * 4 + 18 + 32 * adrs, SEEK_SET );
00137     fread( &font, 1, 32, fp);
00138     
00139     // debug dump
00140     for (int s = 0; s < 32 ; s++){
00141         printf(" %02x ",font[s]);
00142     }
00143     printf("\r\n"); 
00144 
00145     // kanji put
00146     c = 0;
00147     unsigned int vfd_address = cx * 8 * 16 + cy * 2;
00148     //printf("VFD address: %04x\r\n",vfd_address);
00149 
00150     int n = 0;
00151     for (int j = 0; j < 2 ; j++) {
00152         for (int x = 0; x < 8; x++) {
00153             //printf("set VFD address: %04x\r\n",vfd_address);
00154             vfd.set_write_read_address(vfd_address);
00155             int m = 0;
00156             for (int k = 0; k < 2 ; k++) {
00157                 unsigned int d = 0;      
00158                 for (int i = 0; i < 8; i++) {
00159                     if (font[m * 2 + j] & bit_chk[x]) {
00160                         //printf("BIT on!\r\n");
00161                         d = d | 1;
00162                     }   
00163                     if (i < 7) {
00164                         d = d << 1;
00165                     }
00166                     //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);
00167                     m++;
00168                 }
00169                 //printf("send_data: %02x\r\n",d);
00170                 vfd.send_data(d);
00171             }
00172             vfd_address = vfd_address + 8;
00173         }
00174         n++;
00175     }
00176     
00177 #ifdef TATEGAKI    // tategaki
00178     for (int x = 0; x < 16; x++){
00179         //printf("set VFD address: %04x\r\n",vfd_address);
00180         //printf("send_data: font[%d] = %02x\r\n",x,font[c]);
00181         vfd.set_write_read_address(vfd_address + 1);
00182         vfd.send_data(reverse_bit(font[c]));
00183         c++;
00184 
00185         //printf("set VFD address2: %04x\r\n",vfd_address);
00186         //printf("send_data2: font[%d] = %02x\r\n",x,font[c]);
00187         vfd.set_write_read_address(vfd_address);
00188         vfd.send_data(reverse_bit(font[c]));
00189         c++;
00190 
00191         vfd_address = vfd_address + 8;
00192     }
00193 #endif // TATEGAKI
00194 
00195     // move cursor 
00196     cx++;
00197     if (cx >= 15){   //LF control
00198         cx = 0;
00199         cy++;
00200     }
00201 }
00202 
00203 void kanji_end(){
00204     fclose(fp);
00205 }
00206 
00207 
00208 void blink_LED() {
00209     for (int i = 0 ; i < 5 ; i++) {
00210         led4 = 1;
00211         wait(0.2);
00212         led4 = 0;
00213         wait(0.2);
00214     }
00215     return;
00216 }
00217 
00218 int main() {
00219 
00220     led1 = LOW;
00221     led2 = LOW;
00222     led3 = LOW;
00223     led4 = LOW;
00224         
00225     // Start Sign
00226     blink_LED();
00227     
00228     vfd.cls();
00229         
00230     // FONTX2 test
00231     vfd.set_disp_start_address(0);  // Display address: 000000H
00232     vfd.luminance_adjustment(0x0f);    // 100%
00233 
00234     kanji_init();
00235     printf("kanji_init()\r\n");
00236     
00237     for (unsigned int kc = 0x8801; kc < 0x8820 ; kc++){
00238         k_puts(kc);  // 8abf
00239     }
00240     
00241     kanji_end();
00242     printf("kanji_end()\r\n");
00243     
00244     // END Sign
00245     blink_LED();    
00246 }