s_Lcd.cpp

Committer:
akira
Date:
2011-11-24
Revision:
6:96576c9c7828
Parent:
5:39b01a6f0f75

File content as of revision 6:96576c9c7828:

#include "mbed.h"

#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
    device.putc(0x05);
    device.putc(0x8B);
    device.putc(0x00);
    device.putc(0x01);
    device.putc(0xC2);
    device.putc(0x00);
    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()
    {
    device.putc(0x55);// Clear
    device.putc(0x02);
    device.putc(0x80);
    device.putc(0x55);
    device.putc(0xD5);
    device.putc(0xAA);
    }
void scroll(void){

}




void lcdputs( char data[98],int x,int y)
    {
    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);
    }

void color(int rgb)
    {
    int c1;
    int c2;
    int sum;
    
    c1=(rgb >> 8) & 0xff;
    c2=(rgb & 0xff);
    sum=c1+c2+0x84;
    device.putc(0x55);
    device.putc(0x03);
    device.putc(0x84);
    device.putc(c1);
    device.putc(c2);
    device.putc(sum);
    device.putc(0xAA);
    }

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;
    unsigned char x0L;
    unsigned char y0H;
    unsigned char y0L;
    unsigned char sum;

    x0H = x0 >> 8;
    x0L = x0 & 0xFF;
    y0H = y0 >> 8;
    y0L = y0 & 0xff;

    sum = x0H+x0L+y0H+y0L+0x01;
    device.putc(0x55);
    device.putc(0x05);
    device.putc(0x01);//command
    device.putc(x0H);
    device.putc(x0L);
    device.putc(y0H);
    device.putc(y0L);
    device.putc(sum);
    device.putc(0xAA);
    } 

void box(int x0,int y0,int x1,int y1,int paint)
    {
    unsigned char x0H;
    unsigned char x0L;
    unsigned char x1H;
    unsigned char x1L;
    unsigned char y0H;
    unsigned char y0L;
    unsigned char y1H;
    unsigned char y1L;
    unsigned char sum;
    unsigned char cmd;
    switch (paint)
    {
    case 1:
        cmd = 0x04;
        break;
    default:
        cmd =0x03;
        break;
    }
    x0H = x0 >> 8;
    x0L = x0 & 0xFF;
    y0H = y0 >> 8;
    y0L = y0 & 0xff;
    x1H = x1 >> 8;
    x1L = x1 & 0xFF;
    y1H = y1 >> 8;
    y1L = y1 & 0xff;
    sum = x0H+x0L+y0H+y0L+x1H+x1L+y1H+y1L+cmd;
    device.putc(0x55);//Box
    device.putc(0x09);
    device.putc(cmd);//command
    device.putc(x0H);
    device.putc(x0L);
    device.putc(y0H);
    device.putc(y0L);
    device.putc(x1H);
    device.putc(x1L);
    device.putc(y1H);
    device.putc(y1L);
    device.putc(sum);
    device.putc(0xAA);
    }

void circle(int x0,int y0,int r,int paint)
    {
    unsigned char x0H;
    unsigned char x0L;
    unsigned char y0H;
    unsigned char y0L;
    unsigned char rH;
    unsigned char rL;
    unsigned char sum;
    unsigned char cmd;
    switch (paint)
    {
    case 0:
        cmd = 0x05;
        break;
    case 1:
        cmd = 0x06;
        break;
    default:
        cmd =0x05;
        break;
    }
    x0H = x0 >> 8;
    x0L = x0 & 0xFF;
    y0H = y0 >> 8;
    y0L = y0 & 0xff;
    rH = r >> 8;
    rL = r & 0xFF;
    sum = x0H+x0L+y0H+y0L+rH+rL+cmd;
    device.putc(0x55);
    device.putc(0x07);
    device.putc(cmd);//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 line(int x0,int y0,int x1,int y1)
    {
    unsigned char x0H;
    unsigned char x0L;
    unsigned char x1H;
    unsigned char x1L;
    unsigned char y0H;
    unsigned char y0L;
    unsigned char y1H;
    unsigned char y1L;
    unsigned char sum;

    x0H = x0 >> 8;
    x0L = x0 & 0xFF;
    y0H = y0 >> 8;
    y0L = y0 & 0xff;
    x1H = x1 >> 8;
    x1L = x1 & 0xFF;
    y1H = y1 >> 8;
    y1L = y1 & 0xff;
    sum = x0H+x0L+y0H+y0L+x1H+x1L+y1H+y1L+02;
    device.putc(0x55);
    device.putc(0x09);
    device.putc(0x02);//command
    device.putc(x0H);
    device.putc(x0L);
    device.putc(y0H);
    device.putc(y0L);
    device.putc(x1H);
    device.putc(x1L);
    device.putc(y1H);
    device.putc(y1L);
    device.putc(sum);
    device.putc(0xAA);
    }
void lcdput(unsigned char data,int x,int y)
    {
    unsigned char s;
    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 = 6;
    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
    device.putc(data);
    s = data+x0H+x0L+y0H+y0L+0x0B;
    device.putc(s);//sumcheck
    device.putc(0xAA);
    }
    


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();
    }