Strawberry Linux LCD module interface

Dependents:   LCDExample

Committer:
yamaguch
Date:
Thu Dec 22 06:12:07 2011 +0000
Revision:
0:b3def1d4f466

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yamaguch 0:b3def1d4f466 1 #include "LCD.h"
yamaguch 0:b3def1d4f466 2 #include "mbed.h"
yamaguch 0:b3def1d4f466 3
yamaguch 0:b3def1d4f466 4 #define I2C_ADDR 0x7C
yamaguch 0:b3def1d4f466 5
yamaguch 0:b3def1d4f466 6 #define COLUMNS 16
yamaguch 0:b3def1d4f466 7 #define ROWS 2
yamaguch 0:b3def1d4f466 8
yamaguch 0:b3def1d4f466 9 #define COMMAND 0x00
yamaguch 0:b3def1d4f466 10 #define DATA 0x40
yamaguch 0:b3def1d4f466 11
yamaguch 0:b3def1d4f466 12 // Clear Display
yamaguch 0:b3def1d4f466 13 #define CLEAR_DISPLAY 0x01
yamaguch 0:b3def1d4f466 14
yamaguch 0:b3def1d4f466 15 // Return Home
yamaguch 0:b3def1d4f466 16 #define RETURN_HOME 0x02
yamaguch 0:b3def1d4f466 17
yamaguch 0:b3def1d4f466 18 // Display ON/OFF
yamaguch 0:b3def1d4f466 19 #define DISPLAY_ON_OFF_CONTROL 0x08
yamaguch 0:b3def1d4f466 20 #define DISPLAY_ON 1 << 2
yamaguch 0:b3def1d4f466 21 #define CURSOR_ON 1 << 1
yamaguch 0:b3def1d4f466 22 #define CURSOR_POSITION_ON 1 << 0
yamaguch 0:b3def1d4f466 23
yamaguch 0:b3def1d4f466 24 // Function set
yamaguch 0:b3def1d4f466 25 #define FUNCTION_SET 0x20
yamaguch 0:b3def1d4f466 26 #define DL 1 << 4 // 8 bit interface
yamaguch 0:b3def1d4f466 27 #define N 1 << 3 // 2 lines
yamaguch 0:b3def1d4f466 28 #define DH 1 << 2 // double height
yamaguch 0:b3def1d4f466 29 #define IS 1 << 0 // instruction table select
yamaguch 0:b3def1d4f466 30
yamaguch 0:b3def1d4f466 31 // Instruction Table 0 (IS = 0)
yamaguch 0:b3def1d4f466 32 #define CURSOR_OR_DISPLAY_SHIFT = 0x10;
yamaguch 0:b3def1d4f466 33 #define SC 1 << 3 // select screen (DISPLAY)
yamaguch 0:b3def1d4f466 34 #define RL 1 << 2 // moving to the right
yamaguch 0:b3def1d4f466 35
yamaguch 0:b3def1d4f466 36 // Instruction Table 1 (when IS = 1)
yamaguch 0:b3def1d4f466 37 #define INTERNAL_OSC_FREQUENCY 0x10
yamaguch 0:b3def1d4f466 38 #define BS 1 << 3 // 1/4 bias
yamaguch 0:b3def1d4f466 39 #define FR_MASK 7 // adjust internal OSC freq
yamaguch 0:b3def1d4f466 40 #define SET_ICON_ADDRESS 0x40
yamaguch 0:b3def1d4f466 41 #define AC_MASK 7 // set ICON addr in address counter
yamaguch 0:b3def1d4f466 42 #define POWER_ICON_CONTRAST_CONTROL 0x50
yamaguch 0:b3def1d4f466 43 #define ION 1 << 3 // Icon On
yamaguch 0:b3def1d4f466 44 #define BON 1 << 2 // Booster On
yamaguch 0:b3def1d4f466 45 #define CONTRAST_MASK1 3 // contrast (higher bits)
yamaguch 0:b3def1d4f466 46 #define FOLLOWER_CONTROL 0x60
yamaguch 0:b3def1d4f466 47 #define FON 1 << 3 // Follower On
yamaguch 0:b3def1d4f466 48 #define RAB_MASK 7 // Rab
yamaguch 0:b3def1d4f466 49 #define CONTRAST_SET 0x70
yamaguch 0:b3def1d4f466 50 #define CONTRAST_MASK0 15 // contrast (lower bits)
yamaguch 0:b3def1d4f466 51
yamaguch 0:b3def1d4f466 52 // Set DDRAM Address
yamaguch 0:b3def1d4f466 53 #define SET_DDRAM_ADDRESS 0x80
yamaguch 0:b3def1d4f466 54
yamaguch 0:b3def1d4f466 55 Serial pc(USBTX, USBRX);
yamaguch 0:b3def1d4f466 56 LCD::LCD(PinName sdaPin, PinName sclPin, PinName resetPin, PinName backlightPin, int contrast, bool cursor, bool blink)
yamaguch 0:b3def1d4f466 57 : _reset(resetPin), backlight(backlightPin), i2c(sdaPin, sclPin), contrast(contrast), cursor(cursor), blink(blink) {
yamaguch 0:b3def1d4f466 58 resetEnabled = resetPin != NC;
yamaguch 0:b3def1d4f466 59 backlightEnabled = backlightPin != NC;
yamaguch 0:b3def1d4f466 60 reset();
yamaguch 0:b3def1d4f466 61 }
yamaguch 0:b3def1d4f466 62
yamaguch 0:b3def1d4f466 63 void LCD::reset() {
yamaguch 0:b3def1d4f466 64 wait(0.015);
yamaguch 0:b3def1d4f466 65 if (resetEnabled)
yamaguch 0:b3def1d4f466 66 _reset = 0;
yamaguch 0:b3def1d4f466 67 wait(0.01);
yamaguch 0:b3def1d4f466 68 if (resetEnabled)
yamaguch 0:b3def1d4f466 69 _reset = 1;
yamaguch 0:b3def1d4f466 70 wait(0.05);
yamaguch 0:b3def1d4f466 71
yamaguch 0:b3def1d4f466 72 writeCommand(FUNCTION_SET | DL | N | (IS & 0));
yamaguch 0:b3def1d4f466 73 writeCommand(FUNCTION_SET | DL | N | (IS & 1));
yamaguch 0:b3def1d4f466 74 writeCommand(INTERNAL_OSC_FREQUENCY | BS | (FR_MASK & 0));
yamaguch 0:b3def1d4f466 75 writeCommand(CONTRAST_SET | (CONTRAST_MASK0 & contrast));
yamaguch 0:b3def1d4f466 76 writeCommand(POWER_ICON_CONTRAST_CONTROL | ION | BON | (CONTRAST_MASK1 & contrast >> 4));
yamaguch 0:b3def1d4f466 77 //writeCommand(FOLLOWER_CONTROL | FON | (RAB_MASK & 2));
yamaguch 0:b3def1d4f466 78 writeCommand(FOLLOWER_CONTROL | FON | (RAB_MASK & 4));
yamaguch 0:b3def1d4f466 79 wait(0.3);
yamaguch 0:b3def1d4f466 80
yamaguch 0:b3def1d4f466 81 writeCommand(DISPLAY_ON_OFF_CONTROL | DISPLAY_ON | (cursor ? CURSOR_ON : 0) | (blink ? CURSOR_POSITION_ON : 0));
yamaguch 0:b3def1d4f466 82 wait(0.002);
yamaguch 0:b3def1d4f466 83 cls();
yamaguch 0:b3def1d4f466 84 }
yamaguch 0:b3def1d4f466 85
yamaguch 0:b3def1d4f466 86 void LCD::display(int column, int row, int c) {
yamaguch 0:b3def1d4f466 87 writeCommand(column + 0x40 * row + 0x80);
yamaguch 0:b3def1d4f466 88 writeData(c);
yamaguch 0:b3def1d4f466 89 if (row == 1) row2[column] = c;
yamaguch 0:b3def1d4f466 90 }
yamaguch 0:b3def1d4f466 91
yamaguch 0:b3def1d4f466 92 void LCD::cls() {
yamaguch 0:b3def1d4f466 93 for (int i = 0; i < 16; i++) {
yamaguch 0:b3def1d4f466 94 writeCommand(FUNCTION_SET | DL | N | (IS & 1));
yamaguch 0:b3def1d4f466 95 writeCommand(SET_ICON_ADDRESS | i);
yamaguch 0:b3def1d4f466 96 //writeCommand(0x39);
yamaguch 0:b3def1d4f466 97 //writeCommand(0x40 + i);
yamaguch 0:b3def1d4f466 98 writeData(0);
yamaguch 0:b3def1d4f466 99 }
yamaguch 0:b3def1d4f466 100
yamaguch 0:b3def1d4f466 101 writeCommand(CLEAR_DISPLAY);
yamaguch 0:b3def1d4f466 102 wait(0.00164f);
yamaguch 0:b3def1d4f466 103 locate(0, 0);
yamaguch 0:b3def1d4f466 104 }
yamaguch 0:b3def1d4f466 105
yamaguch 0:b3def1d4f466 106 void LCD::locate(int column, int row) {
yamaguch 0:b3def1d4f466 107 this->column = column;
yamaguch 0:b3def1d4f466 108 this->row = row;
yamaguch 0:b3def1d4f466 109 }
yamaguch 0:b3def1d4f466 110
yamaguch 0:b3def1d4f466 111 int LCD::_putc(int value) {
yamaguch 0:b3def1d4f466 112 if (row >= ROWS) {
yamaguch 0:b3def1d4f466 113 scrollDown();
yamaguch 0:b3def1d4f466 114 row = 1;
yamaguch 0:b3def1d4f466 115 }
yamaguch 0:b3def1d4f466 116 if (value == '\n')
yamaguch 0:b3def1d4f466 117 column = COLUMNS;
yamaguch 0:b3def1d4f466 118 else
yamaguch 0:b3def1d4f466 119 display(column, row, value);
yamaguch 0:b3def1d4f466 120
yamaguch 0:b3def1d4f466 121 if (++column >= COLUMNS) {
yamaguch 0:b3def1d4f466 122 column = 0;
yamaguch 0:b3def1d4f466 123 row++;
yamaguch 0:b3def1d4f466 124 }
yamaguch 0:b3def1d4f466 125
yamaguch 0:b3def1d4f466 126 return value;
yamaguch 0:b3def1d4f466 127 }
yamaguch 0:b3def1d4f466 128
yamaguch 0:b3def1d4f466 129 int LCD::_getc() {
yamaguch 0:b3def1d4f466 130 return -1;
yamaguch 0:b3def1d4f466 131 }
yamaguch 0:b3def1d4f466 132
yamaguch 0:b3def1d4f466 133 void LCD::scrollDown() {
yamaguch 0:b3def1d4f466 134 writeCommand(SET_DDRAM_ADDRESS | 0x00);
yamaguch 0:b3def1d4f466 135 writeData(row2, sizeof(row2));
yamaguch 0:b3def1d4f466 136 memset(row2, ' ', sizeof(row2));
yamaguch 0:b3def1d4f466 137 writeCommand(SET_DDRAM_ADDRESS | 0x40);
yamaguch 0:b3def1d4f466 138 writeData(row2, sizeof(row2));
yamaguch 0:b3def1d4f466 139 }
yamaguch 0:b3def1d4f466 140
yamaguch 0:b3def1d4f466 141 void LCD::writeCommand(int command) {
yamaguch 0:b3def1d4f466 142 char buf[] = {COMMAND, command};
yamaguch 0:b3def1d4f466 143 i2c.write(I2C_ADDR, buf, sizeof(buf));
yamaguch 0:b3def1d4f466 144 }
yamaguch 0:b3def1d4f466 145
yamaguch 0:b3def1d4f466 146 void LCD::writeData(int data) {
yamaguch 0:b3def1d4f466 147 char buf[] = {DATA, data};
yamaguch 0:b3def1d4f466 148 i2c.write(I2C_ADDR, buf, sizeof(buf));
yamaguch 0:b3def1d4f466 149 }
yamaguch 0:b3def1d4f466 150
yamaguch 0:b3def1d4f466 151 void LCD::writeData(char data[], int length) {
yamaguch 0:b3def1d4f466 152 char buf[length + 1];
yamaguch 0:b3def1d4f466 153 buf[0] = DATA;
yamaguch 0:b3def1d4f466 154 memcpy(&buf[1], data, length);
yamaguch 0:b3def1d4f466 155 i2c.write(I2C_ADDR, buf, sizeof(buf));
yamaguch 0:b3def1d4f466 156 }
yamaguch 0:b3def1d4f466 157
yamaguch 0:b3def1d4f466 158 void LCD::showIcon(Icon icon) {
yamaguch 0:b3def1d4f466 159 switch (icon) {
yamaguch 0:b3def1d4f466 160 case ALL:
yamaguch 0:b3def1d4f466 161 for (int i = 0; i < 16; i++) {
yamaguch 0:b3def1d4f466 162 writeCommand(FUNCTION_SET | DL | N | (IS & 1));
yamaguch 0:b3def1d4f466 163 writeCommand(SET_ICON_ADDRESS | i);
yamaguch 0:b3def1d4f466 164 writeData(0x1F);
yamaguch 0:b3def1d4f466 165 }
yamaguch 0:b3def1d4f466 166 break;
yamaguch 0:b3def1d4f466 167 default:
yamaguch 0:b3def1d4f466 168 writeCommand(FUNCTION_SET | DL | N | (IS & 1));
yamaguch 0:b3def1d4f466 169 writeCommand(SET_ICON_ADDRESS | (icon >> 8));
yamaguch 0:b3def1d4f466 170 writeData(icon & 0xFF);
yamaguch 0:b3def1d4f466 171 }
yamaguch 0:b3def1d4f466 172 }
yamaguch 0:b3def1d4f466 173
yamaguch 0:b3def1d4f466 174 void LCD::hideIcon(Icon icon) {
yamaguch 0:b3def1d4f466 175 switch (icon) {
yamaguch 0:b3def1d4f466 176 case ALL:
yamaguch 0:b3def1d4f466 177 for (int i = 0; i < 16; i++) {
yamaguch 0:b3def1d4f466 178 writeCommand(FUNCTION_SET | DL | N | (IS & 1));
yamaguch 0:b3def1d4f466 179 writeCommand(SET_ICON_ADDRESS | i);
yamaguch 0:b3def1d4f466 180 writeData(0);
yamaguch 0:b3def1d4f466 181 }
yamaguch 0:b3def1d4f466 182 break;
yamaguch 0:b3def1d4f466 183 default:
yamaguch 0:b3def1d4f466 184 writeCommand(FUNCTION_SET | DL | N | (IS & 1));
yamaguch 0:b3def1d4f466 185 writeCommand(SET_ICON_ADDRESS | (icon >> 8));
yamaguch 0:b3def1d4f466 186 writeData(0);
yamaguch 0:b3def1d4f466 187 }
yamaguch 0:b3def1d4f466 188 }
yamaguch 0:b3def1d4f466 189
yamaguch 0:b3def1d4f466 190 void LCD::setBacklight(bool on) {
yamaguch 0:b3def1d4f466 191 if (backlightEnabled)
yamaguch 0:b3def1d4f466 192 backlight = on;
yamaguch 0:b3def1d4f466 193 }