Kazuhiro Ouchi
/
VFD_fontx2_test1
VFD(FUTABA GP1059A01)にFONTX2形式の16ドットフォントを表示します。
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Wed Jul 13 2022 01:18:25 by 1.7.2