2017年1月15日日曜日

LPC1114FN28 I2Cキャラクタ液晶

先日SwitchScienceでいろいろ購入しました.



デュアルモータードライバTB6612FNG
I2C接続の小型LCD搭載ボード と5V版
レベルシフト回路搭載 microSDブレークアウト

無理やり3000円にするため,いろいろ買ってしまった.後悔はしていない.
とりあえず今回はLCDのテストをしてみたいと思います.



とっても小さくて良いです.サイトにあったArduinoのサンプルでテスト
させてみます.



動いた!以上!
しかし,使いたいのはLPC1114FN28なのでmbedでプログラムしなければならない.
一から作るのは非常に面倒だったので,サンプルの通信部分を書き直します.
以下コード

#include "mbed.h"
#define  byte unsigned char

I2C i2c(dp5, dp27);  //SDA,SCL
DigitalOut myled1(dp14); //dp13を出力に設定
const int addr = (0x3e<<1); //スレーブアドレス
byte contrast = 35;  // コントラスト(0~63)

void lcd_init( void );
void lcd_cmd(byte x) ;
void lcd_contdata(byte x);
void lcd_lastdata(byte x);
void lcd_printStr(const char *s);
void lcd_setCursor(byte x, byte y);

int main() {
    lcd_init();
    while(1) {
        lcd_setCursor(0, 0);
        lcd_printStr(" AQM0802A");
        lcd_setCursor(1, 1);
        lcd_printStr("  TEST  ");
        myled1 =  !myled1;
        wait(0.5);      //0.5秒待つ
    }
}

void lcd_init( void ){
  wait(0.5);
  //Wire.begin();
  lcd_cmd(0b00111000); // function set
  lcd_cmd(0b00111001); // function set
  lcd_cmd(0b00000100); // EntryModeSet
  lcd_cmd(0b00010100); // interval osc
  lcd_cmd(0b01110000 | (contrast & 0xF)); // contrast Low
  lcd_cmd(0b01011100 | ((contrast >> 4) & 0x3)); // contast High/icon/power
  lcd_cmd(0b01101100); // follower control
  wait(0.2);
  lcd_cmd(0b00111000); // function set
  lcd_cmd(0b00001100); // Display On
  lcd_cmd(0b00000001); // Clear Display
  wait(0.2);
}

void lcd_cmd(byte x) {
  //Wire.beginTransmission(I2Cadr);
  //Wire.write(0b00000000); // CO = 0,RS = 0
  //Wire.write(x);
  //Wire.endTransmission();
  char cmd[2];
  cmd[0] = 0x00;
  cmd[1] = x;
  i2c.write(addr, cmd, 2);
}

void lcd_contdata(byte x) {
  //Wire.write(0b11000000); // CO = 1, RS = 1
  //Wire.write(x);
  char cmd[2];
  cmd[0] = 0xc0;
  cmd[1] = x;
  i2c.write(addr, cmd, 2);
}

void lcd_lastdata(byte x) {
  //Wire.write(0b01000000); // CO = 0, RS = 1
  //Wire.write(x);
  char cmd[2];
  cmd[0] = 0x40;
  cmd[1] = x;
  i2c.write(addr, cmd, 2);
}

// 文字の表示
void lcd_printStr(const char *s) {
  //Wire.beginTransmission(I2Cadr);
  i2c.start();
  while (*s) {
    if (*(s + 1)) {
      lcd_contdata(*s);
    } else {
      lcd_lastdata(*s);
    }
    s++;
  }
  i2c.stop();
  //Wire.endTransmission();
}

// 表示位置の指定
void lcd_setCursor(byte x, byte y) {
  lcd_cmd(0x80 | (y * 0x40 + x));
}



動いた!と思いきや最初の一文字がずれるバグに遭遇.
スペース挿入で回避しています.まあヘッダを作るときにでも直すことにしましょう.


SPIでグラフィック液晶も動作させましたが,フォントを入れればならずプログラムも複雑です.
一方こちらはピンも少なく,プログラムも非常に単純になりました.
ロボットのデバック等,英数字しか扱わない環境ならこちらを用いたほうが良いでしょう.

0 件のコメント:

コメントを投稿