this is kazushi's branch of AD128160
Fork of AD128160 by
Diff: s_Lcd.cpp
- Revision:
- 4:1f72df1a88e0
- Parent:
- 3:f5576943e216
- Child:
- 5:39b01a6f0f75
--- a/s_Lcd.cpp Sat Oct 08 23:51:33 2011 +0000 +++ b/s_Lcd.cpp Sun Oct 23 02:06:34 2011 +0000 @@ -1,9 +1,35 @@ #include "mbed.h" -Serial device(p9, p10); // tx, rx -//Serial pc(USBTX, USBRX); // tx, rx +#define kanji_file "/local/SHMZN16X.FNT" +//#defin kanji_file "/local/k12x10.fnt" + +Serial device(p9, p10); // tx, rx LCD DigitalOut rst(p20); //P20 --> LCD RST (Reset) +LocalFileSystem local("local"); + +int cx = 0; +int cy = 0; +int offsety = 0; +bool kstate = false; +unsigned char kbuf; + + FILE *fp; //File open buffer + + unsigned short start[92], end[92]; + unsigned char font[64]; + + char Identifier[6+1]; + char FontName[8+1]; + unsigned char XSize; + unsigned char YSize; + unsigned char Size; + unsigned char CodeType; + unsigned char Tnum; + +#define FONT_XBYTE ((XSize + 7) >> 3) +#define FONT_YBYTE ((YSize + 7) >> 3) + void lcdspeed() { device.putc(0x55);// UART Speed 115200bps @@ -16,6 +42,35 @@ device.putc(0x4E); device.putc(0xAA); } +void bmp(int x0,int y0,int bmp_no) + { + unsigned char x0H; + unsigned char x0L; + unsigned char y0H; + unsigned char y0L; + unsigned char rH; + unsigned char rL; + unsigned char sum; + + x0H = x0 >> 8; + x0L = x0 & 0xFF; + y0H = y0 >> 8; + y0L = y0 & 0xff; + rH = bmp_no >> 8; + rL = bmp_no & 0xFF; + sum = x0H+x0L+y0H+y0L+rH+rL+0x09; + device.putc(0x55); + device.putc(0x07); + device.putc(0x09);//command + device.putc(x0H); + device.putc(x0L); + device.putc(y0H); + device.putc(y0L); + device.putc(rH); + device.putc(rL); + device.putc(sum); + device.putc(0xAA); + } void cls() { @@ -25,37 +80,44 @@ device.putc(0x55); device.putc(0xD5); device.putc(0xAA); - wait(0.1); } +void scroll(void){ -void s_Lcdinit() +} + + + + +void lcdputs( char data[98],int x,int y) { - device.baud(9600); - rst = 0; //Reset - wait(0.1); - rst = 1; - wait(0.1); - device.putc(0x55);//Back light On - device.putc(0x03); - device.putc(0x89); - device.putc(0x01); - device.putc(0x2C); - device.putc(0xB6); + unsigned char s=0; + unsigned char x0H; + unsigned char x0L; + unsigned char y0H; + unsigned char y0L; + unsigned char datalen; + x0H = x >> 8; + x0L = x & 0xFF; + y0H = y >> 8; + y0L = y & 0xFF; + datalen = strlen(data)+5; + device.putc(0x55); + device.putc(datalen); + device.putc(0x0B); // command ASCII Print + device.putc(x0H); //x upper 8bit + device.putc(x0L); //x low 8bit + device.putc(y0H); //y upper 8bit + device.putc(y0L); //y low 8bit + for(int a=0;a<strlen(data);a++) + { + device.putc(data[a]); + s = s+data[a]; + } + s = s+x0H+x0L+y0H+y0L+0x0B; + device.putc(s);//sumcheck device.putc(0xAA); - wait(0.1); - device.putc(0x55);// Clear - device.putc(0x02); - device.putc(0x80); - device.putc(0x55); - device.putc(0xD5); - device.putc(0xAA); - wait(0.1); - lcdspeed(); - wait(0.1); - device.baud(115200); } - void color(int rgb) { int c1; @@ -72,9 +134,27 @@ device.putc(c2); device.putc(sum); device.putc(0xAA); - //pc.printf("color %x %x %x ",c1,c2,sum); } +void newline(void){ + cx = 0; + cy += 16; + if(cy > 160){ + scroll(); + cy = 0; + color(0x001f); + cls(); + color(0xffff); + } +} + +void movecorsor(int a) + { + cx+=8*a; + if(cx>=128) newline(); + } + + void pixel(int x0,int y0) { unsigned char x0H; @@ -222,8 +302,7 @@ device.putc(sum); device.putc(0xAA); } - -void lcdprint(char data[98],int x,int y) +void lcdput(unsigned char data,int x,int y) { unsigned char s; unsigned char x0H; @@ -235,7 +314,7 @@ x0L = x & 0xFF; y0H = y >> 8; y0L = y & 0xFF; - datalen = strlen(data)+5; + datalen = 6; device.putc(0x55); device.putc(datalen); device.putc(0x0B); // command ASCII Print @@ -243,14 +322,125 @@ device.putc(x0L); //x low 8bit device.putc(y0H); //y upper 8bit device.putc(y0L); //y low 8bit - for(int a=0;a<strlen(data);a++) - { - device.putc(data[a]); - s = s+data[a]; -// pc.printf("%x:",data[a]); - } - s = s+x0H+x0L+y0H+y0L+0x0B; + device.putc(data); + s = data+x0H+x0L+y0H+y0L+0x0B; device.putc(s);//sumcheck device.putc(0xAA); -// pc.printf("print %x %x %x %x %x %d ",x0H,x0L,y0H,y0L,s,datalen); + } + + + +void kanji_init(){ + //move cursor + fp = fopen(kanji_file , "r"); + + + if(!fp) { + printf("File could not be opened!\n"); + exit(1); + } + + fgets(Identifier, 6+1, fp); // FONTX2 + fgets(FontName, 8+1, fp); + fread(&XSize, 1, 1, fp); + fread(&YSize, 1, 1, fp); + fread(&CodeType, 1, 1, fp); + fread(&Tnum, 1, 1, fp); + + // Table read + for(int a=0;a< Tnum ;a++){ + fread(&start[a],1,2,fp); + fread(&end[a] ,1,2,fp); + } +} + +//Kanji puts cr = kanji cord +void k_puts(int cr){ + //kanji address + int c; + int adrs; + c=0; + adrs=0; + while(cr>start[c]){ + if(cr > end[c]){ + adrs += end[c]-start[c]+1; + } + else{ + adrs += cr - start[c]; + } + c++; } + c--; + //printf("C=%d,adrs=%d cr=%X ",c,adrs,cr); + // Kanji image Read + fseek( fp, Tnum*4+18+32*adrs, SEEK_SET ); + fread(&font,1,32,fp); + // kanji put + c=0; + for (int y=0;y<16;y++){ + for (int x=0;x<8;x++){ + if((font[c] & 0x80)==0x80){ + pixel(cx+x,cy+y); + } + font[c] = font[c] << 1; + if((font[c+1] & 0x80)==0x80){ + pixel(cx+x+8,cy+y); + } + font[c+1] = font[c+1] << 1; + } + c+=2; + } + //move cursor + cx+=16; + if(cx>=128){ //LF control + cx=0; + cy+=16; + } +} + +void kanji_end(){ + fclose(fp); +} + +void drawc(unsigned char c){ + if(kstate){ // 2nd byte of shift-jis + kstate = false; + + k_puts(kbuf << 8 | c); + } else if((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xfc)){ // 1st byte of shift-jis + kstate = true; + kbuf = c; + } else { // Ascii Out + lcdput(c,cx,cy); + movecorsor(1); // 1byte Move + } +} + + +void s_Lcdinit() + { +// device.baud(9600); + rst = 0; //Reset + wait(0.1); + rst = 1; + wait(0.1); + lcdspeed();//speed 115200 + wait(0.1); + device.baud(115200); + device.putc(0x55);//Back light On + device.putc(0x03); + device.putc(0x89); + device.putc(0x01); + device.putc(0x2C); + device.putc(0xB6); + device.putc(0xAA); + bmp(0,0,1); + lcdputs(" GingaX ",20,140); + wait(3); + bmp(0,0,0); + wait(3); + cls(); + color(0xffff); + kanji_init(); + } +