transplanted from the original URL : https://github.com/adafruit/Adafruit-RGB-LCD-Shield-Library

Committer:
Komazawa_sun
Date:
Mon Nov 19 09:44:37 2018 +0000
Revision:
0:4f1c764a42d3
Transplanted lib(https://github.com/adafruit/Adafruit-RGB-LCD-Shield-Library)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Komazawa_sun 0:4f1c764a42d3 1 /***************************************************
Komazawa_sun 0:4f1c764a42d3 2 This is a library for the Adafruit RGB 16x2 LCD Shield
Komazawa_sun 0:4f1c764a42d3 3 Pick one up at the Adafruit shop!
Komazawa_sun 0:4f1c764a42d3 4 ---------> http://http://www.adafruit.com/products/714
Komazawa_sun 0:4f1c764a42d3 5
Komazawa_sun 0:4f1c764a42d3 6 The shield uses I2C to communicate, 2 pins are required to
Komazawa_sun 0:4f1c764a42d3 7 interface
Komazawa_sun 0:4f1c764a42d3 8 Adafruit invests time and resources providing this open source code,
Komazawa_sun 0:4f1c764a42d3 9 please support Adafruit and open-source hardware by purchasing
Komazawa_sun 0:4f1c764a42d3 10 products from Adafruit!
Komazawa_sun 0:4f1c764a42d3 11
Komazawa_sun 0:4f1c764a42d3 12 Written by Limor Fried/Ladyada for Adafruit Industries.
Komazawa_sun 0:4f1c764a42d3 13 BSD license, all text above must be included in any redistribution
Komazawa_sun 0:4f1c764a42d3 14 ****************************************************/
Komazawa_sun 0:4f1c764a42d3 15
Komazawa_sun 0:4f1c764a42d3 16
Komazawa_sun 0:4f1c764a42d3 17 #include "Adafruit_I2C_LCD.h"
Komazawa_sun 0:4f1c764a42d3 18
Komazawa_sun 0:4f1c764a42d3 19 #include <stdio.h>
Komazawa_sun 0:4f1c764a42d3 20 #include <string.h>
Komazawa_sun 0:4f1c764a42d3 21 #include <inttypes.h>
Komazawa_sun 0:4f1c764a42d3 22
Komazawa_sun 0:4f1c764a42d3 23 // When the display powers up, it is configured as follows:
Komazawa_sun 0:4f1c764a42d3 24 //
Komazawa_sun 0:4f1c764a42d3 25 // 1. Display clear
Komazawa_sun 0:4f1c764a42d3 26 // 2. Function set:
Komazawa_sun 0:4f1c764a42d3 27 // DL = 1; 8-bit interface data
Komazawa_sun 0:4f1c764a42d3 28 // N = 0; 1-line display
Komazawa_sun 0:4f1c764a42d3 29 // F = 0; 5x8 dot character font
Komazawa_sun 0:4f1c764a42d3 30 // 3. Display on/off control:
Komazawa_sun 0:4f1c764a42d3 31 // D = 0; Display off
Komazawa_sun 0:4f1c764a42d3 32 // C = 0; Cursor off
Komazawa_sun 0:4f1c764a42d3 33 // B = 0; Blinking off
Komazawa_sun 0:4f1c764a42d3 34 // 4. Entry mode set:
Komazawa_sun 0:4f1c764a42d3 35 // I/D = 1; Increment by 1
Komazawa_sun 0:4f1c764a42d3 36 // S = 0; No shift
Komazawa_sun 0:4f1c764a42d3 37 //
Komazawa_sun 0:4f1c764a42d3 38 // Note, however, that resetting the Arduino doesn't reset the LCD, so we
Komazawa_sun 0:4f1c764a42d3 39 // can't assume that its in that state when a sketch starts (and the
Komazawa_sun 0:4f1c764a42d3 40 // RGBLCDShield constructor is called).
Komazawa_sun 0:4f1c764a42d3 41
Komazawa_sun 0:4f1c764a42d3 42 Adafruit_I2C_LCD::Adafruit_I2C_LCD(I2C *master, uint8_t cols, uint8_t lines, uint8_t dotsize)
Komazawa_sun 0:4f1c764a42d3 43 {
Komazawa_sun 0:4f1c764a42d3 44 _i2c = new Adafruit_MCP23017(master);
Komazawa_sun 0:4f1c764a42d3 45 _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
Komazawa_sun 0:4f1c764a42d3 46
Komazawa_sun 0:4f1c764a42d3 47 // the I/O expander pinout
Komazawa_sun 0:4f1c764a42d3 48 _rs_pin = 15;
Komazawa_sun 0:4f1c764a42d3 49 _rw_pin = 14;
Komazawa_sun 0:4f1c764a42d3 50 _enable_pin = 13;
Komazawa_sun 0:4f1c764a42d3 51 _data_pins[0] = 12; // really d4
Komazawa_sun 0:4f1c764a42d3 52 _data_pins[1] = 11; // really d5
Komazawa_sun 0:4f1c764a42d3 53 _data_pins[2] = 10; // really d6
Komazawa_sun 0:4f1c764a42d3 54 _data_pins[3] = 9; // really d7
Komazawa_sun 0:4f1c764a42d3 55
Komazawa_sun 0:4f1c764a42d3 56 _button_pins[0] = 0;
Komazawa_sun 0:4f1c764a42d3 57 _button_pins[1] = 1;
Komazawa_sun 0:4f1c764a42d3 58 _button_pins[2] = 2;
Komazawa_sun 0:4f1c764a42d3 59 _button_pins[3] = 3;
Komazawa_sun 0:4f1c764a42d3 60 _button_pins[4] = 4;
Komazawa_sun 0:4f1c764a42d3 61
Komazawa_sun 0:4f1c764a42d3 62 begin(cols, lines, dotsize);
Komazawa_sun 0:4f1c764a42d3 63 }
Komazawa_sun 0:4f1c764a42d3 64
Komazawa_sun 0:4f1c764a42d3 65 Adafruit_I2C_LCD::~Adafruit_I2C_LCD()
Komazawa_sun 0:4f1c764a42d3 66 {
Komazawa_sun 0:4f1c764a42d3 67 delete _i2c;
Komazawa_sun 0:4f1c764a42d3 68 }
Komazawa_sun 0:4f1c764a42d3 69
Komazawa_sun 0:4f1c764a42d3 70 /********** high level commands, for the user! */
Komazawa_sun 0:4f1c764a42d3 71 void Adafruit_I2C_LCD::clear()
Komazawa_sun 0:4f1c764a42d3 72 {
Komazawa_sun 0:4f1c764a42d3 73 command(LCD_CLEARDISPLAY); // clear display, set cursor position to zero
Komazawa_sun 0:4f1c764a42d3 74 wait_us(2000); // this command takes a long time!
Komazawa_sun 0:4f1c764a42d3 75 }
Komazawa_sun 0:4f1c764a42d3 76
Komazawa_sun 0:4f1c764a42d3 77 void Adafruit_I2C_LCD::home()
Komazawa_sun 0:4f1c764a42d3 78 {
Komazawa_sun 0:4f1c764a42d3 79 command(LCD_RETURNHOME); // set cursor position to zero
Komazawa_sun 0:4f1c764a42d3 80 wait_us(2000); // this command takes a long time!
Komazawa_sun 0:4f1c764a42d3 81 }
Komazawa_sun 0:4f1c764a42d3 82
Komazawa_sun 0:4f1c764a42d3 83 void Adafruit_I2C_LCD::setCursor(uint8_t col, uint8_t row)
Komazawa_sun 0:4f1c764a42d3 84 {
Komazawa_sun 0:4f1c764a42d3 85 int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
Komazawa_sun 0:4f1c764a42d3 86 if ( row > _numlines ) {
Komazawa_sun 0:4f1c764a42d3 87 row = _numlines-1; // we count rows starting w/0
Komazawa_sun 0:4f1c764a42d3 88 }
Komazawa_sun 0:4f1c764a42d3 89
Komazawa_sun 0:4f1c764a42d3 90 command(LCD_SETDDRAMADDR | (col + row_offsets[row]));
Komazawa_sun 0:4f1c764a42d3 91 }
Komazawa_sun 0:4f1c764a42d3 92
Komazawa_sun 0:4f1c764a42d3 93 // Turn the display on/off (quickly)
Komazawa_sun 0:4f1c764a42d3 94 void Adafruit_I2C_LCD::noDisplay()
Komazawa_sun 0:4f1c764a42d3 95 {
Komazawa_sun 0:4f1c764a42d3 96 _displaycontrol &= ~LCD_DISPLAYON;
Komazawa_sun 0:4f1c764a42d3 97 command(LCD_DISPLAYCONTROL | _displaycontrol);
Komazawa_sun 0:4f1c764a42d3 98 }
Komazawa_sun 0:4f1c764a42d3 99 void Adafruit_I2C_LCD::display()
Komazawa_sun 0:4f1c764a42d3 100 {
Komazawa_sun 0:4f1c764a42d3 101 _displaycontrol |= LCD_DISPLAYON;
Komazawa_sun 0:4f1c764a42d3 102 command(LCD_DISPLAYCONTROL | _displaycontrol);
Komazawa_sun 0:4f1c764a42d3 103 }
Komazawa_sun 0:4f1c764a42d3 104
Komazawa_sun 0:4f1c764a42d3 105 // Turns the underline cursor on/off
Komazawa_sun 0:4f1c764a42d3 106 void Adafruit_I2C_LCD::noCursor()
Komazawa_sun 0:4f1c764a42d3 107 {
Komazawa_sun 0:4f1c764a42d3 108 _displaycontrol &= ~LCD_CURSORON;
Komazawa_sun 0:4f1c764a42d3 109 command(LCD_DISPLAYCONTROL | _displaycontrol);
Komazawa_sun 0:4f1c764a42d3 110 }
Komazawa_sun 0:4f1c764a42d3 111 void Adafruit_I2C_LCD::cursor()
Komazawa_sun 0:4f1c764a42d3 112 {
Komazawa_sun 0:4f1c764a42d3 113 _displaycontrol |= LCD_CURSORON;
Komazawa_sun 0:4f1c764a42d3 114 command(LCD_DISPLAYCONTROL | _displaycontrol);
Komazawa_sun 0:4f1c764a42d3 115 }
Komazawa_sun 0:4f1c764a42d3 116
Komazawa_sun 0:4f1c764a42d3 117 // Turn on and off the blinking cursor
Komazawa_sun 0:4f1c764a42d3 118 void Adafruit_I2C_LCD::noBlink()
Komazawa_sun 0:4f1c764a42d3 119 {
Komazawa_sun 0:4f1c764a42d3 120 _displaycontrol &= ~LCD_BLINKON;
Komazawa_sun 0:4f1c764a42d3 121 command(LCD_DISPLAYCONTROL | _displaycontrol);
Komazawa_sun 0:4f1c764a42d3 122 }
Komazawa_sun 0:4f1c764a42d3 123 void Adafruit_I2C_LCD::blink()
Komazawa_sun 0:4f1c764a42d3 124 {
Komazawa_sun 0:4f1c764a42d3 125 _displaycontrol |= LCD_BLINKON;
Komazawa_sun 0:4f1c764a42d3 126 command(LCD_DISPLAYCONTROL | _displaycontrol);
Komazawa_sun 0:4f1c764a42d3 127 }
Komazawa_sun 0:4f1c764a42d3 128
Komazawa_sun 0:4f1c764a42d3 129 // These commands scroll the display without changing the RAM
Komazawa_sun 0:4f1c764a42d3 130 void Adafruit_I2C_LCD::scrollDisplayLeft(void)
Komazawa_sun 0:4f1c764a42d3 131 {
Komazawa_sun 0:4f1c764a42d3 132 command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT);
Komazawa_sun 0:4f1c764a42d3 133 }
Komazawa_sun 0:4f1c764a42d3 134 void Adafruit_I2C_LCD::scrollDisplayRight(void)
Komazawa_sun 0:4f1c764a42d3 135 {
Komazawa_sun 0:4f1c764a42d3 136 command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT);
Komazawa_sun 0:4f1c764a42d3 137 }
Komazawa_sun 0:4f1c764a42d3 138
Komazawa_sun 0:4f1c764a42d3 139 // This is for text that flows Left to Right
Komazawa_sun 0:4f1c764a42d3 140 void Adafruit_I2C_LCD::leftToRight(void)
Komazawa_sun 0:4f1c764a42d3 141 {
Komazawa_sun 0:4f1c764a42d3 142 _displaymode |= LCD_ENTRYLEFT;
Komazawa_sun 0:4f1c764a42d3 143 command(LCD_ENTRYMODESET | _displaymode);
Komazawa_sun 0:4f1c764a42d3 144 }
Komazawa_sun 0:4f1c764a42d3 145
Komazawa_sun 0:4f1c764a42d3 146 // This is for text that flows Right to Left
Komazawa_sun 0:4f1c764a42d3 147 void Adafruit_I2C_LCD::rightToLeft(void)
Komazawa_sun 0:4f1c764a42d3 148 {
Komazawa_sun 0:4f1c764a42d3 149 _displaymode &= ~LCD_ENTRYLEFT;
Komazawa_sun 0:4f1c764a42d3 150 command(LCD_ENTRYMODESET | _displaymode);
Komazawa_sun 0:4f1c764a42d3 151 }
Komazawa_sun 0:4f1c764a42d3 152
Komazawa_sun 0:4f1c764a42d3 153 // This will 'right justify' text from the cursor
Komazawa_sun 0:4f1c764a42d3 154 void Adafruit_I2C_LCD::autoscroll(void)
Komazawa_sun 0:4f1c764a42d3 155 {
Komazawa_sun 0:4f1c764a42d3 156 _displaymode |= LCD_ENTRYSHIFTINCREMENT;
Komazawa_sun 0:4f1c764a42d3 157 command(LCD_ENTRYMODESET | _displaymode);
Komazawa_sun 0:4f1c764a42d3 158 }
Komazawa_sun 0:4f1c764a42d3 159
Komazawa_sun 0:4f1c764a42d3 160 // This will 'left justify' text from the cursor
Komazawa_sun 0:4f1c764a42d3 161 void Adafruit_I2C_LCD::noAutoscroll(void)
Komazawa_sun 0:4f1c764a42d3 162 {
Komazawa_sun 0:4f1c764a42d3 163 _displaymode &= ~LCD_ENTRYSHIFTINCREMENT;
Komazawa_sun 0:4f1c764a42d3 164 command(LCD_ENTRYMODESET | _displaymode);
Komazawa_sun 0:4f1c764a42d3 165 }
Komazawa_sun 0:4f1c764a42d3 166
Komazawa_sun 0:4f1c764a42d3 167 // Allows us to fill the first 8 CGRAM locations
Komazawa_sun 0:4f1c764a42d3 168 // with custom characters
Komazawa_sun 0:4f1c764a42d3 169 void Adafruit_I2C_LCD::createChar(uint8_t location, uint8_t charmap[])
Komazawa_sun 0:4f1c764a42d3 170 {
Komazawa_sun 0:4f1c764a42d3 171 location &= 0x7; // we only have 8 locations 0-7
Komazawa_sun 0:4f1c764a42d3 172 command(LCD_SETCGRAMADDR | (location << 3));
Komazawa_sun 0:4f1c764a42d3 173 for (int i=0; i<8; i++) {
Komazawa_sun 0:4f1c764a42d3 174 write(charmap[i]);
Komazawa_sun 0:4f1c764a42d3 175 }
Komazawa_sun 0:4f1c764a42d3 176 command(LCD_SETDDRAMADDR); // unfortunately resets the location to 0,0
Komazawa_sun 0:4f1c764a42d3 177 }
Komazawa_sun 0:4f1c764a42d3 178
Komazawa_sun 0:4f1c764a42d3 179 /*********** mid level commands, for sending data/cmds */
Komazawa_sun 0:4f1c764a42d3 180
Komazawa_sun 0:4f1c764a42d3 181 void Adafruit_I2C_LCD::command(uint8_t value)
Komazawa_sun 0:4f1c764a42d3 182 {
Komazawa_sun 0:4f1c764a42d3 183 send(value, LOW);
Komazawa_sun 0:4f1c764a42d3 184 }
Komazawa_sun 0:4f1c764a42d3 185
Komazawa_sun 0:4f1c764a42d3 186
Komazawa_sun 0:4f1c764a42d3 187 void Adafruit_I2C_LCD::write(uint8_t value)
Komazawa_sun 0:4f1c764a42d3 188 {
Komazawa_sun 0:4f1c764a42d3 189 send(value, HIGH);
Komazawa_sun 0:4f1c764a42d3 190 }
Komazawa_sun 0:4f1c764a42d3 191
Komazawa_sun 0:4f1c764a42d3 192 void Adafruit_I2C_LCD::print(char *array, size_t array_size)
Komazawa_sun 0:4f1c764a42d3 193 {
Komazawa_sun 0:4f1c764a42d3 194 for(size_t i = 0; i < array_size; i++){
Komazawa_sun 0:4f1c764a42d3 195 if(array[i] == '\0')
Komazawa_sun 0:4f1c764a42d3 196 break;
Komazawa_sun 0:4f1c764a42d3 197 send(array[i], HIGH);
Komazawa_sun 0:4f1c764a42d3 198 }
Komazawa_sun 0:4f1c764a42d3 199 }
Komazawa_sun 0:4f1c764a42d3 200
Komazawa_sun 0:4f1c764a42d3 201 /************ low level data pushing commands **********/
Komazawa_sun 0:4f1c764a42d3 202
Komazawa_sun 0:4f1c764a42d3 203 // little wrapper for i/o writes
Komazawa_sun 0:4f1c764a42d3 204 void Adafruit_I2C_LCD::_digitalWrite(uint8_t p, uint8_t d)
Komazawa_sun 0:4f1c764a42d3 205 {
Komazawa_sun 0:4f1c764a42d3 206 _i2c->digitalWrite(p, d);
Komazawa_sun 0:4f1c764a42d3 207 }
Komazawa_sun 0:4f1c764a42d3 208
Komazawa_sun 0:4f1c764a42d3 209 // Allows to set the backlight, if the LCD backpack is used
Komazawa_sun 0:4f1c764a42d3 210 void Adafruit_I2C_LCD::setBacklight(uint8_t status)
Komazawa_sun 0:4f1c764a42d3 211 {
Komazawa_sun 0:4f1c764a42d3 212 // check if i2c or SPI
Komazawa_sun 0:4f1c764a42d3 213 _i2c->digitalWrite(8, ~(status >> 2) & 0x1);
Komazawa_sun 0:4f1c764a42d3 214 _i2c->digitalWrite(7, ~(status >> 1) & 0x1);
Komazawa_sun 0:4f1c764a42d3 215 _i2c->digitalWrite(6, ~status & 0x1);
Komazawa_sun 0:4f1c764a42d3 216 }
Komazawa_sun 0:4f1c764a42d3 217
Komazawa_sun 0:4f1c764a42d3 218 // little wrapper for i/o directions
Komazawa_sun 0:4f1c764a42d3 219 void Adafruit_I2C_LCD::_pinMode(uint8_t p, uint8_t d)
Komazawa_sun 0:4f1c764a42d3 220 {
Komazawa_sun 0:4f1c764a42d3 221 _i2c->pinMode(p, d);
Komazawa_sun 0:4f1c764a42d3 222 }
Komazawa_sun 0:4f1c764a42d3 223
Komazawa_sun 0:4f1c764a42d3 224 void Adafruit_I2C_LCD::begin(uint8_t cols, uint8_t lines, uint8_t dotsize)
Komazawa_sun 0:4f1c764a42d3 225 {
Komazawa_sun 0:4f1c764a42d3 226 _i2c->pinMode(8, OUTPUT);
Komazawa_sun 0:4f1c764a42d3 227 _i2c->pinMode(6, OUTPUT);
Komazawa_sun 0:4f1c764a42d3 228 _i2c->pinMode(7, OUTPUT);
Komazawa_sun 0:4f1c764a42d3 229 setBacklight(0x7);
Komazawa_sun 0:4f1c764a42d3 230
Komazawa_sun 0:4f1c764a42d3 231 if (_rw_pin)
Komazawa_sun 0:4f1c764a42d3 232 _i2c->pinMode(_rw_pin, OUTPUT);
Komazawa_sun 0:4f1c764a42d3 233
Komazawa_sun 0:4f1c764a42d3 234 _i2c->pinMode(_rs_pin, OUTPUT);
Komazawa_sun 0:4f1c764a42d3 235 _i2c->pinMode(_enable_pin, OUTPUT);
Komazawa_sun 0:4f1c764a42d3 236 for (uint8_t i=0; i<4; i++)
Komazawa_sun 0:4f1c764a42d3 237 _i2c->pinMode(_data_pins[i], OUTPUT);
Komazawa_sun 0:4f1c764a42d3 238
Komazawa_sun 0:4f1c764a42d3 239 for (uint8_t i=0; i<5; i++) {
Komazawa_sun 0:4f1c764a42d3 240 _i2c->pinMode(_button_pins[i], INPUT);
Komazawa_sun 0:4f1c764a42d3 241 _i2c->pullUp(_button_pins[i], 1);
Komazawa_sun 0:4f1c764a42d3 242 }
Komazawa_sun 0:4f1c764a42d3 243
Komazawa_sun 0:4f1c764a42d3 244 if (lines > 1) {
Komazawa_sun 0:4f1c764a42d3 245 _displayfunction |= LCD_2LINE;
Komazawa_sun 0:4f1c764a42d3 246 }
Komazawa_sun 0:4f1c764a42d3 247 _numlines = lines;
Komazawa_sun 0:4f1c764a42d3 248 _currline = 0;
Komazawa_sun 0:4f1c764a42d3 249
Komazawa_sun 0:4f1c764a42d3 250 // for some 1 line displays you can select a 10 pixel high font
Komazawa_sun 0:4f1c764a42d3 251 if ((dotsize != 0) && (lines == 1)) {
Komazawa_sun 0:4f1c764a42d3 252 _displayfunction |= LCD_5x10DOTS;
Komazawa_sun 0:4f1c764a42d3 253 }
Komazawa_sun 0:4f1c764a42d3 254
Komazawa_sun 0:4f1c764a42d3 255 // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION!
Komazawa_sun 0:4f1c764a42d3 256 // according to datasheet, we need at least 40ms after power rises above 2.7V
Komazawa_sun 0:4f1c764a42d3 257 // before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50
Komazawa_sun 0:4f1c764a42d3 258 wait_us(50000);
Komazawa_sun 0:4f1c764a42d3 259 // Now we pull both RS and R/W low to begin commands
Komazawa_sun 0:4f1c764a42d3 260 _digitalWrite(_rs_pin, LOW);
Komazawa_sun 0:4f1c764a42d3 261 _digitalWrite(_enable_pin, LOW);
Komazawa_sun 0:4f1c764a42d3 262 if (_rw_pin != 255) {
Komazawa_sun 0:4f1c764a42d3 263 _digitalWrite(_rw_pin, LOW);
Komazawa_sun 0:4f1c764a42d3 264 }
Komazawa_sun 0:4f1c764a42d3 265
Komazawa_sun 0:4f1c764a42d3 266 //put the LCD into 4 bit or 8 bit mode
Komazawa_sun 0:4f1c764a42d3 267 if (! (_displayfunction & LCD_8BITMODE)) {
Komazawa_sun 0:4f1c764a42d3 268 // this is according to the hitachi HD44780 datasheet
Komazawa_sun 0:4f1c764a42d3 269 // figure 24, pg 46
Komazawa_sun 0:4f1c764a42d3 270
Komazawa_sun 0:4f1c764a42d3 271 // we start in 8bit mode, try to set 4 bit mode
Komazawa_sun 0:4f1c764a42d3 272 write4bits(0x03);
Komazawa_sun 0:4f1c764a42d3 273 wait_us(4500); // wait min 4.1ms
Komazawa_sun 0:4f1c764a42d3 274
Komazawa_sun 0:4f1c764a42d3 275 // second try
Komazawa_sun 0:4f1c764a42d3 276 write4bits(0x03);
Komazawa_sun 0:4f1c764a42d3 277 wait_us(4500); // wait min 4.1ms
Komazawa_sun 0:4f1c764a42d3 278
Komazawa_sun 0:4f1c764a42d3 279 // third go!
Komazawa_sun 0:4f1c764a42d3 280 write4bits(0x03);
Komazawa_sun 0:4f1c764a42d3 281 wait_us(150);
Komazawa_sun 0:4f1c764a42d3 282
Komazawa_sun 0:4f1c764a42d3 283 // finally, set to 8-bit interface
Komazawa_sun 0:4f1c764a42d3 284 write4bits(0x02);
Komazawa_sun 0:4f1c764a42d3 285 } else {
Komazawa_sun 0:4f1c764a42d3 286 // this is according to the hitachi HD44780 datasheet
Komazawa_sun 0:4f1c764a42d3 287 // page 45 figure 23
Komazawa_sun 0:4f1c764a42d3 288
Komazawa_sun 0:4f1c764a42d3 289 // Send function set command sequence
Komazawa_sun 0:4f1c764a42d3 290 command(LCD_FUNCTIONSET | _displayfunction);
Komazawa_sun 0:4f1c764a42d3 291 wait_us(4500); // wait more than 4.1ms
Komazawa_sun 0:4f1c764a42d3 292
Komazawa_sun 0:4f1c764a42d3 293 // second try
Komazawa_sun 0:4f1c764a42d3 294 command(LCD_FUNCTIONSET | _displayfunction);
Komazawa_sun 0:4f1c764a42d3 295 wait_us(150);
Komazawa_sun 0:4f1c764a42d3 296
Komazawa_sun 0:4f1c764a42d3 297 // third go
Komazawa_sun 0:4f1c764a42d3 298 command(LCD_FUNCTIONSET | _displayfunction);
Komazawa_sun 0:4f1c764a42d3 299 }
Komazawa_sun 0:4f1c764a42d3 300
Komazawa_sun 0:4f1c764a42d3 301 // finally, set # lines, font size, etc.
Komazawa_sun 0:4f1c764a42d3 302 command(LCD_FUNCTIONSET | _displayfunction);
Komazawa_sun 0:4f1c764a42d3 303
Komazawa_sun 0:4f1c764a42d3 304 // turn the display on with no cursor or blinking default
Komazawa_sun 0:4f1c764a42d3 305 _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF;
Komazawa_sun 0:4f1c764a42d3 306 display();
Komazawa_sun 0:4f1c764a42d3 307
Komazawa_sun 0:4f1c764a42d3 308 // clear it off
Komazawa_sun 0:4f1c764a42d3 309 clear();
Komazawa_sun 0:4f1c764a42d3 310
Komazawa_sun 0:4f1c764a42d3 311 // Initialize to default text direction (for romance languages)
Komazawa_sun 0:4f1c764a42d3 312 _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT;
Komazawa_sun 0:4f1c764a42d3 313 // set the entry mode
Komazawa_sun 0:4f1c764a42d3 314 command(LCD_ENTRYMODESET | _displaymode);
Komazawa_sun 0:4f1c764a42d3 315
Komazawa_sun 0:4f1c764a42d3 316 }
Komazawa_sun 0:4f1c764a42d3 317
Komazawa_sun 0:4f1c764a42d3 318 // write either command or data, with automatic 4/8-bit selection
Komazawa_sun 0:4f1c764a42d3 319 void Adafruit_I2C_LCD::send(uint8_t value, uint8_t mode)
Komazawa_sun 0:4f1c764a42d3 320 {
Komazawa_sun 0:4f1c764a42d3 321 _digitalWrite(_rs_pin, mode);
Komazawa_sun 0:4f1c764a42d3 322
Komazawa_sun 0:4f1c764a42d3 323 // if there is a RW pin indicated, set it low to Write
Komazawa_sun 0:4f1c764a42d3 324 if (_rw_pin != 255) {
Komazawa_sun 0:4f1c764a42d3 325 _digitalWrite(_rw_pin, LOW);
Komazawa_sun 0:4f1c764a42d3 326 }
Komazawa_sun 0:4f1c764a42d3 327
Komazawa_sun 0:4f1c764a42d3 328 if (_displayfunction & LCD_8BITMODE) {
Komazawa_sun 0:4f1c764a42d3 329 write8bits(value);
Komazawa_sun 0:4f1c764a42d3 330 } else {
Komazawa_sun 0:4f1c764a42d3 331 write4bits(value>>4);
Komazawa_sun 0:4f1c764a42d3 332 write4bits(value);
Komazawa_sun 0:4f1c764a42d3 333 }
Komazawa_sun 0:4f1c764a42d3 334 }
Komazawa_sun 0:4f1c764a42d3 335
Komazawa_sun 0:4f1c764a42d3 336 void Adafruit_I2C_LCD::pulseEnable(void)
Komazawa_sun 0:4f1c764a42d3 337 {
Komazawa_sun 0:4f1c764a42d3 338 _digitalWrite(_enable_pin, LOW);
Komazawa_sun 0:4f1c764a42d3 339 wait_us(1);
Komazawa_sun 0:4f1c764a42d3 340 _digitalWrite(_enable_pin, HIGH);
Komazawa_sun 0:4f1c764a42d3 341 wait_us(1); // enable pulse must be >450ns
Komazawa_sun 0:4f1c764a42d3 342 _digitalWrite(_enable_pin, LOW);
Komazawa_sun 0:4f1c764a42d3 343 wait_us(100); // commands need > 37us to settle
Komazawa_sun 0:4f1c764a42d3 344 }
Komazawa_sun 0:4f1c764a42d3 345
Komazawa_sun 0:4f1c764a42d3 346 void Adafruit_I2C_LCD::write4bits(uint8_t value)
Komazawa_sun 0:4f1c764a42d3 347 {
Komazawa_sun 0:4f1c764a42d3 348 //if (_i2cAddr != 255) {
Komazawa_sun 0:4f1c764a42d3 349 uint16_t out = 0;
Komazawa_sun 0:4f1c764a42d3 350
Komazawa_sun 0:4f1c764a42d3 351 out = _i2c->readGPIOAB();
Komazawa_sun 0:4f1c764a42d3 352
Komazawa_sun 0:4f1c764a42d3 353 // speed up for i2c since its sluggish
Komazawa_sun 0:4f1c764a42d3 354 for (int i = 0; i < 4; i++) {
Komazawa_sun 0:4f1c764a42d3 355 out &= ~(1 << _data_pins[i]);
Komazawa_sun 0:4f1c764a42d3 356 out |= ((value >> i) & 0x1) << _data_pins[i];
Komazawa_sun 0:4f1c764a42d3 357 }
Komazawa_sun 0:4f1c764a42d3 358
Komazawa_sun 0:4f1c764a42d3 359 // make sure enable is low
Komazawa_sun 0:4f1c764a42d3 360 out &= ~(1 << _enable_pin);
Komazawa_sun 0:4f1c764a42d3 361
Komazawa_sun 0:4f1c764a42d3 362 _i2c->writeGPIOAB(out);
Komazawa_sun 0:4f1c764a42d3 363
Komazawa_sun 0:4f1c764a42d3 364 // pulse enable
Komazawa_sun 0:4f1c764a42d3 365 wait_us(1);
Komazawa_sun 0:4f1c764a42d3 366 out |= (1 << _enable_pin);
Komazawa_sun 0:4f1c764a42d3 367 _i2c->writeGPIOAB(out);
Komazawa_sun 0:4f1c764a42d3 368 wait_us(1);
Komazawa_sun 0:4f1c764a42d3 369 out &= ~(1 << _enable_pin);
Komazawa_sun 0:4f1c764a42d3 370 _i2c->writeGPIOAB(out);
Komazawa_sun 0:4f1c764a42d3 371 wait_us(100);
Komazawa_sun 0:4f1c764a42d3 372
Komazawa_sun 0:4f1c764a42d3 373 //} else {
Komazawa_sun 0:4f1c764a42d3 374 //for (int i = 0; i < 4; i++) {
Komazawa_sun 0:4f1c764a42d3 375 // _pinMode(_data_pins[i], OUTPUT);
Komazawa_sun 0:4f1c764a42d3 376 // _digitalWrite(_data_pins[i], (value >> i) & 0x01);
Komazawa_sun 0:4f1c764a42d3 377 //}
Komazawa_sun 0:4f1c764a42d3 378 //pulseEnable();
Komazawa_sun 0:4f1c764a42d3 379 //}
Komazawa_sun 0:4f1c764a42d3 380 }
Komazawa_sun 0:4f1c764a42d3 381
Komazawa_sun 0:4f1c764a42d3 382 void Adafruit_I2C_LCD::write8bits(uint8_t value)
Komazawa_sun 0:4f1c764a42d3 383 {
Komazawa_sun 0:4f1c764a42d3 384 for (int i = 0; i < 8; i++) {
Komazawa_sun 0:4f1c764a42d3 385 _pinMode(_data_pins[i], OUTPUT);
Komazawa_sun 0:4f1c764a42d3 386 _digitalWrite(_data_pins[i], (value >> i) & 0x01);
Komazawa_sun 0:4f1c764a42d3 387 }
Komazawa_sun 0:4f1c764a42d3 388
Komazawa_sun 0:4f1c764a42d3 389 pulseEnable();
Komazawa_sun 0:4f1c764a42d3 390 }
Komazawa_sun 0:4f1c764a42d3 391
Komazawa_sun 0:4f1c764a42d3 392 uint8_t Adafruit_I2C_LCD::readButtons(void)
Komazawa_sun 0:4f1c764a42d3 393 {
Komazawa_sun 0:4f1c764a42d3 394 uint8_t reply = 0x1F;
Komazawa_sun 0:4f1c764a42d3 395
Komazawa_sun 0:4f1c764a42d3 396 for (uint8_t i=0; i<5; i++) {
Komazawa_sun 0:4f1c764a42d3 397 reply &= ~((_i2c->digitalRead(_button_pins[i])) << i);
Komazawa_sun 0:4f1c764a42d3 398 }
Komazawa_sun 0:4f1c764a42d3 399 return reply;
Komazawa_sun 0:4f1c764a42d3 400 }
Komazawa_sun 0:4f1c764a42d3 401