電子工作をエンジョイする!
イーフェローズ

     
 

グラフィックLCDモジュール(TOPWAY LM320240CFW)を使ってみる

 
     
 

TOPWAYのLM320240CFWというグラフィックLCDが入手できたので試してみたいと思います。なかなかの解像度があり、バックライトもついていて視認性も悪くないです。

※注意:マイコンボードは3.3Vを使用して下さい。

 
 
 
接続状態   配線例
     
 
外観図   接続ハーネス図面
 
   
  ■□使用機器□■  
 

使用機器は下記のとおり。他、パソコンや電源、PICKIT2又はPICKIT3も当然ながら必要です。使い方はいたってシンプル。
lm320240cfw.cをmain.cの頭でインクルードし、起動時にlcd_ini()で初期化します。

テキストを表示する場合は、
lm320240cfw_line = 0;で、表示する行位置を指定し、
lm320240cfw_cursor = 0; で、横位置を指定し、
printf(lcd_char,"27| AN0 = %04lumV , RA1 = %u ",analog_value,port1_ra1);で、テキストデータをバッファに展開し、
lcd_buffer_set(lm320240cfw_line);で、バッファデータをポートから出力します。

イメージを表示させる場合は、
lm320240cfw_line = 0;で、表示する行位置を指定し、
lcd_bufferを直接修正するか set_dot関数を使ってイメージデータを作り、
lcd_buffer_set(lm320240cfw_line);で、バッファデータをポートから出力します。

 
     
 
LCDのデータシート LM320240CFW.zip
マイコンボード(PIC16F1947搭載) ZEATEC co.,ltd. ZT-PIC16F194701(3.3V仕様)
 
     
  プロジェクトファイルも含めたサンプル zt-16f194701_lm320240cfw.zip  
  接続ハーネスの図面 Harness_LM320240CFW.zip Harness_LM320240CFW LCD.pdf  
  開発環境:MPLAB_IDE_8_92 + CCS-C PCMコンパイラVer.4.132  
     
  lm320240cfw.cの中身。  
 
/*****************************************************************************************
グラフィックLCDモジュール(TOPWAY LM320240CFW)用ライブラリ 2017/08/04作成

□提供元
ZEATEC co.,ltd. 

□ご利用について
転載・無断使用可です。このライブラリを使用した上での不具合等に関しては、いかなる内容におい
ても一切の責任を追わないものとします。

□使用方法
lcd_ini()をスタートアップに入れ、用途に合わせて出力処理を定期的(0.1sec単位ぐらい)に実行す
る。出力処理についてはすべてのデータを出力するとリフレッシュに時間がかかるため必要な部分の
みの出力としたほうがいい。
フォントのデータはfont_data.cを修正することで記号なども追加できます。
テキストの場合は行番号を指定してからテキストを送信。
lm320240cfw_line = 0;
lm320240cfw_cursor = 0; 
printf(lcd_char,"27|                          AN0 = %04lumV , RA1 = %u  ",analog_value,port1_ra1);
lcd_buffer_set(lm320240cfw_line);
イメージの場合はset_dot()関数を使用するかlcd_bufferを直接更新してください。


□接続方法
RE0 = DB0
RE1 = DB1
RE2 = DB2
RE3 = DB3
RE4 = DB4
RE5 = DB5
RE6 = DB6
RE7 = DB7
RF0 = /WR
    0:Write enable input
RF1 = A0
    1: command write, display data or cursor add read 
    0: status flag read, display data or parameter write    
RF2 = /RES 1:Run 0:ini

上記以外の配線はLCDモジュール上またはハーネスによってVDDおよびVSSと接続する。
BLA = VDD
VSS to VOUT:VR47kohm V0:adjust
*****************************************************************************************/
//ポート設定
#define _WR PIN_F0
//#define _RD PIN_F1
//#define _CS PIN_F2
#define A0 PIN_F1
#define _RES PIN_F2
//#define A0 PIN_F3
//#define _RES PIN_F4

void lcd_ini();
void lcd_cmd(int cmd);
void lcd_data(int dat);
void lcd_write();
void set_dot(long x,int y,int value);

long lm320240cfw_cursor = 0;
int lm320240cfw_line = 0;

