さくらのジャンク箱ロゴ

Sakura87がほぼ月刊でお届けするPCや電子工作と写真の備忘録てきなブログ @なんと20周年

Raspberry Pi 2でキャラクタ液晶の制御(2)

この記事は9年ほど前に投稿されました。内容が古くなっている可能性がありますので更新日時にご注意ください。

IMG_4645_20150607

前回、キャラクタ液晶に文字を表示する作業をしてみました。
今回はそこからちょっと踏み込んでみましょう。

他の文字を表示してみる。

「0」だけではあれなので、他の文字も表示してみましょう。

code

この表の0~9、A~Fを表示してみたいと思います。
前回のコードの「0」を表示する命令のあとに以下の命令を追加します。

 LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,0,0,1);
 LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,0,1,0);
 LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,0,1,1);
 LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,1,0,0);
 LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,1,0,1);
 LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,1,1,0);
 LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,1,1,1);
 LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,1,0,0,0);
 LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,1,0,0,1);
 LCD_SET(1,0,0,1,0,0);LCD_SET(1,0,0,0,0,1);
 LCD_SET(1,0,0,1,0,0);LCD_SET(1,0,0,0,1,0);
 LCD_SET(1,0,0,1,0,0);LCD_SET(1,0,0,0,1,1);
 LCD_SET(1,0,0,1,0,0);LCD_SET(1,0,0,1,0,0);
 LCD_SET(1,0,0,1,0,0);LCD_SET(1,0,0,1,0,1);
 LCD_SET(1,0,0,1,0,0);LCD_SET(1,0,0,1,1,0);

これで0~9、A~Fを表示できるようになりました。

IMG_4652_20150609

この液晶は最大16文字なのでこれ以上文字を転送しても、何も表示されません(実際にはこれ以降もメモリは1行あと24文字あるので表示シフトコマンドを転送すると出てきます。40文字以上転送したらどうなるのかは試してないので分かりません。)これ以上表示する為には改行する必要がありますね。

改行してみる

では2行目に文字を転送するために「改行」をしてみます。
といっても、改行用のコマンドが用意されているわけではないので、転送先のアドレスを2行目行頭(&h40)に設定してやります。そのためには以下のコマンドを実行します。

//改行する
 LCD_SET(0,0,1,1,0,0);LCD_SET(0,0,0,0,0,0);

このコマンドはDDRAMのアドレスを&h40に設定するコマンドです。
001までがアドレス指定のコマンドで、その後の7bitがアドレスです。

※このアドレスは購入した液晶によって異なる場合がありますので、液晶の仕様書で確認してください。

改行した2行目には先ほど表示したもののA~Fを小文字にしたものを表示してみましょう。
(小文字にするのは命令がきちんと実行できているか見極めるため。他の文字でもいいのだけど、A~Fの上位4bitの3bit目を1にするだけで簡単なので。)

        // 0~9 abcdefを表示
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,0,0,0);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,0,0,1);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,0,1,0);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,0,1,1);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,1,0,0);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,1,0,1);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,1,1,0);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,1,1,1);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,1,0,0,0);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,1,0,0,1);
    LCD_SET(1,0,0,1,1,0);LCD_SET(1,0,0,0,0,1);
    LCD_SET(1,0,0,1,1,0);LCD_SET(1,0,0,0,1,0);
    LCD_SET(1,0,0,1,1,0);LCD_SET(1,0,0,0,1,1);
    LCD_SET(1,0,0,1,1,0);LCD_SET(1,0,0,1,0,0);
    LCD_SET(1,0,0,1,1,0);LCD_SET(1,0,0,1,0,1);
    LCD_SET(1,0,0,1,1,0);LCD_SET(1,0,0,1,1,0);

これで以下のように改行されて表示されるはずです。

IMG_4653_20150609

初期化の際にカーソルシフトを設定していれば連続して文字を転送するだけでこのように文字を文として表示できます。
最後にこの最後の表示(0~9、A~F/0~9、a~f)を行ったコードを載せておきます。

#include <stdio.h>
#include <wiringPi.h>
#include <string.h>

//LCDのピンを指定
// 4bit Mode
#define LCD_D7 13 // ここから
#define LCD_D6 12
#define LCD_D5 3
#define LCD_D4 2 // ここまでがデータ用
#define LCD_EN 0 // リード/ライト イネーブル信号
#define LCD_RW 7 // リード/ライト 選択信号
#define LCD_RS 9 // レジスタ選択信号
#define LCD_BK 8 // LCDのバックライト電源オンオフ用
#define LCD_ON 25 // LCDの電源オンオフ用

