超乗合馬車電光掲示板用制御ソフトです。
LEDMatrix_MasterforBasya_codered_lpc1768/15x16fontsLib.cpp@1:8e2a7fdb3db8, 2014-04-26 (annotated)
- Committer:
- nameless129
- Date:
- Sat Apr 26 08:26:29 2014 +0000
- Revision:
- 1:8e2a7fdb3db8
- Parent:
- 0:23cd1be2a1c2
????v1.01
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nameless129 | 0:23cd1be2a1c2 | 1 | #include "mbed.h" |
nameless129 | 0:23cd1be2a1c2 | 2 | #include "displayCom.h" |
nameless129 | 0:23cd1be2a1c2 | 3 | #include "15x16fontsLib.h" |
nameless129 | 0:23cd1be2a1c2 | 4 | |
nameless129 | 0:23cd1be2a1c2 | 5 | SPI FontROM(p11, p12, p13); // mosi, miso, sclk |
nameless129 | 0:23cd1be2a1c2 | 6 | DigitalOut FontROM_CS(p14); |
nameless129 | 0:23cd1be2a1c2 | 7 | |
nameless129 | 1:8e2a7fdb3db8 | 8 | static unsigned char matrixdata[32]; |
nameless129 | 0:23cd1be2a1c2 | 9 | |
nameless129 | 1:8e2a7fdb3db8 | 10 | static void read_font(unsigned short code) { |
nameless129 | 0:23cd1be2a1c2 | 11 | unsigned char c1, c2, MSB,LSB; |
nameless129 | 0:23cd1be2a1c2 | 12 | uint32_t Address, seq; |
nameless129 | 0:23cd1be2a1c2 | 13 | |
nameless129 | 0:23cd1be2a1c2 | 14 | // SJIS to kuten code conversion |
nameless129 | 0:23cd1be2a1c2 | 15 | c1 = (code>>8); |
nameless129 | 0:23cd1be2a1c2 | 16 | c2 = (code & 0xFF); |
nameless129 | 0:23cd1be2a1c2 | 17 | seq = (c1<=159 ? c1-129 : c1-193)*188 + (c2<=126 ? c2-64 : c2-65); |
nameless129 | 0:23cd1be2a1c2 | 18 | MSB = seq / 94 + 1; |
nameless129 | 0:23cd1be2a1c2 | 19 | LSB = seq % 94 + 1; |
nameless129 | 0:23cd1be2a1c2 | 20 | Address = 0; |
nameless129 | 0:23cd1be2a1c2 | 21 | |
nameless129 | 0:23cd1be2a1c2 | 22 | if( MSB >= 1 && MSB <= 15 && LSB >= 1 && LSB <= 94) |
nameless129 | 0:23cd1be2a1c2 | 23 | Address =( (MSB - 1) * 94 + (LSB - 1))*32; |
nameless129 | 0:23cd1be2a1c2 | 24 | else if(MSB >= 16 && MSB <= 47 && LSB >= 1 && LSB <= 94) |
nameless129 | 0:23cd1be2a1c2 | 25 | Address =( (MSB - 16) * 94 + (LSB - 1))*32 + 0x0AA40L; |
nameless129 | 0:23cd1be2a1c2 | 26 | else if(MSB >= 48 && MSB <= 84 && LSB >= 1 && LSB <= 94) |
nameless129 | 0:23cd1be2a1c2 | 27 | Address = ((MSB - 48) * 94 + (LSB - 1))*32 + 0x21CDFL; |
nameless129 | 0:23cd1be2a1c2 | 28 | else if(MSB == 85 && LSB >= 1 && LSB <= 94) |
nameless129 | 0:23cd1be2a1c2 | 29 | Address = ((MSB - 85) * 94 + (LSB - 1))*32 + 0x3C4A0L; |
nameless129 | 0:23cd1be2a1c2 | 30 | else if(MSB >= 88 && MSB <= 89 && LSB >= 1 && LSB <= 94) |
nameless129 | 0:23cd1be2a1c2 | 31 | Address = ((MSB - 88) * 94 + (LSB - 1))*32 + 0x3D060L; |
nameless129 | 0:23cd1be2a1c2 | 32 | |
nameless129 | 0:23cd1be2a1c2 | 33 | // if ASCII code |
nameless129 | 0:23cd1be2a1c2 | 34 | int font_width; |
nameless129 | 0:23cd1be2a1c2 | 35 | if(code >= 0x20 && code <= 0x7F) { |
nameless129 | 0:23cd1be2a1c2 | 36 | Address = (code - 0x20)*16 + 255968; |
nameless129 | 0:23cd1be2a1c2 | 37 | font_width = 8; |
nameless129 | 0:23cd1be2a1c2 | 38 | } |
nameless129 | 0:23cd1be2a1c2 | 39 | else { |
nameless129 | 0:23cd1be2a1c2 | 40 | font_width = 16; |
nameless129 | 0:23cd1be2a1c2 | 41 | } |
nameless129 | 0:23cd1be2a1c2 | 42 | |
nameless129 | 0:23cd1be2a1c2 | 43 | // Deselect the device |
nameless129 | 0:23cd1be2a1c2 | 44 | FontROM_CS = 1; |
nameless129 | 0:23cd1be2a1c2 | 45 | |
nameless129 | 0:23cd1be2a1c2 | 46 | // Setup the spi for 8 bit data, high steady state clock |
nameless129 | 0:23cd1be2a1c2 | 47 | FontROM.format(8,3); |
nameless129 | 0:23cd1be2a1c2 | 48 | FontROM.frequency(1000000); |
nameless129 | 0:23cd1be2a1c2 | 49 | |
nameless129 | 0:23cd1be2a1c2 | 50 | // Select the device by seting chip select low |
nameless129 | 0:23cd1be2a1c2 | 51 | FontROM_CS = 0; |
nameless129 | 0:23cd1be2a1c2 | 52 | FontROM.write(0x03); // Read data byte |
nameless129 | 0:23cd1be2a1c2 | 53 | FontROM.write(Address>>16 & 0xff); |
nameless129 | 0:23cd1be2a1c2 | 54 | FontROM.write(Address>>8 & 0xff); |
nameless129 | 0:23cd1be2a1c2 | 55 | FontROM.write(Address & 0xff); |
nameless129 | 0:23cd1be2a1c2 | 56 | |
nameless129 | 0:23cd1be2a1c2 | 57 | // Send a dummy byte to receive the contents of the WHOAMI register |
nameless129 | 0:23cd1be2a1c2 | 58 | for(int i=0; i<(font_width*2); i++) |
nameless129 | 0:23cd1be2a1c2 | 59 | { |
nameless129 | 0:23cd1be2a1c2 | 60 | matrixdata[i]=FontROM.write(0x00); |
nameless129 | 0:23cd1be2a1c2 | 61 | } |
nameless129 | 0:23cd1be2a1c2 | 62 | |
nameless129 | 0:23cd1be2a1c2 | 63 | // Deselect the device |
nameless129 | 0:23cd1be2a1c2 | 64 | FontROM_CS = 1; |
nameless129 | 0:23cd1be2a1c2 | 65 | } |
nameless129 | 0:23cd1be2a1c2 | 66 | |
nameless129 | 1:8e2a7fdb3db8 | 67 | static void draw_kanji_15x16(int pos_x, int font_width) |
nameless129 | 0:23cd1be2a1c2 | 68 | { |
nameless129 | 0:23cd1be2a1c2 | 69 | for(int i=0; i<font_width; i++) |
nameless129 | 0:23cd1be2a1c2 | 70 | { |
nameless129 | 0:23cd1be2a1c2 | 71 | if( ((signed int)(15-i+pos_x) >= 0) && ((15-i+pos_x) <= (DISPLAY_XSIZE-1)) ) |
nameless129 | 0:23cd1be2a1c2 | 72 | { |
nameless129 | 0:23cd1be2a1c2 | 73 | ImageBuf[15-i+pos_x] = matrixdata[i]; |
nameless129 | 0:23cd1be2a1c2 | 74 | ImageBuf[15-i+pos_x] |= matrixdata[i+font_width]<<8; |
nameless129 | 0:23cd1be2a1c2 | 75 | } |
nameless129 | 0:23cd1be2a1c2 | 76 | } |
nameless129 | 0:23cd1be2a1c2 | 77 | } |
nameless129 | 0:23cd1be2a1c2 | 78 | |
nameless129 | 1:8e2a7fdb3db8 | 79 | void drawStr15x16(char *str ,unsigned int pos_x) |
nameless129 | 0:23cd1be2a1c2 | 80 | { |
nameless129 | 0:23cd1be2a1c2 | 81 | unsigned char f_SJISChar = 0; |
nameless129 | 0:23cd1be2a1c2 | 82 | unsigned char c = 0; |
nameless129 | 0:23cd1be2a1c2 | 83 | unsigned int SJISChar = 0; |
nameless129 | 0:23cd1be2a1c2 | 84 | unsigned int CountChar = 0; |
nameless129 | 0:23cd1be2a1c2 | 85 | |
nameless129 | 0:23cd1be2a1c2 | 86 | c = *str; |
nameless129 | 0:23cd1be2a1c2 | 87 | while(c != '\0') |
nameless129 | 0:23cd1be2a1c2 | 88 | { |
nameless129 | 0:23cd1be2a1c2 | 89 | //2バイト文字の判定 |
nameless129 | 0:23cd1be2a1c2 | 90 | if( ((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xfc)) && f_SJISChar != 1 ) |
nameless129 | 0:23cd1be2a1c2 | 91 | { |
nameless129 | 0:23cd1be2a1c2 | 92 | SJISChar = c; |
nameless129 | 0:23cd1be2a1c2 | 93 | f_SJISChar = 1; |
nameless129 | 0:23cd1be2a1c2 | 94 | } |
nameless129 | 0:23cd1be2a1c2 | 95 | else if(f_SJISChar == 1) |
nameless129 | 0:23cd1be2a1c2 | 96 | { |
nameless129 | 0:23cd1be2a1c2 | 97 | SJISChar = (SJISChar<<8) | c; |
nameless129 | 0:23cd1be2a1c2 | 98 | f_SJISChar = 0; |
nameless129 | 0:23cd1be2a1c2 | 99 | read_font(SJISChar); |
nameless129 | 0:23cd1be2a1c2 | 100 | draw_kanji_15x16(pos_x-CountChar*8,16); |
nameless129 | 0:23cd1be2a1c2 | 101 | CountChar+=2; |
nameless129 | 0:23cd1be2a1c2 | 102 | } |
nameless129 | 0:23cd1be2a1c2 | 103 | else //ASCII文字 |
nameless129 | 0:23cd1be2a1c2 | 104 | { |
nameless129 | 0:23cd1be2a1c2 | 105 | SJISChar = c; |
nameless129 | 0:23cd1be2a1c2 | 106 | f_SJISChar = 0; |
nameless129 | 0:23cd1be2a1c2 | 107 | read_font(SJISChar); |
nameless129 | 0:23cd1be2a1c2 | 108 | draw_kanji_15x16(pos_x-CountChar*8, 8); |
nameless129 | 0:23cd1be2a1c2 | 109 | CountChar++; |
nameless129 | 0:23cd1be2a1c2 | 110 | } |
nameless129 | 0:23cd1be2a1c2 | 111 | str++; |
nameless129 | 0:23cd1be2a1c2 | 112 | c = *str; |
nameless129 | 0:23cd1be2a1c2 | 113 | } |
nameless129 | 0:23cd1be2a1c2 | 114 | } |