Revision 0:b3def1d4f466, committed 2011-12-22
- Comitter:
- yamaguch
- Date:
- Thu Dec 22 06:12:07 2011 +0000
- Commit message:
Changed in this revision
diff -r 000000000000 -r b3def1d4f466 LCD.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/LCD.cpp Thu Dec 22 06:12:07 2011 +0000
@@ -0,0 +1,193 @@
+#include "LCD.h"
+#include "mbed.h"
+
+#define I2C_ADDR 0x7C
+
+#define COLUMNS 16
+#define ROWS 2
+
+#define COMMAND 0x00
+#define DATA 0x40
+
+// Clear Display
+#define CLEAR_DISPLAY 0x01
+
+// Return Home
+#define RETURN_HOME 0x02
+
+// Display ON/OFF
+#define DISPLAY_ON_OFF_CONTROL 0x08
+#define DISPLAY_ON 1 << 2
+#define CURSOR_ON 1 << 1
+#define CURSOR_POSITION_ON 1 << 0
+
+// Function set
+#define FUNCTION_SET 0x20
+#define DL 1 << 4 // 8 bit interface
+#define N 1 << 3 // 2 lines
+#define DH 1 << 2 // double height
+#define IS 1 << 0 // instruction table select
+
+// Instruction Table 0 (IS = 0)
+#define CURSOR_OR_DISPLAY_SHIFT = 0x10;
+#define SC 1 << 3 // select screen (DISPLAY)
+#define RL 1 << 2 // moving to the right
+
+// Instruction Table 1 (when IS = 1)
+#define INTERNAL_OSC_FREQUENCY 0x10
+#define BS 1 << 3 // 1/4 bias
+#define FR_MASK 7 // adjust internal OSC freq
+#define SET_ICON_ADDRESS 0x40
+#define AC_MASK 7 // set ICON addr in address counter
+#define POWER_ICON_CONTRAST_CONTROL 0x50
+#define ION 1 << 3 // Icon On
+#define BON 1 << 2 // Booster On
+#define CONTRAST_MASK1 3 // contrast (higher bits)
+#define FOLLOWER_CONTROL 0x60
+#define FON 1 << 3 // Follower On
+#define RAB_MASK 7 // Rab
+#define CONTRAST_SET 0x70
+#define CONTRAST_MASK0 15 // contrast (lower bits)
+
+// Set DDRAM Address
+#define SET_DDRAM_ADDRESS 0x80
+
+Serial pc(USBTX, USBRX);
+LCD::LCD(PinName sdaPin, PinName sclPin, PinName resetPin, PinName backlightPin, int contrast, bool cursor, bool blink)
+ : _reset(resetPin), backlight(backlightPin), i2c(sdaPin, sclPin), contrast(contrast), cursor(cursor), blink(blink) {
+ resetEnabled = resetPin != NC;
+ backlightEnabled = backlightPin != NC;
+ reset();
+}
+
+void LCD::reset() {
+ wait(0.015);
+ if (resetEnabled)
+ _reset = 0;
+ wait(0.01);
+ if (resetEnabled)
+ _reset = 1;
+ wait(0.05);
+
+ writeCommand(FUNCTION_SET | DL | N | (IS & 0));
+ writeCommand(FUNCTION_SET | DL | N | (IS & 1));
+ writeCommand(INTERNAL_OSC_FREQUENCY | BS | (FR_MASK & 0));
+ writeCommand(CONTRAST_SET | (CONTRAST_MASK0 & contrast));
+ writeCommand(POWER_ICON_CONTRAST_CONTROL | ION | BON | (CONTRAST_MASK1 & contrast >> 4));
+ //writeCommand(FOLLOWER_CONTROL | FON | (RAB_MASK & 2));
+ writeCommand(FOLLOWER_CONTROL | FON | (RAB_MASK & 4));
+ wait(0.3);
+
+ writeCommand(DISPLAY_ON_OFF_CONTROL | DISPLAY_ON | (cursor ? CURSOR_ON : 0) | (blink ? CURSOR_POSITION_ON : 0));
+ wait(0.002);
+ cls();
+}
+
+void LCD::display(int column, int row, int c) {
+ writeCommand(column + 0x40 * row + 0x80);
+ writeData(c);
+ if (row == 1) row2[column] = c;
+}
+
+void LCD::cls() {
+ for (int i = 0; i < 16; i++) {
+ writeCommand(FUNCTION_SET | DL | N | (IS & 1));
+ writeCommand(SET_ICON_ADDRESS | i);
+ //writeCommand(0x39);
+ //writeCommand(0x40 + i);
+ writeData(0);
+ }
+
+ writeCommand(CLEAR_DISPLAY);
+ wait(0.00164f);
+ locate(0, 0);
+}
+
+void LCD::locate(int column, int row) {
+ this->column = column;
+ this->row = row;
+}
+
+int LCD::_putc(int value) {
+ if (row >= ROWS) {
+ scrollDown();
+ row = 1;
+ }
+ if (value == '\n')
+ column = COLUMNS;
+ else
+ display(column, row, value);
+
+ if (++column >= COLUMNS) {
+ column = 0;
+ row++;
+ }
+
+ return value;
+}
+
+int LCD::_getc() {
+ return -1;
+}
+
+void LCD::scrollDown() {
+ writeCommand(SET_DDRAM_ADDRESS | 0x00);
+ writeData(row2, sizeof(row2));
+ memset(row2, ' ', sizeof(row2));
+ writeCommand(SET_DDRAM_ADDRESS | 0x40);
+ writeData(row2, sizeof(row2));
+}
+
+void LCD::writeCommand(int command) {
+ char buf[] = {COMMAND, command};
+ i2c.write(I2C_ADDR, buf, sizeof(buf));
+}
+
+void LCD::writeData(int data) {
+ char buf[] = {DATA, data};
+ i2c.write(I2C_ADDR, buf, sizeof(buf));
+}
+
+void LCD::writeData(char data[], int length) {
+ char buf[length + 1];
+ buf[0] = DATA;
+ memcpy(&buf[1], data, length);
+ i2c.write(I2C_ADDR, buf, sizeof(buf));
+}
+
+void LCD::showIcon(Icon icon) {
+ switch (icon) {
+ case ALL:
+ for (int i = 0; i < 16; i++) {
+ writeCommand(FUNCTION_SET | DL | N | (IS & 1));
+ writeCommand(SET_ICON_ADDRESS | i);
+ writeData(0x1F);
+ }
+ break;
+ default:
+ writeCommand(FUNCTION_SET | DL | N | (IS & 1));
+ writeCommand(SET_ICON_ADDRESS | (icon >> 8));
+ writeData(icon & 0xFF);
+ }
+}
+
+void LCD::hideIcon(Icon icon) {
+ switch (icon) {
+ case ALL:
+ for (int i = 0; i < 16; i++) {
+ writeCommand(FUNCTION_SET | DL | N | (IS & 1));
+ writeCommand(SET_ICON_ADDRESS | i);
+ writeData(0);
+ }
+ break;
+ default:
+ writeCommand(FUNCTION_SET | DL | N | (IS & 1));
+ writeCommand(SET_ICON_ADDRESS | (icon >> 8));
+ writeData(0);
+ }
+}
+
+void LCD::setBacklight(bool on) {
+ if (backlightEnabled)
+ backlight = on;
+}
\ No newline at end of file
diff -r 000000000000 -r b3def1d4f466 LCD.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/LCD.h Thu Dec 22 06:12:07 2011 +0000
@@ -0,0 +1,61 @@
+#ifndef MBED_LCD_H
+#define MBED_LCD_H
+
+#include "mbed.h"
+
+class LCD : public Stream {
+public:
+ enum Icon {
+ ANTENNA = 0x0010,
+ PHONE = 0x0210,
+ ALARM = 0x0410,
+ INPUT = 0x0610,
+ UP = 0x0710,
+ UPDOWN = 0x0718,
+ DOWN = 0x0708,
+ LOCK = 0x0910,
+ NO_SOUND = 0x0B10,
+ BATTERY1 = 0x0D12,
+ BATTERY2 = 0x0D1A,
+ BATTERY3 = 0x0D1E,
+ BATTERY0 = 0x0D02,
+ MARK = 0x0F10,
+ ALL = 0xFFFF
+ };
+
+ LCD(PinName sdaPin, PinName sclPin, PinName resetPin = NC, PinName backlightPin = NC,
+ int contrast = 32, bool cursor = false, bool blink = false);
+ void reset();
+ void cls();
+ void locate(int column, int row);
+ void showIcon(Icon icon);
+ void hideIcon(Icon icon);
+ void setBacklight(bool on);
+
+private:
+ virtual int _putc(int value);
+ virtual int _getc();
+
+ void display(int column, int row, int c);
+ void scrollDown();
+
+ void writeCommand(int command);
+ void writeData(int data);
+ void writeData(char data[], int length);
+
+ DigitalOut _reset;
+ DigitalOut backlight;
+
+ I2C i2c;
+
+ char contrast;
+ bool cursor;
+ bool blink;
+ bool resetEnabled;
+ bool backlightEnabled;
+ int column;
+ int row;
+ char row2[16];
+};
+
+#endif
\ No newline at end of file