1 #include "LiquidCrystal.h" 27 LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable,
28 uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
29 uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
31 init(0, rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7);
34 LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t enable,
35 uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
36 uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
38 init(0, rs, 255, enable, d0, d1, d2, d3, d4, d5, d6, d7);
41 LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable,
42 uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)
44 init(1, rs, rw, enable, d0, d1, d2, d3, 0, 0, 0, 0);
47 LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t enable,
48 uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)
50 init(1, rs, 255, enable, d0, d1, d2, d3, 0, 0, 0, 0);
53 void LiquidCrystal::init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable,
54 uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
55 uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
71 _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
73 _displayfunction = LCD_8BITMODE | LCD_1LINE | LCD_5x8DOTS;
78 void LiquidCrystal::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) {
80 _displayfunction |= LCD_2LINE;
84 setRowOffsets(0x00, 0x40, 0x00 + cols, 0x40 + cols);
87 if ((dotsize != LCD_5x8DOTS) && (lines == 1)) {
88 _displayfunction |= LCD_5x10DOTS;
91 pinMode(_rs_pin, OUTPUT);
94 pinMode(_rw_pin, OUTPUT);
96 pinMode(_enable_pin, OUTPUT);
99 for (
int i=0; i<((_displayfunction & LCD_8BITMODE) ? 8 : 4); ++i)
101 pinMode(_data_pins[i], OUTPUT);
107 delayMicroseconds(50000);
109 digitalWrite(_rs_pin, LOW);
110 digitalWrite(_enable_pin, LOW);
111 if (_rw_pin != 255) {
112 digitalWrite(_rw_pin, LOW);
116 if (! (_displayfunction & LCD_8BITMODE)) {
122 delayMicroseconds(4500);
126 delayMicroseconds(4500);
130 delayMicroseconds(150);
139 command(LCD_FUNCTIONSET | _displayfunction);
140 delayMicroseconds(4500);
143 command(LCD_FUNCTIONSET | _displayfunction);
144 delayMicroseconds(150);
147 command(LCD_FUNCTIONSET | _displayfunction);
151 command(LCD_FUNCTIONSET | _displayfunction);
154 _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF;
161 _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT;
163 command(LCD_ENTRYMODESET | _displaymode);
167 void LiquidCrystal::setRowOffsets(
int row0,
int row1,
int row2,
int row3)
169 _row_offsets[0] = row0;
170 _row_offsets[1] = row1;
171 _row_offsets[2] = row2;
172 _row_offsets[3] = row3;
176 void LiquidCrystal::clear()
178 command(LCD_CLEARDISPLAY);
179 delayMicroseconds(2000);
182 void LiquidCrystal::home()
184 command(LCD_RETURNHOME);
185 delayMicroseconds(2000);
188 void LiquidCrystal::setCursor(uint8_t col, uint8_t row)
190 const size_t max_lines =
sizeof(_row_offsets) /
sizeof(*_row_offsets);
191 if ( row >= max_lines ) {
194 if ( row >= _numlines ) {
198 command(LCD_SETDDRAMADDR | (col + _row_offsets[row]));
202 void LiquidCrystal::noDisplay() {
203 _displaycontrol &= ~LCD_DISPLAYON;
204 command(LCD_DISPLAYCONTROL | _displaycontrol);
206 void LiquidCrystal::display() {
207 _displaycontrol |= LCD_DISPLAYON;
208 command(LCD_DISPLAYCONTROL | _displaycontrol);
212 void LiquidCrystal::noCursor() {
213 _displaycontrol &= ~LCD_CURSORON;
214 command(LCD_DISPLAYCONTROL | _displaycontrol);
216 void LiquidCrystal::cursor() {
217 _displaycontrol |= LCD_CURSORON;
218 command(LCD_DISPLAYCONTROL | _displaycontrol);
222 void LiquidCrystal::noBlink() {
223 _displaycontrol &= ~LCD_BLINKON;
224 command(LCD_DISPLAYCONTROL | _displaycontrol);
226 void LiquidCrystal::blink() {
227 _displaycontrol |= LCD_BLINKON;
228 command(LCD_DISPLAYCONTROL | _displaycontrol);
232 void LiquidCrystal::scrollDisplayLeft(
void) {
233 command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT);
235 void LiquidCrystal::scrollDisplayRight(
void) {
236 command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT);
240 void LiquidCrystal::leftToRight(
void) {
241 _displaymode |= LCD_ENTRYLEFT;
242 command(LCD_ENTRYMODESET | _displaymode);
246 void LiquidCrystal::rightToLeft(
void) {
247 _displaymode &= ~LCD_ENTRYLEFT;
248 command(LCD_ENTRYMODESET | _displaymode);
252 void LiquidCrystal::autoscroll(
void) {
253 _displaymode |= LCD_ENTRYSHIFTINCREMENT;
254 command(LCD_ENTRYMODESET | _displaymode);
258 void LiquidCrystal::noAutoscroll(
void) {
259 _displaymode &= ~LCD_ENTRYSHIFTINCREMENT;
260 command(LCD_ENTRYMODESET | _displaymode);
265 void LiquidCrystal::createChar(uint8_t location, uint8_t charmap[]) {
267 command(LCD_SETCGRAMADDR | (location << 3));
268 for (
int i=0; i<8; i++) {
275 inline void LiquidCrystal::command(uint8_t value) {
279 inline size_t LiquidCrystal::write(uint8_t value) {
287 void LiquidCrystal::send(uint8_t value, uint8_t mode) {
288 digitalWrite(_rs_pin, mode);
291 if (_rw_pin != 255) {
292 digitalWrite(_rw_pin, LOW);
295 if (_displayfunction & LCD_8BITMODE) {
298 write4bits(value>>4);
303 void LiquidCrystal::pulseEnable(
void) {
304 digitalWrite(_enable_pin, LOW);
305 delayMicroseconds(1);
306 digitalWrite(_enable_pin, HIGH);
307 delayMicroseconds(1);
308 digitalWrite(_enable_pin, LOW);
309 delayMicroseconds(100);
312 void LiquidCrystal::write4bits(uint8_t value) {
313 for (
int i = 0; i < 4; i++) {
314 digitalWrite(_data_pins[i], (value >> i) & 0x01);
320 void LiquidCrystal::write8bits(uint8_t value) {
321 for (
int i = 0; i < 8; i++) {
322 digitalWrite(_data_pins[i], (value >> i) & 0x01);