先日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 件のコメント:
コメントを投稿