Kazuhiro Ouchi
/
VFD_fontx2_test1
VFD(FUTABA GP1059A01)にFONTX2形式の16ドットフォントを表示します。
main.cpp@0:f4f140765442, 2011-11-03 (annotated)
- Committer:
- kanpapa
- Date:
- Thu Nov 03 10:44:37 2011 +0000
- Revision:
- 0:f4f140765442
- Child:
- 1:c40b9c81a2ba
Alpha test version. 16dot font only.
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 | 0:f4f140765442 | 8 | ===================== |
kanpapa | 0:f4f140765442 | 9 | GP1059A01(I/O) |
kanpapa | 0:f4f140765442 | 10 | --------------------- |
kanpapa | 0:f4f140765442 | 11 | p9 1 (D0) I/O |
kanpapa | 0:f4f140765442 | 12 | p10 2 (D1) I/O |
kanpapa | 0:f4f140765442 | 13 | p11 3 (D2) I/O |
kanpapa | 0:f4f140765442 | 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 | |
kanpapa | 0:f4f140765442 | 43 | const uint8_t LOW = 0; |
kanpapa | 0:f4f140765442 | 44 | |
kanpapa | 0:f4f140765442 | 45 | unsigned char reverse_bit(unsigned char x){ |
kanpapa | 0:f4f140765442 | 46 | const unsigned int bit[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; |
kanpapa | 0:f4f140765442 | 47 | unsigned char y = 0; |
kanpapa | 0:f4f140765442 | 48 | for (int i = 0; i < 8; i++){ |
kanpapa | 0:f4f140765442 | 49 | if ((bit[i] & x) != 0){ |
kanpapa | 0:f4f140765442 | 50 | y |= bit[7-i]; |
kanpapa | 0:f4f140765442 | 51 | } |
kanpapa | 0:f4f140765442 | 52 | } |
kanpapa | 0:f4f140765442 | 53 | return(y); |
kanpapa | 0:f4f140765442 | 54 | } |
kanpapa | 0:f4f140765442 | 55 | |
kanpapa | 0:f4f140765442 | 56 | |
kanpapa | 0:f4f140765442 | 57 | |
kanpapa | 0:f4f140765442 | 58 | |
kanpapa | 0:f4f140765442 | 59 | // |
kanpapa | 0:f4f140765442 | 60 | // FONTX2 test routine |
kanpapa | 0:f4f140765442 | 61 | // @gingaxx |
kanpapa | 0:f4f140765442 | 62 | // |
kanpapa | 0:f4f140765442 | 63 | |
kanpapa | 0:f4f140765442 | 64 | //#define kanji_file "/local/SHMZN16X.FNT" |
kanpapa | 0:f4f140765442 | 65 | //#define kanji_file "/local/k12x10.fnt" |
kanpapa | 0:f4f140765442 | 66 | #define kanji_file "/local/J2KZN16A.FNT" |
kanpapa | 0:f4f140765442 | 67 | |
kanpapa | 0:f4f140765442 | 68 | int cx = 0; |
kanpapa | 0:f4f140765442 | 69 | int cy = 0; |
kanpapa | 0:f4f140765442 | 70 | int offsety = 0; |
kanpapa | 0:f4f140765442 | 71 | bool kstate = false; |
kanpapa | 0:f4f140765442 | 72 | unsigned char kbuf; |
kanpapa | 0:f4f140765442 | 73 | |
kanpapa | 0:f4f140765442 | 74 | |
kanpapa | 0:f4f140765442 | 75 | FILE *fp; //File open buffer |
kanpapa | 0:f4f140765442 | 76 | |
kanpapa | 0:f4f140765442 | 77 | unsigned short start[92], end[92]; |
kanpapa | 0:f4f140765442 | 78 | unsigned char font[64]; |
kanpapa | 0:f4f140765442 | 79 | |
kanpapa | 0:f4f140765442 | 80 | char Identifier[6+1]; |
kanpapa | 0:f4f140765442 | 81 | char FontName[8+1]; |
kanpapa | 0:f4f140765442 | 82 | unsigned char XSize; |
kanpapa | 0:f4f140765442 | 83 | unsigned char YSize; |
kanpapa | 0:f4f140765442 | 84 | unsigned char Size; |
kanpapa | 0:f4f140765442 | 85 | unsigned char CodeType; |
kanpapa | 0:f4f140765442 | 86 | unsigned char Tnum; |
kanpapa | 0:f4f140765442 | 87 | |
kanpapa | 0:f4f140765442 | 88 | #define FONT_XBYTE ((XSize + 7) >> 3) |
kanpapa | 0:f4f140765442 | 89 | #define FONT_YBYTE ((YSize + 7) >> 3) |
kanpapa | 0:f4f140765442 | 90 | |
kanpapa | 0:f4f140765442 | 91 | void kanji_init(){ |
kanpapa | 0:f4f140765442 | 92 | //move cursor |
kanpapa | 0:f4f140765442 | 93 | fp = fopen(kanji_file , "r"); |
kanpapa | 0:f4f140765442 | 94 | |
kanpapa | 0:f4f140765442 | 95 | if(!fp) { |
kanpapa | 0:f4f140765442 | 96 | printf("File could not be opened!\n"); |
kanpapa | 0:f4f140765442 | 97 | led1 = 1; |
kanpapa | 0:f4f140765442 | 98 | exit(1); |
kanpapa | 0:f4f140765442 | 99 | } |
kanpapa | 0:f4f140765442 | 100 | |
kanpapa | 0:f4f140765442 | 101 | fgets(Identifier, 6+1, fp); // FONTX2 |
kanpapa | 0:f4f140765442 | 102 | fgets(FontName, 8+1, fp); |
kanpapa | 0:f4f140765442 | 103 | fread(&XSize, 1, 1, fp); |
kanpapa | 0:f4f140765442 | 104 | fread(&YSize, 1, 1, fp); |
kanpapa | 0:f4f140765442 | 105 | fread(&CodeType, 1, 1, fp); |
kanpapa | 0:f4f140765442 | 106 | fread(&Tnum, 1, 1, fp); |
kanpapa | 0:f4f140765442 | 107 | |
kanpapa | 0:f4f140765442 | 108 | printf("Identifier: %s\n\r",Identifier); |
kanpapa | 0:f4f140765442 | 109 | printf("FontName: %s\n\r",FontName); |
kanpapa | 0:f4f140765442 | 110 | printf("XSize: %d\n\r",XSize); |
kanpapa | 0:f4f140765442 | 111 | printf("YSize: %d\n\r",YSize); |
kanpapa | 0:f4f140765442 | 112 | printf("CodeType: %d\n\r",CodeType); |
kanpapa | 0:f4f140765442 | 113 | printf("Tnum: %d\n\r",Tnum); |
kanpapa | 0:f4f140765442 | 114 | |
kanpapa | 0:f4f140765442 | 115 | // Table read |
kanpapa | 0:f4f140765442 | 116 | for(int a=0;a< Tnum ;a++){ |
kanpapa | 0:f4f140765442 | 117 | fread(&start[a],1,2,fp); |
kanpapa | 0:f4f140765442 | 118 | fread(&end[a] ,1,2,fp); |
kanpapa | 0:f4f140765442 | 119 | } |
kanpapa | 0:f4f140765442 | 120 | } |
kanpapa | 0:f4f140765442 | 121 | |
kanpapa | 0:f4f140765442 | 122 | //Kanji puts cr = kanji cord |
kanpapa | 0:f4f140765442 | 123 | void k_puts(int cr){ |
kanpapa | 0:f4f140765442 | 124 | |
kanpapa | 0:f4f140765442 | 125 | const unsigned char bit_chk[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; |
kanpapa | 0:f4f140765442 | 126 | |
kanpapa | 0:f4f140765442 | 127 | //kanji address |
kanpapa | 0:f4f140765442 | 128 | int c = 0; |
kanpapa | 0:f4f140765442 | 129 | int adrs = 0; |
kanpapa | 0:f4f140765442 | 130 | while(cr > start[c]){ |
kanpapa | 0:f4f140765442 | 131 | if(cr > end[c]){ |
kanpapa | 0:f4f140765442 | 132 | adrs += end[c]-start[c]+1; |
kanpapa | 0:f4f140765442 | 133 | } else { |
kanpapa | 0:f4f140765442 | 134 | adrs += cr - start[c]; |
kanpapa | 0:f4f140765442 | 135 | } |
kanpapa | 0:f4f140765442 | 136 | c++; |
kanpapa | 0:f4f140765442 | 137 | } |
kanpapa | 0:f4f140765442 | 138 | c--; |
kanpapa | 0:f4f140765442 | 139 | printf("C=%d,adrs=%d cr=%X \r\n",c,adrs,cr); |
kanpapa | 0:f4f140765442 | 140 | |
kanpapa | 0:f4f140765442 | 141 | // Kanji image Read |
kanpapa | 0:f4f140765442 | 142 | fseek( fp, Tnum*4+18+32*adrs, SEEK_SET ); |
kanpapa | 0:f4f140765442 | 143 | fread( &font, 1, 32, fp); |
kanpapa | 0:f4f140765442 | 144 | |
kanpapa | 0:f4f140765442 | 145 | // debug dump |
kanpapa | 0:f4f140765442 | 146 | for (int s = 0; s < 32 ; s++){ |
kanpapa | 0:f4f140765442 | 147 | printf(" %02x ",font[s]); |
kanpapa | 0:f4f140765442 | 148 | } |
kanpapa | 0:f4f140765442 | 149 | printf("\r\n"); |
kanpapa | 0:f4f140765442 | 150 | |
kanpapa | 0:f4f140765442 | 151 | // kanji put |
kanpapa | 0:f4f140765442 | 152 | c = 0; |
kanpapa | 0:f4f140765442 | 153 | unsigned int vfd_address = cx * 8 * 16 + cy * 2; |
kanpapa | 0:f4f140765442 | 154 | //printf("VFD address: %04x\r\n",vfd_address); |
kanpapa | 0:f4f140765442 | 155 | |
kanpapa | 0:f4f140765442 | 156 | int n = 0; |
kanpapa | 0:f4f140765442 | 157 | for (int j = 0; j < 2 ; j++) { |
kanpapa | 0:f4f140765442 | 158 | for (int x = 0; x < 8; x++) { |
kanpapa | 0:f4f140765442 | 159 | //printf("set VFD address: %04x\r\n",vfd_address); |
kanpapa | 0:f4f140765442 | 160 | vfd.set_write_read_address(vfd_address); |
kanpapa | 0:f4f140765442 | 161 | int m = 0; |
kanpapa | 0:f4f140765442 | 162 | for (int k = 0; k < 2 ; k++) { |
kanpapa | 0:f4f140765442 | 163 | unsigned int d = 0; |
kanpapa | 0:f4f140765442 | 164 | for (int i = 0; i < 8; i++) { |
kanpapa | 0:f4f140765442 | 165 | if (font[m * 2 + j] & bit_chk[x]) { |
kanpapa | 0:f4f140765442 | 166 | //printf("BIT on!\r\n"); |
kanpapa | 0:f4f140765442 | 167 | d = d | 1; |
kanpapa | 0:f4f140765442 | 168 | } |
kanpapa | 0:f4f140765442 | 169 | if (i < 7) { |
kanpapa | 0:f4f140765442 | 170 | d = d << 1; |
kanpapa | 0:f4f140765442 | 171 | } |
kanpapa | 0:f4f140765442 | 172 | //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 | 173 | m++; |
kanpapa | 0:f4f140765442 | 174 | } |
kanpapa | 0:f4f140765442 | 175 | //printf("send_data: %02x\r\n",d); |
kanpapa | 0:f4f140765442 | 176 | vfd.send_data(d); |
kanpapa | 0:f4f140765442 | 177 | } |
kanpapa | 0:f4f140765442 | 178 | vfd_address = vfd_address + 8; |
kanpapa | 0:f4f140765442 | 179 | } |
kanpapa | 0:f4f140765442 | 180 | n++; |
kanpapa | 0:f4f140765442 | 181 | } |
kanpapa | 0:f4f140765442 | 182 | |
kanpapa | 0:f4f140765442 | 183 | #ifdef TATEGAKI // tategaki |
kanpapa | 0:f4f140765442 | 184 | for (int x = 0; x < 16; x++){ |
kanpapa | 0:f4f140765442 | 185 | //printf("set VFD address: %04x\r\n",vfd_address); |
kanpapa | 0:f4f140765442 | 186 | //printf("send_data: font[%d] = %02x\r\n",x,font[c]); |
kanpapa | 0:f4f140765442 | 187 | vfd.set_write_read_address(vfd_address + 1); |
kanpapa | 0:f4f140765442 | 188 | vfd.send_data(reverse_bit(font[c])); |
kanpapa | 0:f4f140765442 | 189 | c++; |
kanpapa | 0:f4f140765442 | 190 | |
kanpapa | 0:f4f140765442 | 191 | //printf("set VFD address2: %04x\r\n",vfd_address); |
kanpapa | 0:f4f140765442 | 192 | //printf("send_data2: font[%d] = %02x\r\n",x,font[c]); |
kanpapa | 0:f4f140765442 | 193 | vfd.set_write_read_address(vfd_address); |
kanpapa | 0:f4f140765442 | 194 | vfd.send_data(reverse_bit(font[c])); |
kanpapa | 0:f4f140765442 | 195 | c++; |
kanpapa | 0:f4f140765442 | 196 | |
kanpapa | 0:f4f140765442 | 197 | vfd_address = vfd_address + 8; |
kanpapa | 0:f4f140765442 | 198 | } |
kanpapa | 0:f4f140765442 | 199 | #endif // TATEGAKI |
kanpapa | 0:f4f140765442 | 200 | |
kanpapa | 0:f4f140765442 | 201 | // move cursor |
kanpapa | 0:f4f140765442 | 202 | cx++; |
kanpapa | 0:f4f140765442 | 203 | if (cx >= 15){ //LF control |
kanpapa | 0:f4f140765442 | 204 | cx = 0; |
kanpapa | 0:f4f140765442 | 205 | cy++; |
kanpapa | 0:f4f140765442 | 206 | } |
kanpapa | 0:f4f140765442 | 207 | } |
kanpapa | 0:f4f140765442 | 208 | |
kanpapa | 0:f4f140765442 | 209 | void kanji_end(){ |
kanpapa | 0:f4f140765442 | 210 | fclose(fp); |
kanpapa | 0:f4f140765442 | 211 | } |
kanpapa | 0:f4f140765442 | 212 | |
kanpapa | 0:f4f140765442 | 213 | |
kanpapa | 0:f4f140765442 | 214 | void blink_LED() { |
kanpapa | 0:f4f140765442 | 215 | for (int i = 0 ; i < 5 ; i++) { |
kanpapa | 0:f4f140765442 | 216 | led4 = 1; |
kanpapa | 0:f4f140765442 | 217 | wait(0.2); |
kanpapa | 0:f4f140765442 | 218 | led4 = 0; |
kanpapa | 0:f4f140765442 | 219 | wait(0.2); |
kanpapa | 0:f4f140765442 | 220 | } |
kanpapa | 0:f4f140765442 | 221 | return; |
kanpapa | 0:f4f140765442 | 222 | } |
kanpapa | 0:f4f140765442 | 223 | |
kanpapa | 0:f4f140765442 | 224 | int main() { |
kanpapa | 0:f4f140765442 | 225 | |
kanpapa | 0:f4f140765442 | 226 | led1 = LOW; |
kanpapa | 0:f4f140765442 | 227 | led2 = LOW; |
kanpapa | 0:f4f140765442 | 228 | led3 = LOW; |
kanpapa | 0:f4f140765442 | 229 | led4 = LOW; |
kanpapa | 0:f4f140765442 | 230 | |
kanpapa | 0:f4f140765442 | 231 | // Start Sign |
kanpapa | 0:f4f140765442 | 232 | blink_LED(); |
kanpapa | 0:f4f140765442 | 233 | |
kanpapa | 0:f4f140765442 | 234 | vfd.cls(); |
kanpapa | 0:f4f140765442 | 235 | |
kanpapa | 0:f4f140765442 | 236 | // FONTX2 test |
kanpapa | 0:f4f140765442 | 237 | vfd.set_disp_start_address(0); // Display address: 000000H |
kanpapa | 0:f4f140765442 | 238 | vfd.luminance_adjustment(0x0f); // 100% |
kanpapa | 0:f4f140765442 | 239 | |
kanpapa | 0:f4f140765442 | 240 | kanji_init(); |
kanpapa | 0:f4f140765442 | 241 | printf("kanji_init()\r\n"); |
kanpapa | 0:f4f140765442 | 242 | |
kanpapa | 0:f4f140765442 | 243 | for (unsigned int kc = 0x8801; kc < 0x8820 ; kc++){ |
kanpapa | 0:f4f140765442 | 244 | k_puts(kc); // 8abf |
kanpapa | 0:f4f140765442 | 245 | } |
kanpapa | 0:f4f140765442 | 246 | |
kanpapa | 0:f4f140765442 | 247 | kanji_end(); |
kanpapa | 0:f4f140765442 | 248 | printf("kanji_end()\r\n"); |
kanpapa | 0:f4f140765442 | 249 | |
kanpapa | 0:f4f140765442 | 250 | // END Sign |
kanpapa | 0:f4f140765442 | 251 | blink_LED(); |
kanpapa | 0:f4f140765442 | 252 | } |