first commit

Dependents:   Aitendo_2P-REL225L01

LCD192GC00.cpp

Committer:
og
Date:
2016-09-30
Revision:
0:d5aa6eeefe77

File content as of revision 0:d5aa6eeefe77:

#include "LCD192GC00.h"
#include "ASCII12dot.h"     //ASCII 12x12dot

LCD192GC00::LCD192GC00(
    PinName rd, PinName wr, PinName rs, PinName cs, PinName rst,
    PinName d0, PinName d1, PinName d2, PinName d3,
    PinName d4, PinName d5, PinName d6, PinName d7
    ):
    _rd(rd), _wr(wr), _rs(rs), _cs(cs), _rst(rst),
    _d(d0, d1, d2, d3, d4, d5, d6, d7)
{
    
    _rd=1; 
    _wr=1;
    _rs=1;
    _cs=1;
    _rst = 1;

}

void LCD192GC00::_write(uint8_t rs, uint8_t d){
    _cs=0;
    _rd=1;
    _rs=rs;

    _d.output();
    _d=d;
    _wr=0;
    //_delay(1);
    _wr=1;

    _cs=1; 
}

void LCD192GC00::lcd_Init(){
    wait_ms(20);
    _rd = 1;
    _cs = 1;             // CS High
    _wr = 1;             // WR High
    _rst = 0;          // Reset LCD
    wait_ms(0x10);             // 1msec wait
    _rst = 1;          // Clear RESET
    wait_ms(25);               // 100msec wait

    lcd_cmd(0xB0);
    lcd_data(0xCA);
    lcd_data(0x90);
    lcd_data(0x37);
    lcd_data(0x01);
    lcd_data(0x48);
    lcd_data(0x01);
    lcd_data(0x40);
    lcd_data(0x04);
    lcd_data(0x00);
    lcd_data(0x00);
    
    lcd_cmd(0x26);
    lcd_data(0x01);
    
    lcd_cmd(0xB1);
    lcd_data(0x00);
    lcd_data(0x00);
    lcd_data(0x00);
    lcd_data(0x00);
    lcd_data(0x08);
    lcd_data(0x00);
    lcd_data(0x04);
    lcd_data(0x10);
    lcd_data(0x48);
    lcd_data(0x82);
    lcd_data(0x20);
    lcd_data(0x84);
    lcd_data(0x92);
    lcd_data(0x2A);
    lcd_data(0x52);
    lcd_data(0xAA);
    lcd_data(0x5A);
    lcd_data(0x55);
    lcd_data(0x2A);
    lcd_data(0x55);
    lcd_data(0xAE);
    lcd_data(0xFF);
    lcd_data(0xFE);
    lcd_data(0x00);
    lcd_data(0x00);
    lcd_data(0x00);
    lcd_data(0x00);
    lcd_data(0x00);
    lcd_data(0x00);
    lcd_data(0x04);
    
    lcd_cmd(0xB2);
    lcd_data(0x00);
    lcd_data(0x00);
    lcd_data(0x00);
    lcd_data(0x00);
    lcd_data(0x04);
    lcd_data(0x00);
    lcd_data(0x02);
    lcd_data(0x08);
    lcd_data(0x48);
    lcd_data(0x82);
    lcd_data(0x20);
    lcd_data(0x84);
    lcd_data(0x42);
    lcd_data(0x48);
    lcd_data(0x92);
    lcd_data(0x2A);
    lcd_data(0x52);
    lcd_data(0xAA);
    lcd_data(0x5A);
    lcd_data(0x55);
    lcd_data(0x2A);
    lcd_data(0x55);
    lcd_data(0xAE);
    lcd_data(0xFF);
    lcd_data(0xFE);
    lcd_data(0x00);
    lcd_data(0x00);
    lcd_data(0x00);
    lcd_data(0x00);
    lcd_data(0x00);
    lcd_data(0x00);
    lcd_data(0x04);
    
    lcd_cmd(MODE);          // Entry Mode
    lcd_data(0x29);
    //color mode
    lcd_cmd(COLMOD);
    lcd_data(0x05);         //65k color
    //Inteface mode
    lcd_cmd(IFMOD);
    lcd_data(0x00);         //8bit mode
    
    
    lcd_cmd(0xBA);
    lcd_data(0x55);
    lcd_data(0x55); 
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55); 
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55); 
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55); 
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55); 
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55); 
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55); 
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55); 
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55); 
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55); 
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55); 
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55);
    lcd_data(0x55); 
    lcd_data(0x55);
    
    
    //
    lcd_cmd(SLPOUT);
    lcd_cmd(DISON);         // 表示オン
};

void LCD192GC00::lcd_Clear(unsigned short Color){
    int i, j;

    lcd_cmd(PASET);         // ページ開始終了アドレスセット
    lcd_data(0);
    lcd_data(0x0C);
    lcd_data((unsigned char)((ENDPAGE+0x0C)>>8));
    lcd_data((unsigned char)(ENDPAGE+0x0C));
    lcd_cmd(CASET);         // コラム開始、終了アドレスセット
    lcd_data(0);
    lcd_data(0x08);
    lcd_data((unsigned char)((ENDCOL+0x08)>>8)); 
    lcd_data((unsigned char)(ENDCOL+0x08));
    lcd_cmd(RAMWR);
    for(j=0; j<4; j++){
        for(i=0; i<(ENDCOL+1)*80; i++){
            lcd_data((unsigned char)(Color>>8));
            lcd_data((unsigned char)Color);
        }
    }   
}

