Sim mbed
/
FontTest3
Diff: main.cpp
- Revision:
- 0:304c871df0a8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Dec 06 16:28:01 2009 +0000 @@ -0,0 +1,115 @@ +#include "mbed.h" +#include "spilcd.h" +#include "kfont8.h" + +#define countof(x) ( sizeof(x) / sizeof(x[0]) ) + +SPILCD lcd(p21, p22, p23, p11, p12, p13); + +int csrx = 0; +int csry = 0; +int offsety = 0; +bool kstate = false; +unsigned char kbuf; + +void locate(int x, int y){ + csrx = x; + csry = y; + if(csrx < 0) csrx = 0; + if(csry < 0) csry = 0; + csrx &= 31; + csry &= 7; + lcd.moveto(csrx << 3, (offsety + csry) & 7); +}; + +void scroll(void){ + int i; + offsety = (offsety + 1) & 7; + lcd.cmd(0x40 | offsety << 3); + lcd.moveto(0, (offsety + 7) & 7); + for(i = 0; i < 128; i++) lcd.write(0); +} + +void newline(void){ + csrx = 0; + if(++csry == 8){ + scroll(); + csry = 7; + } + locate(csrx, csry); +} + +// draw 4x8 font +void drawfont4(unsigned char c){ + const unsigned char *p = &font4[c << 2]; + lcd.write(p[0]); + lcd.write(p[1]); + lcd.write(p[2]); + lcd.write(p[3]); + // cursor control + if(++csrx == 32) newline(); +} + +const unsigned char *findface(unsigned short c){ + const unsigned char *p = NULL; + int i, sum; + for(sum = i = 0; i < countof(font8table); i++){ + if(font8table[i].start <= c && c <= font8table[i].end){ + p = &font8[(sum + c - font8table[i].start) << 3]; + break; + } + sum += font8table[i].end - font8table[i].start + 1; + } + return p; +} + +// draw 8x8 font +void drawkanji(unsigned short c){ + const unsigned char *p = findface(c); + if(p == NULL) return; + + if(csrx >= 31) newline(); + lcd.write(p[0]); + lcd.write(p[1]); + lcd.write(p[2]); + lcd.write(p[3]); + lcd.write(p[4]); + lcd.write(p[5]); + lcd.write(p[6]); + lcd.write(p[7]); + csrx += 2; + if(csrx == 32) newline(); +} + +void drawc(unsigned char c){ + if(kstate){ // 2nd byte of shift-jis + kstate = false; + drawkanji(kbuf << 8 | c); + } else if((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xfc)){ // 1st byte of shift-jis + kstate = true; + kbuf = c; + } else { // 4x8font + drawfont4(c); + } +} + +void draws(const unsigned char *s){ + unsigned char c; + while((c = *s++) != '\0') drawc(c); +} + +Serial sio(USBTX, USBRX); + +int main() { + unsigned char c; + + sio.baud(115200); + while(1){ + c = sio.getc(); + if(c == 0x0d){ + newline(); + } else { + drawc(c); + } + } +}