作成日時:2015年06月28日 20時45分36秒
更新日時:2020年05月19日 08時39分37秒
この記事は9年ほど前に投稿されました。内容が古くなっている可能性がありますので更新日時にご注意ください。
前回までGPIOピンを直接切り替えて液晶を制御していましたが。実はwiringPiにはキャラクタ液晶制御用のライブラリが用意されているので、今回はそれを使ってみたいと思います。
前回まではGPIOのあ使い方を知る理由でライブラリを使わずに制御していましたが、実際に実用するコードを書く場合はライブラリを使ったほうが圧倒的に楽です。
ライブラリの仕様
- 日立製HD44780互換コントローラICを搭載したキャラクタ液晶を制御可能
- 書き込み命令のみ対応
- 4bit・8bit接続対応
- コンパイル時に -lwiringPiDev をつける
内部的にやっていることは基本的に前回のものとかわりません。
ライブラリの説明(使うところだけ抜粋)
lcdInit (int rows, int cols, int bits, int rs, int strb,int d0, int d1, int d2, int d3, int d4, int d5, int d6, int d7) ;
LCDを初期化する命令です。( )内にはLCDの仕様や接続したピンを指定します。
左から順に…
LCDの行
LCDの列
制御ビット数(4or8)←今回は4bitで
RS(レジスタ選択)ピン番号
イネーブル信号番号
その後7つはデータピンの番号(左詰め)
例えば、前回と同じ液晶、同じ接続で使う場合は
#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の電源オンオフ用
↓
lcdInit(2,16,4,9,0,2,3,12,13,0,0,0,0);
こうなります。これを何らかの整数型に入れてやります。今回はclcdという変数に入れました。
int clcd = lcdInit(2,16,4,9,0,2,3,12,13,0,0,0,0);
※バックライト制御と電源オンオフは別に制御する必要があります。
lcdHome (int handle)
LCDのカーソルを初期位置(1行目の1文字目)に戻す命令です。( )内に先ほどlcdInitを入れ込んだ変数を指定します。
lcdClear (int handle)
LCDの表示をクリアします。使い方は上の命令と同じです。
lcdPosition (int handle, int x, int y)
LCDの文字を表示する位置を指定します。
開始位置はx,yともに0からで、例えば1行目の1文字目に指定したい時は
lcdPosition (clcd,0,0);
となります。
lcdPutchar (int handle, uint8_t data)
lcdPuts (int handle, char *string)
lcdPrintf (int handle, char *message, …)
実際にLCDに文字を転送するコマンドです。lcdPuts,lcdPrintfが文字列をLCDに転送する命令で、単に文字列を送信するのがlcdPutsでLCDに簡単に文字列を送信できます。
単に文字を送信するならどちらでも、sprintfを介する場合はlcdPrintfを使ったほうが1行減らせますね。
lcdPutcharは8bitデータをそのまま転送する命令のようです。これを使うことはないと思いますが。外字領域を使うなら必要なのでしょうね。
コーディング
殆ど上で説明してしまったのでこの命令を使って時計を表示するコードを貼り付けておきますね。
#include <stdio.h>
#include <wiringPi.h>
#include <lcd.h> // キャラクタLCD用ライブラリ
#include <time.h> // 日時を扱うライブラリ
#define LCD_BK 8 // LCDのバックライト電源オンオフ用
#define LCD_ON 25 // LCDの電源オンオフ用
int main(void){
// 初期化
wiringPiSetup();
int clcd = lcdInit(2,16,4,9,0,2,3,12,13,0,0,0,0);
// 2=2行液晶
// 16=1行16文字
// 4=4bitモード
// 9=RS信号のポート(GPIOの9番ポート)
// 0=イネーブル信号のポート(0番ポート)
// その後のポート=パラレルデータ転送用GPIOポート番号
// 4bitなので5bit目からは指定なしの0
// 変数初期化
char CvChr[16],dec;
int i,n,bin[8],ln,p;
time_t now;
struct tm *local;
char wday_n[][3]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
digitalWrite(LCD_ON,0); // LCD電源オフ
digitalWrite(LCD_BK,0); // LCDバックライトオフ
delay(1000);
digitalWrite(LCD_ON,1); // LCD電源オン
digitalWrite(LCD_BK,1); // LCDバックライトオン
delay(40);
// 表示をクリアしてホーム位置に戻す
lcdClear(clcd);
lcdHome(clcd);
// カーソル表示設定
lcdCursor(clcd,0);
lcdCursorBlink(clcd,0);
// 表示用無限ループ
for(;;){
delay(100);
time(&now);
local=localtime(&now);
strftime(CvChr,16,"%Y.%m.%d(%a)",local);
lcdPosition(clcd,0,0);
lcdPrintf(clcd,CvChr);
strftime(CvChr,16,"%I:%M:%S %p %Z",local);
lcdPosition(clcd,0,1);
lcdPrintf(clcd,CvChr);
}
}