前回記事「LCDディスプレーを使う「表示可能文字を探る」に引き続きLCDディスプレーの使用方法の続編です。

今回は外字登録方法について記事を書いていきます。

温度センサーの温度表示にLCDを使う予定ですが温度の単位「摂氏℃、華氏℉」の記号が使用しているLCDモジュールには登録されてません。

ということで今回はこの2種類の記号(摂氏℃、華氏℉)を外字登録してみます。

外字登録の手順

外字登録エリアは文字コード:0x00~0x07の8か所あります。

文字コード表(下図)の赤枠エリア

 

このエリアはRAMエリアなので電源を切ると消失しますのでプログラムとしては毎回パターン登録する必要があります。

登録用関数createChar()を使ってパターン登録

byte charData[8] = {
    B11000,
    B11000,
    B00111,
    B00100,
    B00111,
    B00100,
    B00100,
  };
 lcd.createChar(1, charData);

createChar()関数の書式は、

createChar(uint8_t location, uint8_t charmap[])で、

  • uint8_t型のlocationでビットパターンを登録する場所(0x00~0x07)のどれかを指定する。(上記サンプルでは0x01を指定)
  • uint8_t型のcharmap[]配列で5×7マトリクスのビットパターンを指定する。(上記サンプルは℃を定義)

注)uint8_t型は符号無し8bitのデータ型です。(char型と同一、プログラムではbyte型を使用していますがこれも同じです、C言語ではデータ型を表すのに一意ではなく同じ内容の物なのに何種類もあります)

外字登録(℉、℃)プログラム

では、実際に登録&表示させるプログラムを作成してみました。

  • 文字コード:0x01に℉を登録
  • 文字コード:0x02に℃を登録

スケッチファイル名:characterCreate_degree

#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>
LiquidCrystal_PCF8574 lcd(0x3f);  // set the LCD address to 0x3f

void setup() {
  Wire.begin();
  Wire.beginTransmission(0x3f);
  lcd.begin(16, 2); // initialize the lcd
  byte charData_1[8] = {
    B11000,
    B11000,
    B00111,
    B00100,
    B00111,
    B00100,
    B00100,
  };
  byte charData_2[8] = {
    B11000,
    B11000,
    B00111,
    B01000,
    B01000,
    B01000,
    B00111,
  };
  lcd.createChar(1, charData_1);
  lcd.createChar(2, charData_2);
  lcd.clear();
  lcd.home();
  lcd.setBacklight(255);
  lcd.write(1);
  lcd.write(2);
}

void loop() {


}

補足

通常は℃、℉の双方とも全角文字としてPCでは使うのですが、今回は半角(5×7ドット)記号扱いで外字登録してます、そのため左上の「゜」が潰れてしまってますがイメージ的には分かるので許容範囲と思ってます。

どうしても潰さないで表示をしたいということであれば2文字を使う方法もあります。(下記)

“゜”(0xDF) + “C” (0x43)