/***********************************
*  1ピクセル表示関数
*  座標は(0,0)-(161,131)  
***********************************/
void LCD192GC00::lcd_Pixel(short Xpos, short Ypos, unsigned short Color){

    if((Xpos<=ENDCOL) && (Ypos<=ENDPAGE)){
        Xpos += 0x08;
        Ypos += 0x0C;
        lcd_cmd(PASET);             // 行(RAW)アドレスセット
        lcd_data(Ypos>>8);
        lcd_data(Ypos);
        lcd_data(Ypos>>8);
        lcd_data(Ypos);
        lcd_cmd(CASET);             // 列(COLUM)アドレスセット
        lcd_data((unsigned char)((Xpos)>>8));
        lcd_data((unsigned char)(Xpos));
        lcd_data((unsigned char)(Xpos>>8));
        lcd_data((unsigned char)(Xpos));
        lcd_cmd(RAMWR);             // 1ピクセル書き込み
        lcd_data(Color >> 8);           // 16ビットカラー
        lcd_data(Color);
    }
}

/***************************
*  直線描画関数
***************************/
#define abs(a)  (((a)>0) ? (a) : -(a))
void LCD192GC00::lcd_Line(short x0, short y0, short x1, short y1, unsigned short Color)
{
    short steep, t;
    short deltax, deltay, error;
    short x, y;
    short ystep;
    
    y0=ENDPAGE-y0;                      // Y座標反転
    y1=ENDPAGE-y1;
    /// 差分の大きいほうを求める
    steep = (abs(y1 - y0) > abs(x1 - x0));
    /// x、yの入れ替え
    if(steep){
        t = x0; x0 = y0; y0 = t;
        t = x1; x1 = y1; y1 = t;
    }
    if(x0 > x1) {
        t = x0; x0 = x1; x1 = t;
        t = y0; y0 = y1; y1 = t;
    }
    deltax = x1 - x0;                       // 傾き計算 
    deltay = abs(y1 - y0);
    error = 0;
    y = y0;
    /// 傾きでステップの正負を切り替え
    if(y0 < y1) ystep = 1; else ystep = -1;
    /// 直線を点で描画
    for(x=x0; x<x1; x++) {
        if(steep) lcd_Pixel(y,x,Color); else lcd_Pixel(x,y,Color);
        error += deltay;
        if((error << 1) >= deltax) {
            y += ystep;
            error -= deltax;
        }
    }
}
/*****************************************
*  ANK文字表示関数 12x12ドット
*  320/12=26文字/行 240/14=17行
*  (0, 0) - (25, 16)の範囲
******************************************/
void LCD192GC00::lcd_Char(char colum, char line, unsigned char letter, unsigned short Color1, unsigned short Color2){
    unsigned char j, i, Mask;

    if((colum < XChar) && (line < YLine)){      // 範囲チェック
        // ANK表示出力 3バイトの2ラインずつを6回繰り返す
        for(j=0; j<6; j++){
            // 8ドット連続部の表示
            Mask = 0x80;
            for(i=0; i<8; i++){
                // 1ライン目前半8ドット表示
                if((ANKFont[letter][j*3] & Mask) != 0)
                    lcd_Pixel(colum*12+i, line*14+j*2, Color1);
                else
                    lcd_Pixel(colum*12+i, line*14+j*2, Color2);     //背景色
                // 2ライン目後半8ドット表示
                if((ANKFont[letter][j*3+2] & Mask) != 0)
                    lcd_Pixel(colum*12+i+4, line*14+j*2+1, Color1);
                else
                    lcd_Pixel(colum*12+i+4, line*14+j*2+1, Color2);     //背景色
                Mask = Mask >> 1;
            }
            // 分割部4ドットずつ表示
            Mask = 0x80;
            // 1ライン目後半4ドット表示
            for(i=0; i<4; i++){
                if((ANKFont[letter][j*3+1] & Mask) != 0)
                    lcd_Pixel(colum*12+i+8, line*14+j*2, Color1);
                else
                    lcd_Pixel(colum*12+i+8, line*14+j*2, Color2);    //背景色
                Mask = Mask >> 1;
            }
            // 2ライン目前半4ドット表示
            for(i=4; i<8; i++){
                if((ANKFont[letter][j*3+1] & Mask) != 0)
                    lcd_Pixel(colum*12+i-4, line*14+j*2+1, Color1);
                else
                    lcd_Pixel(colum*12+i-4, line*14+j*2+1, Color2);     //背景色
                Mask = Mask >> 1;
            }                           
        }
    }
}
/******************************
*   文字列描画関数
*   16文字x20行で指定
******************************/
void LCD192GC00::lcd_Str(char colum, char line, char *s, unsigned short Color1, unsigned short Color2)
{
        while (*s){
        lcd_Char(colum++, line, *s++, Color1, Color2);
        if(colum >= XChar){
            line++;
            colum = 0;
            if(line >= YLine)
                line = 0;
        }
    }
}

/*********************************************************
* イメージ表示関数
*  データは縦方向8ライン分が1バイトで格納されている
*   128×128/8=2kバイト/画面
*   グラフィック色(Color1)と背景色(Color2)両方を指定
**********************************************************/
void LCD192GC00::lcd_Image(char line, const unsigned char *ptr, unsigned short Color1, unsigned Color2)
{
    unsigned char Mask;
    short i, vline, colum;


    for(vline=line; vline<line+8; vline++){             // 全体は8行×8=64ライン
        for(colum=0; colum<128; colum++){       // 横は128ドットとする
            Mask = 0x01;                        // 下位ビットが上側
            for(i=0; i<8; i++){             // 1バイト分処理
                if(*ptr & Mask)             // ビットチェック
                    lcd_Pixel(colum+2, vline*8+i+1, Color1);
                else
                    lcd_Pixel(colum+2,vline*8+i+1,  Color2);                    
                Mask = Mask << 1;               // ビット位置シフト
            } 
            ptr++;                          // 次のデータ
        }
    }
}

void LCD192GC00::_delay(uint16_t t)
{
};