Kazuhiro Ouchi
/
VFD_fontx2_test1
VFD(FUTABA GP1059A01)にFONTX2形式の16ドットフォントを表示します。
main.cpp@1:c40b9c81a2ba, 2011-11-12 (annotated)
- Committer:
- kanpapa
- Date:
- Sat Nov 12 05:47:37 2011 +0000
- Revision:
- 1:c40b9c81a2ba
- Parent:
- 0:f4f140765442
aplha rev.2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kanpapa | 0:f4f140765442 | 1 | // |
kanpapa | 0:f4f140765442 | 2 | // VFD test program |
kanpapa | 0:f4f140765442 | 3 | // |
kanpapa | 0:f4f140765442 | 4 | #include "mbed.h" |
kanpapa | 0:f4f140765442 | 5 | #include "vfd_gp1059.h" |
kanpapa | 0:f4f140765442 | 6 | |
kanpapa | 0:f4f140765442 | 7 | /* |
kanpapa | 1:c40b9c81a2ba | 8 | ========================= |
kanpapa | 1:c40b9c81a2ba | 9 | FUTABA VFD GP1059A01(I/O) |
kanpapa | 1:c40b9c81a2ba | 10 | ------------------------- |
kanpapa | 0:f4f140765442 | 11 | p9 1 (D0) I/O |
kanpapa | 1:c40b9c81a2ba | 12 | p10 2 (D1) I/O |
kanpapa | 1:c40b9c81a2ba | 13 | p11 3 (D2) I/O |
kanpapa | 1:c40b9c81a2ba | 14 | p12 4 (D3) I/O |
kanpapa | 0:f4f140765442 | 15 | p13 5 (D4) I/O |
kanpapa | 0:f4f140765442 | 16 | p14 6 (D5) I/O |
kanpapa | 0:f4f140765442 | 17 | p15 7 (D6) I/O |
kanpapa | 0:f4f140765442 | 18 | p16 8 (D7) I/O |
kanpapa | 0:f4f140765442 | 19 | p21 10 (INT) O |
kanpapa | 0:f4f140765442 | 20 | p22 11 (WR) I |
kanpapa | 0:f4f140765442 | 21 | p23 12 (RD) I |
kanpapa | 0:f4f140765442 | 22 | p24 13 (CS) I |
kanpapa | 0:f4f140765442 | 23 | p25 14 (C/D) I |
kanpapa | 0:f4f140765442 | 24 | */ |
kanpapa | 0:f4f140765442 | 25 | |
kanpapa | 0:f4f140765442 | 26 | VFD_GP1059 vfd(p9, p10, p11, p12, p13, p14, p15, p16, p21, p22, p23, p24, p25); |
kanpapa | 0:f4f140765442 | 27 | |
kanpapa | 0:f4f140765442 | 28 | // |
kanpapa | 0:f4f140765442 | 29 | // For SD_card |
kanpapa | 0:f4f140765442 | 30 | // |
kanpapa | 0:f4f140765442 | 31 | //#include "SDFileSystem.h" |
kanpapa | 0:f4f140765442 | 32 | //SDFileSystem sd(p5, p6, p7, p8, "sd"); // mosi, miso, sclk, cs, name (HW modification candidate) |
kanpapa | 0:f4f140765442 | 33 | |
kanpapa | 0:f4f140765442 | 34 | LocalFileSystem local("local"); |
kanpapa | 0:f4f140765442 | 35 | |
kanpapa | 0:f4f140765442 | 36 | // LED Status |
kanpapa | 0:f4f140765442 | 37 | DigitalOut led1(LED1); |
kanpapa | 0:f4f140765442 | 38 | DigitalOut led2(LED2); |
kanpapa | 0:f4f140765442 | 39 | DigitalOut led3(LED3); |
kanpapa | 0:f4f140765442 | 40 | DigitalOut led4(LED4); |
kanpapa | 0:f4f140765442 | 41 | |
kanpapa | 0:f4f140765442 | 42 | const uint8_t LOW = 0; |
kanpapa | 0:f4f140765442 | 43 | |
kanpapa | 0:f4f140765442 | 44 | unsigned char reverse_bit(unsigned char x){ |
kanpapa | 0:f4f140765442 | 45 | const unsigned int bit[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; |
kanpapa | 0:f4f140765442 | 46 | unsigned char y = 0; |
kanpapa | 0:f4f140765442 | 47 | for (int i = 0; i < 8; i++){ |
kanpapa | 0:f4f140765442 | 48 | if ((bit[i] & x) != 0){ |
kanpapa | 0:f4f140765442 | 49 | y |= bit[7-i]; |
kanpapa | 0:f4f140765442 | 50 | } |
kanpapa | 0:f4f140765442 | 51 | } |
kanpapa | 0:f4f140765442 | 52 | return(y); |
kanpapa | 0:f4f140765442 | 53 | } |
kanpapa | 0:f4f140765442 | 54 | |
kanpapa | 0:f4f140765442 | 55 | // |
kanpapa | 0:f4f140765442 | 56 | // FONTX2 test routine |
kanpapa | 0:f4f140765442 | 57 | // @gingaxx |
kanpapa | 0:f4f140765442 | 58 | // |
kanpapa | 0:f4f140765442 | 59 | |
kanpapa | 0:f4f140765442 | 60 | //#define kanji_file "/local/SHMZN16X.FNT" |
kanpapa | 0:f4f140765442 | 61 | //#define kanji_file "/local/k12x10.fnt" |
kanpapa | 0:f4f140765442 | 62 | #define kanji_file "/local/J2KZN16A.FNT" |
kanpapa | 0:f4f140765442 | 63 | |
kanpapa | 0:f4f140765442 | 64 | int cx = 0; |
kanpapa | 0:f4f140765442 | 65 | int cy = 0; |
kanpapa | 1:c40b9c81a2ba | 66 | //int offsety = 0; |
kanpapa | 1:c40b9c81a2ba | 67 | //bool kstate = false; |
kanpapa | 1:c40b9c81a2ba | 68 | //unsigned char kbuf; |
kanpapa | 0:f4f140765442 | 69 | |
kanpapa | 1:c40b9c81a2ba | 70 | FILE *fp; // File open buffer |
kanpapa | 0:f4f140765442 | 71 | |
kanpapa | 1:c40b9c81a2ba | 72 | unsigned short start[92], end[92]; // table |
kanpapa | 1:c40b9c81a2ba | 73 | unsigned char font[64]; // kanji image read buffer |
kanpapa | 0:f4f140765442 | 74 | |
kanpapa | 1:c40b9c81a2ba | 75 | char Identifier[6+1]; // 00-05 "FONTX2" |
kanpapa | 1:c40b9c81a2ba | 76 | char FontName[8+1]; // 06-13 Font name |
kanpapa | 1:c40b9c81a2ba | 77 | unsigned char XSize; // 14 |
kanpapa | 1:c40b9c81a2ba | 78 | unsigned char YSize; // 15 |
kanpapa | 1:c40b9c81a2ba | 79 | unsigned char CodeType; // 16 0:ASCII, 1:KANJI |
kanpapa | 1:c40b9c81a2ba | 80 | unsigned char Tnum; // 17 Table entry number |
kanpapa | 0:f4f140765442 | 81 | |
kanpapa | 1:c40b9c81a2ba | 82 | //#define FONT_XBYTE ((XSize + 7) >> 3) |
kanpapa | 1:c40b9c81a2ba | 83 | //#define FONT_YBYTE ((YSize + 7) >> 3) |
kanpapa | 0:f4f140765442 | 84 | |
kanpapa | 0:f4f140765442 | 85 | void kanji_init(){ |
kanpapa | 0:f4f140765442 | 86 | //move cursor |
kanpapa | 0:f4f140765442 | 87 | fp = fopen(kanji_file , "r"); |
kanpapa | 0:f4f140765442 | 88 | |
kanpapa | 0:f4f140765442 | 89 | if(!fp) { |
kanpapa | 0:f4f140765442 | 90 | printf("File could not be opened!\n"); |
kanpapa | 0:f4f140765442 | 91 | led1 = 1; |
kanpapa | 0:f4f140765442 | 92 | exit(1); |
kanpapa | 0:f4f140765442 | 93 | } |
kanpapa | 0:f4f140765442 | 94 | |
kanpapa | 0:f4f140765442 | 95 | fgets(Identifier, 6+1, fp); // FONTX2 |
kanpapa | 0:f4f140765442 | 96 | fgets(FontName, 8+1, fp); |
kanpapa | 0:f4f140765442 | 97 | fread(&XSize, 1, 1, fp); |
kanpapa | 0:f4f140765442 | 98 | fread(&YSize, 1, 1, fp); |
kanpapa | 0:f4f140765442 | 99 | fread(&CodeType, 1, 1, fp); |
kanpapa | 0:f4f140765442 | 100 | fread(&Tnum, 1, 1, fp); |
kanpapa | 0:f4f140765442 | 101 | |
kanpapa | 0:f4f140765442 | 102 | printf("Identifier: %s\n\r",Identifier); |
kanpapa | 0:f4f140765442 | 103 | printf("FontName: %s\n\r",FontName); |
kanpapa | 0:f4f140765442 | 104 | printf("XSize: %d\n\r",XSize); |
kanpapa | 0:f4f140765442 | 105 | printf("YSize: %d\n\r",YSize); |
kanpapa | 0:f4f140765442 | 106 | printf("CodeType: %d\n\r",CodeType); |
kanpapa | 0:f4f140765442 | 107 | printf("Tnum: %d\n\r",Tnum); |
kanpapa | 0:f4f140765442 | 108 | |
kanpapa | 0:f4f140765442 | 109 | // Table read |
kanpapa | 1:c40b9c81a2ba | 110 | for (int a = 0; a < Tnum; a++){ |
kanpapa | 1:c40b9c81a2ba | 111 | fread(&start[a], 1, 2, fp); |
kanpapa | 1:c40b9c81a2ba | 112 | fread(&end[a] , 1, 2, fp); |
kanpapa | 0:f4f140765442 | 113 | } |
kanpapa | 0:f4f140765442 | 114 | } |
kanpapa | 0:f4f140765442 | 115 | |
kanpapa | 0:f4f140765442 | 116 | //Kanji puts cr = kanji cord |
kanpapa | 0:f4f140765442 | 117 | void k_puts(int cr){ |
kanpapa | 0:f4f140765442 | 118 | |
kanpapa | 0:f4f140765442 | 119 | const unsigned char bit_chk[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; |
kanpapa | 0:f4f140765442 | 120 | |
kanpapa | 1:c40b9c81a2ba | 121 | // calculate kanji address |
kanpapa | 0:f4f140765442 | 122 | int c = 0; |
kanpapa | 0:f4f140765442 | 123 | int adrs = 0; |
kanpapa | 0:f4f140765442 | 124 | while(cr > start[c]){ |
kanpapa | 1:c40b9c81a2ba | 125 | if (cr > end[c]){ |
kanpapa | 1:c40b9c81a2ba | 126 | adrs += end[c] - start[c] + 1; |
kanpapa | 0:f4f140765442 | 127 | } else { |
kanpapa | 0:f4f140765442 | 128 | adrs += cr - start[c]; |
kanpapa | 0:f4f140765442 | 129 | } |
kanpapa | 0:f4f140765442 | 130 | c++; |
kanpapa | 0:f4f140765442 | 131 | } |
kanpapa | 0:f4f140765442 | 132 | c--; |
kanpapa | 1:c40b9c81a2ba | 133 | printf("cr=%X, table num=%d, adrs=%d \r\n",cr,c,adrs); |
kanpapa | 0:f4f140765442 | 134 | |
kanpapa | 0:f4f140765442 | 135 | // Kanji image Read |
kanpapa | 1:c40b9c81a2ba | 136 | fseek( fp, Tnum * 4 + 18 + 32 * adrs, SEEK_SET ); |
kanpapa | 0:f4f140765442 | 137 | fread( &font, 1, 32, fp); |
kanpapa | 0:f4f140765442 | 138 | |
kanpapa | 0:f4f140765442 | 139 | // debug dump |
kanpapa | 0:f4f140765442 | 140 | for (int s = 0; s < 32 ; s++){ |
kanpapa | 0:f4f140765442 | 141 | printf(" %02x ",font[s]); |
kanpapa | 0:f4f140765442 | 142 | } |
kanpapa | 0:f4f140765442 | 143 | printf("\r\n"); |
kanpapa | 0:f4f140765442 | 144 | |
kanpapa | 0:f4f140765442 | 145 | // kanji put |
kanpapa | 0:f4f140765442 | 146 | c = 0; |
kanpapa | 0:f4f140765442 | 147 | unsigned int vfd_address = cx * 8 * 16 + cy * 2; |
kanpapa | 0:f4f140765442 | 148 | //printf("VFD address: %04x\r\n",vfd_address); |
kanpapa | 0:f4f140765442 | 149 | |
kanpapa | 0:f4f140765442 | 150 | int n = 0; |
kanpapa | 0:f4f140765442 | 151 | for (int j = 0; j < 2 ; j++) { |
kanpapa | 0:f4f140765442 | 152 | for (int x = 0; x < 8; x++) { |
kanpapa | 0:f4f140765442 | 153 | //printf("set VFD address: %04x\r\n",vfd_address); |
kanpapa | 0:f4f140765442 | 154 | vfd.set_write_read_address(vfd_address); |
kanpapa | 0:f4f140765442 | 155 | int m = 0; |
kanpapa | 0:f4f140765442 | 156 | for (int k = 0; k < 2 ; k++) { |
kanpapa | 0:f4f140765442 | 157 | unsigned int d = 0; |
kanpapa | 0:f4f140765442 | 158 | for (int i = 0; i < 8; i++) { |
kanpapa | 0:f4f140765442 | 159 | if (font[m * 2 + j] & bit_chk[x]) { |
kanpapa | 0:f4f140765442 | 160 | //printf("BIT on!\r\n"); |
kanpapa | 0:f4f140765442 | 161 | d = d | 1; |
kanpapa | 0:f4f140765442 | 162 | } |
kanpapa | 0:f4f140765442 | 163 | if (i < 7) { |
kanpapa | 0:f4f140765442 | 164 | d = d << 1; |
kanpapa | 0:f4f140765442 | 165 | } |
kanpapa | 0:f4f140765442 | 166 | //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); |
kanpapa | 0:f4f140765442 | 167 | m++; |
kanpapa | 0:f4f140765442 | 168 | } |
kanpapa | 0:f4f140765442 | 169 | //printf("send_data: %02x\r\n",d); |
kanpapa | 0:f4f140765442 | 170 | vfd.send_data(d); |
kanpapa | 0:f4f140765442 | 171 | } |
kanpapa | 0:f4f140765442 | 172 | vfd_address = vfd_address + 8; |
kanpapa | 0:f4f140765442 | 173 | } |
kanpapa | 0:f4f140765442 | 174 | n++; |
kanpapa | 0:f4f140765442 | 175 | } |
kanpapa | 0:f4f140765442 | 176 | |
kanpapa | 0:f4f140765442 | 177 | #ifdef TATEGAKI // tategaki |
kanpapa | 0:f4f140765442 | 178 | for (int x = 0; x < 16; x++){ |
kanpapa | 0:f4f140765442 | 179 | //printf("set VFD address: %04x\r\n",vfd_address); |
kanpapa | 0:f4f140765442 | 180 | //printf("send_data: font[%d] = %02x\r\n",x,font[c]); |
kanpapa | 0:f4f140765442 | 181 | vfd.set_write_read_address(vfd_address + 1); |
kanpapa | 0:f4f140765442 | 182 | vfd.send_data(reverse_bit(font[c])); |
kanpapa | 0:f4f140765442 | 183 | c++; |
kanpapa | 0:f4f140765442 | 184 | |
kanpapa | 0:f4f140765442 | 185 | //printf("set VFD address2: %04x\r\n",vfd_address); |
kanpapa | 0:f4f140765442 | 186 | //printf("send_data2: font[%d] = %02x\r\n",x,font[c]); |
kanpapa | 0:f4f140765442 | 187 | vfd.set_write_read_address(vfd_address); |
kanpapa | 0:f4f140765442 | 188 | vfd.send_data(reverse_bit(font[c])); |
kanpapa | 0:f4f140765442 | 189 | c++; |
kanpapa | 0:f4f140765442 | 190 | |
kanpapa | 0:f4f140765442 | 191 | vfd_address = vfd_address + 8; |
kanpapa | 0:f4f140765442 | 192 | } |
kanpapa | 0:f4f140765442 | 193 | #endif // TATEGAKI |
kanpapa | 0:f4f140765442 | 194 | |
kanpapa | 0:f4f140765442 | 195 | // move cursor |
kanpapa | 0:f4f140765442 | 196 | cx++; |
kanpapa | 0:f4f140765442 | 197 | if (cx >= 15){ //LF control |
kanpapa | 0:f4f140765442 | 198 | cx = 0; |
kanpapa | 0:f4f140765442 | 199 | cy++; |
kanpapa | 0:f4f140765442 | 200 | } |
kanpapa | 0:f4f140765442 | 201 | } |
kanpapa | 0:f4f140765442 | 202 | |
kanpapa | 0:f4f140765442 | 203 | void kanji_end(){ |
kanpapa | 0:f4f140765442 | 204 | fclose(fp); |
kanpapa | 0:f4f140765442 | 205 | } |
kanpapa | 0:f4f140765442 | 206 | |
kanpapa | 0:f4f140765442 | 207 | |
kanpapa | 0:f4f140765442 | 208 | void blink_LED() { |
kanpapa | 0:f4f140765442 | 209 | for (int i = 0 ; i < 5 ; i++) { |
kanpapa | 0:f4f140765442 | 210 | led4 = 1; |
kanpapa | 0:f4f140765442 | 211 | wait(0.2); |
kanpapa | 0:f4f140765442 | 212 | led4 = 0; |
kanpapa | 0:f4f140765442 | 213 | wait(0.2); |
kanpapa | 0:f4f140765442 | 214 | } |
kanpapa | 0:f4f140765442 | 215 | return; |
kanpapa | 0:f4f140765442 | 216 | } |
kanpapa | 0:f4f140765442 | 217 | |
kanpapa | 0:f4f140765442 | 218 | int main() { |
kanpapa | 0:f4f140765442 | 219 | |
kanpapa | 0:f4f140765442 | 220 | led1 = LOW; |
kanpapa | 0:f4f140765442 | 221 | led2 = LOW; |
kanpapa | 0:f4f140765442 | 222 | led3 = LOW; |
kanpapa | 0:f4f140765442 | 223 | led4 = LOW; |
kanpapa | 0:f4f140765442 | 224 | |
kanpapa | 0:f4f140765442 | 225 | // Start Sign |
kanpapa | 0:f4f140765442 | 226 | blink_LED(); |
kanpapa | 0:f4f140765442 | 227 | |
kanpapa | 0:f4f140765442 | 228 | vfd.cls(); |
kanpapa | 0:f4f140765442 | 229 | |
kanpapa | 0:f4f140765442 | 230 | // FONTX2 test |
kanpapa | 0:f4f140765442 | 231 | vfd.set_disp_start_address(0); // Display address: 000000H |
kanpapa | 0:f4f140765442 | 232 | vfd.luminance_adjustment(0x0f); // 100% |
kanpapa | 0:f4f140765442 | 233 | |
kanpapa | 0:f4f140765442 | 234 | kanji_init(); |
kanpapa | 0:f4f140765442 | 235 | printf("kanji_init()\r\n"); |
kanpapa | 0:f4f140765442 | 236 | |
kanpapa | 0:f4f140765442 | 237 | for (unsigned int kc = 0x8801; kc < 0x8820 ; kc++){ |
kanpapa | 0:f4f140765442 | 238 | k_puts(kc); // 8abf |
kanpapa | 0:f4f140765442 | 239 | } |
kanpapa | 0:f4f140765442 | 240 | |
kanpapa | 0:f4f140765442 | 241 | kanji_end(); |
kanpapa | 0:f4f140765442 | 242 | printf("kanji_end()\r\n"); |
kanpapa | 0:f4f140765442 | 243 | |
kanpapa | 0:f4f140765442 | 244 | // END Sign |
kanpapa | 0:f4f140765442 | 245 | blink_LED(); |
kanpapa | 0:f4f140765442 | 246 | } |