int main(void){
    
    // WiringPi初期化
    wiringPiSetup();

    // GPIOポートの設定
    pinMode(LCD_D7,OUTPUT);
    pinMode(LCD_D6,OUTPUT);
    pinMode(LCD_D5,OUTPUT);
    pinMode(LCD_D4,OUTPUT);
    pinMode(LCD_EN,OUTPUT);
    pinMode(LCD_RS,OUTPUT);
    pinMode(LCD_RW,OUTPUT);
    pinMode(LCD_ON,OUTPUT);
    pinMode(LCD_BK,OUTPUT);

    // 液晶リセット
    LCD_RES();
    
    // データ表示クリア
    LCD_SET(0,0,0,0,0,0);LCD_SET(0,0,0,0,0,1);
    
    // 0~9 ABCDEFを表示
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,0,0,0);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,0,0,1);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,0,1,0);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,0,1,1);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,1,0,0);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,1,0,1);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,1,1,0);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,1,1,1);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,1,0,0,0);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,1,0,0,1);
    LCD_SET(1,0,0,1,0,0);LCD_SET(1,0,0,0,0,1);
    LCD_SET(1,0,0,1,0,0);LCD_SET(1,0,0,0,1,0);
    LCD_SET(1,0,0,1,0,0);LCD_SET(1,0,0,0,1,1);
    LCD_SET(1,0,0,1,0,0);LCD_SET(1,0,0,1,0,0);
    LCD_SET(1,0,0,1,0,0);LCD_SET(1,0,0,1,0,1);
    LCD_SET(1,0,0,1,0,0);LCD_SET(1,0,0,1,1,0);

    //改行する
    LCD_SET(0,0,1,1,0,0);LCD_SET(0,0,0,0,0,0);
    
        // 0~9 abcdefを表示
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,0,0,0);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,0,0,1);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,0,1,0);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,0,1,1);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,1,0,0);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,1,0,1);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,1,1,0);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,0,1,1,1);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,1,0,0,0);
    LCD_SET(1,0,0,0,1,1);LCD_SET(1,0,1,0,0,1);
    LCD_SET(1,0,0,1,1,0);LCD_SET(1,0,0,0,0,1);
    LCD_SET(1,0,0,1,1,0);LCD_SET(1,0,0,0,1,0);
    LCD_SET(1,0,0,1,1,0);LCD_SET(1,0,0,0,1,1);
    LCD_SET(1,0,0,1,1,0);LCD_SET(1,0,0,1,0,0);
    LCD_SET(1,0,0,1,1,0);LCD_SET(1,0,0,1,0,1);
    LCD_SET(1,0,0,1,1,0);LCD_SET(1,0,0,1,1,0);

    
    }
    
    
int LCD_RES(void){
        
    digitalWrite(LCD_ON,0); // LCD電源オフ
    digitalWrite(LCD_BK,0); // LCDバックライトオフ
    delay(1);
    digitalWrite(LCD_ON,1); // LCD電源オン
    digitalWrite(LCD_BK,1); // LCDバックライトオン
    delay(40);

    LCD_SET(0,0,0,0,1,1); // 8bitモードに設定
    delay(4.1);
    LCD_SET(0,0,0,0,1,1); // 8bitモードに設定
    usleep(100);
    LCD_SET(0,0,0,0,1,1); // 8bitモードに設定
    LCD_SET(0,0,0,0,1,0); // 4bitモードに設定

    LCD_SET(0,0,0,0,1,0);LCD_SET(0,0,1,0,0,0); // 2行 普通フォントに設定
    LCD_SET(0,0,0,0,0,0);LCD_SET(0,0,1,0,0,0); // 液晶表示OFF
    LCD_SET(0,0,0,0,0,0);LCD_SET(0,0,0,0,0,1); // データクリア
    LCD_SET(0,0,0,0,0,0);LCD_SET(0,0,0,1,1,0); // カーソル右移動 左シフトに設定        
    LCD_SET(0,0,0,0,0,0);LCD_SET(0,0,1,1,0,0); // 液晶表示ON
        
}

int LCD_SET(int rs,int rw,int db7,int db6,int db5,int db4){
    
    // 一旦全ポートに0を書き込む
    digitalWrite(LCD_RW,0);
    digitalWrite(LCD_RS,0);
    digitalWrite(LCD_EN,0);
    nanosleep(60);
    digitalWrite(LCD_D7,0);
    digitalWrite(LCD_D6,0);
    digitalWrite(LCD_D5,0);
    digitalWrite(LCD_D4,0);
    usleep(40);
    
    // データ転送
    digitalWrite(LCD_RW,rw);
    digitalWrite(LCD_RS,rs);
    nanosleep(60);
    digitalWrite(LCD_EN,1);
    nanosleep(60);
    digitalWrite(LCD_D7,db7);
    digitalWrite(LCD_D6,db6);
    digitalWrite(LCD_D5,db5);
    digitalWrite(LCD_D4,db4);
    digitalWrite(LCD_EN,0);
    
    // 表示クリア、初期位置復帰命令の実行時間が
    // 1.52msと長いので、RSとR/Wの数値が0の命令は
    // 待ち時間を長く設定する。
    if((rw+rs)==0)usleep(1520);
    if((rw+rs)!=0)usleep(40);

}
総閲覧数:115 PV

“Raspberry Pi 2でキャラクタ液晶の制御(2)” への1件のコメント

  1. […] 前回、色々な文字を液晶に転送してみましたが、いちいちコードを調べて転送用コマンドに送信するのは正直手間ですよね。そこで今回は文字コードを転送するコマンドを実装してみたいと思います。 […]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください