NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

LCDの使い方(AE-AQM1602A)カタカナの表示編

イメージ 1
I2C接続小型キャラクLCDモジュール(AE-AQM1602A)
 
 LCD(AE-AQM1602A)に、カタカナを表示してみました
 因みにArduinoIDEは保存名にせよプログラム中にせよ日本語アレルギーが有る様で一筋縄でカタカナは表示されませんでした

1. 接続

 Arduino UNOLCD(AE-AQM1602A)の接続はブレッドボードを使用します。
 接続図(Fritzing使用)を図1の様に描いてみました。
イメージ 3
図1:LCDとArduinoUNOとの接続

2. 普通にカタカナ出力・・・表示はエラー?

 下記プログラムの様に普通にカタカナを出力した結果が図2です。
 LCDモジュール(AE-AQM1602A)は半角カタカナに対応しているのですが、ArduinoIDEUTF-8で文字を符号化するため、半角カナは1バイトではなく3バイトで表現されてしまいます。
 そのためLCDモジュールが半角カナ表示に対応していても、文字列のエンコードが合わないため、図2の様にプラス2文字分文字化けした文字が付いて表示されます。

ArduinoIDE 1.6.12を使用して文字化けしましたが、ArduinoIDEのバージョンによっては半角カナの文字コードUTF-8から拡張ASCIIコードに変更され、文字化けしないものも有るようです。
//NOBのArduino日記!_AE-AQM1602Aの使い方_カタカナの表示1(20170323)
#include <Wire.h>//関数読み込み
String LCD_STRING; char s[16]; double SET; //変数の宣言

//コマンド書き込み
void writeCommand(byte command) {
  Wire.beginTransmission(0x3E);
  Wire.write(0x00);
  Wire.write(command);
  Wire.endTransmission(); delay(10);
}

//データ書き込み
void writeData(byte data) {
  Wire.beginTransmission(0x3E);
  Wire.write(0x40);
  Wire.write(data);
  Wire.endTransmission(); delay(1);
}

//LCDの1行目にデータ書き込み
void LCD_DISP_16_1(void) {
  writeCommand(0x80);//DDRAMアドレスを1行目先頭にセット
  for (int i = 0; i < 16; i++) {
    writeData(LCD_STRING[i]);
  }
}

//LCDの2行目にデータ書き込み
void LCD_DISP_16_2(void) {
  writeCommand(0x40 + 0x80); //DDRAMアドレスを2行目先頭にセット
  for (int i = 0; i < 16; i++) {
    writeData(LCD_STRING[i]);
  }
}

//液晶初期化
void setup() {
  Wire.begin(); delay(100);
  writeCommand(0x38); delay(20);
  writeCommand(0x39); delay(20);
  writeCommand(0x14); delay(20);
  writeCommand(0x7A); delay(20); //3.3V=0x73, 5V=0x7A
  writeCommand(0x54); delay(20); //3.3V=0x56, 5V=0x54
  writeCommand(0x6C); delay(20);
  writeCommand(0x38); delay(20);
  writeCommand(0x01); delay(20);
  writeCommand(0x0C); delay(20);
}

//LCD上段に「アイウエオ」を書込む
void loop() {
  LCD_STRING = "アイウエオ";
  LCD_DISP_16_1();
}//「φスアφスイφスウφスエφスオ」?と表示
イメージ 1
図1:プログラム例
イメージ 2
図2:プログラム実行結果・・・!?

3. カタカナ表示!

 LCDモジュールの使い方(AE-AQM1602A)基礎編より、各種カタカナのCGRAMdataが格納されているCGRAMaddressは分かっているのでそのアドレスを直に指定します!
 これで無事!?図3の様にカタカナがLCD上に表示されました
//NOBのArduino日記!_AE-AQM1602Aの使い方_カタカナの表示2(20170323)
#include <Wire.h>//関数読み込み
String LCD_STRING; char s[16]; double SET; //変数の宣言

//コマンド書き込み
void writeCommand(byte command) {
  Wire.beginTransmission(0x3E);
  Wire.write(0x00);
  Wire.write(command);
  Wire.endTransmission(); delay(10);
}

//データ書き込み
void writeData(byte data) {
  Wire.beginTransmission(0x3E);
  Wire.write(0x40);
  Wire.write(data);
  Wire.endTransmission(); delay(1);
}

//LCDの1行目にデータ書き込み
void LCD_DISP_16_1(void) {
  writeCommand(0x80);//DDRAMアドレスを1行目先頭にセット
  for (int i = 0; i < 16; i++) {
    writeData(LCD_STRING[i]);
  }
}

//LCDの2行目にデータ書き込み
void LCD_DISP_16_2(void) {
  writeCommand(0x40 + 0x80); //DDRAMアドレスを2行目先頭にセット
  for (int i = 0; i < 16; i++) {
    writeData(LCD_STRING[i]);
  }
}

//液晶初期化
void setup() {
  Wire.begin(); delay(100);
  writeCommand(0x38); delay(20);
  writeCommand(0x39); delay(20);
  writeCommand(0x14); delay(20);
  writeCommand(0x7A); delay(20); //3.3V=0x73, 5V=0x7A
  writeCommand(0x54); delay(20); //3.3V=0x56, 5V=0x54
  writeCommand(0x6C); delay(20);
  writeCommand(0x38); delay(20);
  writeCommand(0x01); delay(20);
  writeCommand(0x0C); delay(20);
}

//下段に「アイウエオ」を書込む
void loop() {
  writeCommand(0xC0);//DDRAMアドレスをLCD下段先頭にセット
  for (int i = 0; i < 5; i++) {
    writeData(0xB1 + i); //「アイウエオ」と表示!
  }
}
イメージ 1
図1:プログラム例
イメージ 3
図3:プログラム実行結果 成功

4. まとめ

 一応カタカナをLCDに表示出来ましたが、一文字づつCGRAMアドレスを調べなければならないので若干めんどくさいです
 私の使っているArduinoIDEのバージョンは「1.6.12」ですが、ひょっとしたら最新のバージョンは対応しているかもしれないという事で、久しぶりにArduinoサイトを調べてみたら「ARDUINO WEB EDITOR」と言うなにやら凄そうな物を発見しました!
 これでArduinoIDEをインストールしなくても常に最新版がWEBブラウザ上で使えます!
 早速使って見ました

イメージ 4
図4:ARDUINO WEB EDITOR

ダメでした
どうやらLCD(AE-AQM1602A)でカタカナを表示したい時は、図3の方法で行くしかなさそうです 
 
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【LCDの使い方】目次に戻る