1 /*--------------------------------------------------------------------------*/
4 // This file is part of ruwai.
6 // If you use ruwai_parser in any program or publication, please inform and
7 // acknowledge its author Stefan Mertl (stefan@mertl-research.at).
9 // ruwai is free software: you can redistribute it and/or modify
10 // it under the terms of the GNU General Public License as published by
11 // the Free Software Foundation, either version 3 of the License, or
12 // (at your option) any later version.
14 // This program is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 // GNU General Public License for more details.
19 // You should have received a copy of the GNU General Public License
20 // along with this program. If not, see <http://www.gnu.org/licenses/>.
21 /*--------------------------------------------------------------------------*/
23 #include "lcddisplay.h"
27 LCDDisplay::LCDDisplay(int rs_gpio
, int e_gpio
, int db0_gpio
, int db1_gpio
, int db2_gpio
, int db3_gpio
, int db4_gpio
, int db5_gpio
, int db6_gpio
, int db7_gpio
)
30 this->rs_gpio
= new GPIO(rs_gpio
);
31 this->e_gpio
= new GPIO(e_gpio
);
32 this->db0_gpio
= new GPIO(db0_gpio
);
33 this->db1_gpio
= new GPIO(db1_gpio
);
34 this->db2_gpio
= new GPIO(db2_gpio
);
35 this->db3_gpio
= new GPIO(db3_gpio
);
36 this->db4_gpio
= new GPIO(db4_gpio
);
37 this->db5_gpio
= new GPIO(db5_gpio
);
38 this->db6_gpio
= new GPIO(db6_gpio
);
39 this->db7_gpio
= new GPIO(db7_gpio
);
41 // Initialize the gpios.
42 this->rs_gpio
->set_direction(OUTPUT
);
43 this->e_gpio
->set_direction(OUTPUT
);
44 this->db0_gpio
->set_direction(OUTPUT
);
45 this->db1_gpio
->set_direction(OUTPUT
);
46 this->db2_gpio
->set_direction(OUTPUT
);
47 this->db3_gpio
->set_direction(OUTPUT
);
48 this->db4_gpio
->set_direction(OUTPUT
);
49 this->db5_gpio
->set_direction(OUTPUT
);
50 this->db6_gpio
->set_direction(OUTPUT
);
51 this->db7_gpio
->set_direction(OUTPUT
);
55 LCDDisplay::LCDDisplay(int rs_gpio
, int e_gpio
, int db4_gpio
, int db5_gpio
, int db6_gpio
, int db7_gpio
)
58 this->rs_gpio
= new GPIO(rs_gpio
);
59 this->e_gpio
= new GPIO(e_gpio
);
60 this->db4_gpio
= new GPIO(db4_gpio
);
61 this->db5_gpio
= new GPIO(db5_gpio
);
62 this->db6_gpio
= new GPIO(db6_gpio
);
63 this->db7_gpio
= new GPIO(db7_gpio
);
65 // Initialize the gpios.
66 this->rs_gpio
->set_direction(OUTPUT
);
67 this->e_gpio
->set_direction(OUTPUT
);
68 this->db4_gpio
->set_direction(OUTPUT
);
69 this->db5_gpio
->set_direction(OUTPUT
);
70 this->db6_gpio
->set_direction(OUTPUT
);
71 this->db7_gpio
->set_direction(OUTPUT
);
76 LCDDisplay::init(void)
91 LCDDisplay::init_4bit(void)
95 write_4bit_high_only(0x30, true);
98 write_4bit_high_only(0x30, true);
101 write_4bit_high_only(0x30, true);
102 //write_4bit(LCD_CMD_FUNCTION_SET | LCD_FUNCTION_TWO_LINES, true);
105 write_4bit_high_only(0x20, true);
106 //write_4bit(LCD_CMD_FUNCTION_SET | LCD_FUNCTION_TWO_LINES, true);
109 write_4bit(LCD_CMD_FUNCTION_SET
| LCD_FUNCTION_TWO_LINES
, true);
110 usleep(LCD_SHORT_DELAY
);
113 //write_command(0b00001110);
114 write_command(LCD_CMD_DISPLAY
| LCD_DISPLAY_DISPLAY_ON
|LCD_DISPLAY_CURSOR_ON
);
115 usleep(LCD_SHORT_DELAY
);
120 LCDDisplay::init_8bit(void)
124 write_8bit(LCD_CMD_FUNCTION_SET
| LCD_FUNCTION_8BIT_MODE
| LCD_FUNCTION_TWO_LINES
, true);
127 write_8bit(LCD_CMD_FUNCTION_SET
| LCD_FUNCTION_8BIT_MODE
| LCD_FUNCTION_TWO_LINES
, true);
133 // Select 4 bit mode.
134 write_8bit(LCD_CMD_FUNCTION_SET
| LCD_FUNCTION_TWO_LINES
, true);
137 write_8bit(LCD_CMD_FUNCTION_SET
| LCD_FUNCTION_8BIT_MODE
| LCD_FUNCTION_TWO_LINES
, true);
140 usleep(LCD_SHORT_DELAY
);
143 //write_command(0b00001110);
144 write_command(LCD_CMD_DISPLAY
| LCD_DISPLAY_DISPLAY_ON
|LCD_DISPLAY_CURSOR_ON
);
145 usleep(LCD_SHORT_DELAY
);
149 LCDDisplay::write_8bit(std::uint8_t data
, bool command
)
151 std::cout
<< "Write data: " << data
<< std::endl
;
153 rs_gpio
->set_value(LOW
);
155 rs_gpio
->set_value(HIGH
);
157 // Write the high nibble.
158 db7_gpio
->set_value((gpio_value_t
)((data
& 0x80) >> 7));
159 db6_gpio
->set_value((gpio_value_t
)((data
& 0x40) >> 6));
160 db5_gpio
->set_value((gpio_value_t
)((data
& 0x20) >> 5));
161 db4_gpio
->set_value((gpio_value_t
)((data
& 0x10) >> 4));
162 db3_gpio
->set_value((gpio_value_t
)((data
& 0x08) >> 3));
163 db2_gpio
->set_value((gpio_value_t
)((data
& 0x04) >> 2));
164 db1_gpio
->set_value((gpio_value_t
)((data
& 0x02) >> 1));
165 db0_gpio
->set_value((gpio_value_t
)(data
& 0x01));
171 LCDDisplay::write_4bit(std::uint8_t data
, bool command
)
173 std::cout
<< "Write data: " << data
<< std::endl
;
175 rs_gpio
->set_value(LOW
);
177 rs_gpio
->set_value(HIGH
);
179 // Write the high nibble.
180 db7_gpio
->set_value((gpio_value_t
)((data
& 0x80) >> 7));
181 db6_gpio
->set_value((gpio_value_t
)((data
& 0x40) >> 6));
182 db5_gpio
->set_value((gpio_value_t
)((data
& 0x20) >> 5));
183 db4_gpio
->set_value((gpio_value_t
)((data
& 0x10) >> 4));
186 // Write the low nibble.
187 db7_gpio
->set_value((gpio_value_t
)((data
& 0x08) >> 3));
188 db6_gpio
->set_value((gpio_value_t
)((data
& 0x04) >> 2));
189 db5_gpio
->set_value((gpio_value_t
)((data
& 0x02) >> 1));
190 db4_gpio
->set_value((gpio_value_t
)(data
& 0x01));
196 LCDDisplay::write_4bit_high_only(std::uint8_t data
, bool command
)
198 std::cout
<< "Write data: " << data
<< std::endl
;
200 rs_gpio
->set_value(LOW
);
202 rs_gpio
->set_value(HIGH
);
204 // Write the high nibble.
205 db7_gpio
->set_value((gpio_value_t
)((data
& 0x80) >> 7));
206 db6_gpio
->set_value((gpio_value_t
)((data
& 0x40) >> 6));
207 db5_gpio
->set_value((gpio_value_t
)((data
& 0x20) >> 5));
208 db4_gpio
->set_value((gpio_value_t
)((data
& 0x10) >> 4));
213 LCDDisplay::write_command(std::uint8_t data
)
218 write_4bit(data
, true);
221 write_8bit(data
, true);
227 LCDDisplay::write_data(std::uint8_t data
)
232 write_4bit(data
, false);
235 write_8bit(data
, false);
242 LCDDisplay::toggle_e(void)
244 //e_gpio->set_value(LOW);
246 e_gpio
->set_value(HIGH
);
248 e_gpio
->set_value(LOW
);
252 LCDDisplay::clear(void)
255 usleep(LCD_LONG_DELAY
);
259 LCDDisplay::home(void)
262 usleep(LCD_LONG_DELAY
);
267 LCDDisplay::print(std::string msg_line1
, std::string msg_line2
)
272 for (int k
= 0; k
< msg_line1
.length(); k
++)
274 write_data(msg_line1
[k
]);
277 // Go to the beginning of line 2.
278 write_command(LCD_CMD_SET_DDRAM_ADDR
| 0x40);
280 for (int k
= 0; k
< msg_line2
.length(); k
++)
282 write_data(msg_line2
[k
]);