int lcd_buffer[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //40byt
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //80byt
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //120byt
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //160byt
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //200byt
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //240byt
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //280byt
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//320byt

//表示位置を指定して表示する
void lcd_buffer_set(int line){
    int tmp1 = 0;
    int x = 0;
    long y = line * 8;
    int width = 40;
    int high = 8;

    int i,j;
    long addr = 0;
    long tmp2 = 0;

    addr = y * 40;
    for(i=0;i<high;i++){
        lcd_cmd(0x46);
        lcd_data(addr);
        lcd_data(addr>>8);
        lcd_cmd(0x4c);
        lcd_cmd(0x42);
        for(j=0;j<width;j++){
            tmp1 = lcd_buffer[tmp2];
            lcd_data(tmp1);
            tmp2=tmp2+1;
        }
        addr = addr + 0x28;
    }
}

//指定位置にドット描画します。
//x:0〜319
//y:0〜7
void set_dot(long x,int y,int value){
    long tmp_x = x + (y * 320);
    int tmp_value = value;

    long tmp_bit = 0;
    int tmp1 = 0;
    long tmp_index = 0;

    if(tmp_x >= 8){

        tmp_bit = tmp_x % 8;
        tmp_index = (tmp_x - tmp_bit) / 8;
    }else{
        tmp_bit = tmp_x;
    }
    
    //反転
    if(tmp_bit == 7){      tmp_bit = 0;
    }else if(tmp_bit == 6){ tmp_bit = 1;
    }else if(tmp_bit == 5){ tmp_bit = 2;
    }else if(tmp_bit == 4){ tmp_bit = 3;
    }else if(tmp_bit == 3){ tmp_bit = 4;
    }else if(tmp_bit == 2){ tmp_bit = 5;
    }else if(tmp_bit == 1){ tmp_bit = 6;
    }else if(tmp_bit == 0){ tmp_bit = 7;}

    if(tmp_value == 0){
        bit_clear(lcd_buffer[tmp_index],tmp_bit);
    }else{
        bit_set(lcd_buffer[tmp_index],tmp_bit);
    }
}

//テキストを表示する
void lcd_char(char c){

    int tmp1 = 0;
    
    for(tmp1 = 0;tmp1<5;tmp1++){
        set_dot(lm320240cfw_cursor+tmp1,0,bit_test(font[c-0x20][tmp1],0));  
        set_dot(lm320240cfw_cursor+tmp1,1,bit_test(font[c-0x20][tmp1],1));
        set_dot(lm320240cfw_cursor+tmp1,2,bit_test(font[c-0x20][tmp1],2));
        set_dot(lm320240cfw_cursor+tmp1,3,bit_test(font[c-0x20][tmp1],3));
        set_dot(lm320240cfw_cursor+tmp1,4,bit_test(font[c-0x20][tmp1],4));
        set_dot(lm320240cfw_cursor+tmp1,5,bit_test(font[c-0x20][tmp1],5));
        set_dot(lm320240cfw_cursor+tmp1,6,bit_test(font[c-0x20][tmp1],6));
        set_dot(lm320240cfw_cursor+tmp1,7,bit_test(font[c-0x20][tmp1],7));
    }

    //文字と文字の間に空白を入れる
    set_dot(lm320240cfw_cursor+5,0,0);  
    set_dot(lm320240cfw_cursor+5,1,0);
    set_dot(lm320240cfw_cursor+5,2,0);
    set_dot(lm320240cfw_cursor+5,3,0);
    set_dot(lm320240cfw_cursor+5,4,0);
    set_dot(lm320240cfw_cursor+5,5,0);
    set_dot(lm320240cfw_cursor+5,6,0);
    set_dot(lm320240cfw_cursor+5,7,0);

    //1文字分カーソル位置を残す
    lm320240cfw_cursor = lm320240cfw_cursor + 6;
}

//LCDにコマンド送信
void lcd_cmd(int cmd){
    output_bit(_WR,1); // init all control signal
    //output_bit(_RD,1);//省略
    output_bit(A0,1);// for command
    output_e(cmd);//LCDBUS = Command;
    //output_bit(_CS,0);// enable the access 省略
    output_bit(_WR,0);//_WR = 0;
    output_bit(_WR,1);//_WR = 1;
    //output_bit(_CS,1);// disable the access 省略
}

//LCDにデータ送信
void lcd_data(int dat){
    output_bit(_WR,1);//_WR = 1;                // init all control signal
    //output_bit(_RD,1);//省略
    output_bit(A0,0);//A0  = 0;                // for diaplay data
    output_e(dat);//LCDBUS = DData;
    //output_bit(_CS,0);//enable the access 省略
    output_bit(_WR,0);//_WR = 0;
    output_bit(_WR,1);//_WR = 1;
    //output_bit(_CS,1);// disable the access 省略
}

//LCDを初期化
void lcd_ini(){

    //ポート初期値
    output_bit(_RES,1);//_RES   = 1;
    //output_bit(_CS,0);//_CS     = 1;
    //output_bit(_RD,1);//_RD     = 1;
    output_bit(_WR,1);//_WR     = 1;
    output_bit(A0,1);//A0      = 1;

    output_e(0xff);//LCDBUS  = 0xff;         // pull up data bus
    
    //LCD初期化処理
    output_bit(_RES,1);//_RES    = 1;    // reset pin
    output_bit(_RES,0);//_RES    = 0;
    delay_ms(5);
    output_bit(_RES,1);//_RES    = 1;
    delay_ms(10);

    lcd_cmd(0x40);    //System set (8 byte parameter)
    delay_ms(1);
    lcd_data(0x30);   // IV=1(no line comp),ws=0(single drv),M2=0(8bit char height),M0=0(int CGROM), D4=1(by default)                    
    lcd_data(0x07);   // MOD=1 two frame AC drv, HorChar Size=8
    lcd_data(0x07);   // VerChar Size=8
    lcd_data(0x28);   // (320/8=40) char per line
    lcd_data(0x47);   // 23+blanking (frame freq = 66Hz (clk ratio=1/4  @ 10MHz)
    lcd_data(0xf6);   // (240-1=239) line per screen
    lcd_data(0x28);   // Virtual screen width LSB
    lcd_data(0x00);   // Virtual screen width MSB
    
    lcd_cmd(0x59);    // Display ON/OFF(1 byte parameter)
    lcd_data(0x04);   // SAD1=on, cursor=off
        
    lcd_cmd(0x44);    //Scroll (10 byte parmeter)
    lcd_data(0x00);   // SAD1 start ADD LSB
    lcd_data(0x00);   // SAD1 start ADD MSB
    lcd_data(0xEF);   // SAD1 block size(no.of line-1)
    lcd_data(0x00);   // SAD2 start ADD LSB 
    lcd_data(0x00);   // SAD2 start ADD MSB
    lcd_data(0xEF);   // SAD2 block size(no.of line-1)
    lcd_data(0x00);   // SAD3 start ADD LSB
    lcd_data(0x00);   // SAD3 start ADD MSB
    lcd_data(0x00);   // SAD4 start ADD LSB
    lcd_data(0x00);   // SAD4 start ADD MSB
    
    lcd_cmd(0x5D);    //CSRFORM (2 byte parmeter)
    lcd_data(0x07);   // cursor width = 8
    lcd_data(0x17);   // CM=1, for graphic mode, cursor height = 8        
    
    lcd_cmd(0x4C);    // CSRDIR (0 byte parmeter) to the right side

    lcd_cmd(0x5B);    // OVLAY (1 byte parmeter)
    lcd_data(0x05);   // 0v=0(2layer),DM1=0(blk3 for text),DM0=1(blk1 for graphic),layers combine=01(XOR) 

    lcd_cmd(0x5A);    // HDOT SCR (1 byte parmeter)
    lcd_data(0x00);   // no scroll

    lcd_cmd(0x60);    // GRAYSCALE (1 byte parmeter)
    lcd_data(0x00);   // 1bpp
}

void lcd_clear(){
    int tmp1 = 0;
    int tmp_pat = 0xaa;
    int x = 0;
    long y = 0;// * 8;
    int width = 40;
    int high = 8;

    int i,j;
    long addr = 0;
    long tmp2 = 0;

    for(tmp1 = 0;tmp1<30;tmp1++){
        y = tmp1 * 8;

        addr = y * 40;
        for(i=0;i<high;i++){
            lcd_cmd(0x46);
            lcd_data(addr);
            lcd_data(addr>>8);
            lcd_cmd(0x4c);
            lcd_cmd(0x42);
            for(j=0;j<width;j++){
                //tmp1 = lcd_buffer[tmp2];
                lcd_data(tmp_pat);
                tmp2=tmp2+1;
            }
            addr = addr + 0x28;
        }
    }
}
 
     
 


 
個人情報の取り扱いについて | 特定商取引法に関する表示
Copyright (C) 2011 E-Fellows All Rights Reserved.