47 #include "lib/sensors.h" 51 #define PRINTF(...) printf(__VA_ARGS__) 56 static uint8_t enabled;
66 static rgb_lcd_config_t lcd;
68 static const unsigned char rgb_color[7][3] =
80 lcd_backlight_write_reg(uint8_t
addr, uint8_t val)
88 return LCD_RGB_SUCCESS;
94 lcd_backlight_color(uint8_t color)
96 lcd_backlight_write_reg(LCD_RGB_LED_RED, rgb_color[color][0]);
97 lcd_backlight_write_reg(LCD_RGB_LED_GREEN, rgb_color[color][1]);
98 lcd_backlight_write_reg(LCD_RGB_LED_BLUE, rgb_color[color][2]);
100 return LCD_RGB_SUCCESS;
104 lcd_write_reg(uint8_t *buf, uint8_t num)
106 if((buf == NULL) || (num <= 0)) {
107 PRINTF(
"LCD: invalid write values\n");
108 return LCD_RGB_ERROR;
113 return LCD_RGB_SUCCESS;
115 return LCD_RGB_ERROR;
119 lcd_cmd(uint8_t value)
122 buf[0] = LCD_RGB_COMMAND_BYTE;
125 if(lcd_write_reg(buf, 2) == LCD_RGB_SUCCESS) {
126 return LCD_RGB_SUCCESS;
129 PRINTF(
"LCD: failed to send command 0x%02X\n", value);
130 return LCD_RGB_ERROR;
134 lcd_clear_display(
void)
136 if(lcd_cmd(LCD_RGB_CLEAR_DISPLAY) == LCD_RGB_SUCCESS) {
138 return LCD_RGB_SUCCESS;
140 PRINTF(
"LCD: failed to clear LCD\n");
141 return LCD_RGB_ERROR;
145 lcd_return_home(
void)
147 if(lcd_cmd(LCD_RGB_RETURN_HOME) == LCD_RGB_SUCCESS) {
149 return LCD_RGB_SUCCESS;
151 PRINTF(
"LCD: failed to return home\n");
152 return LCD_RGB_ERROR;
156 lcd_set_cursor(uint8_t col, uint8_t row)
159 buf[0] = LCD_RGB_SETDDRAM_ADDR;
161 buf[1] += (!row) ? LCD_RGB_START_1ST_ROW : LCD_RGB_START_2ND_ROW;
163 if(lcd_write_reg(buf, 2) == LCD_RGB_SUCCESS) {
164 return LCD_RGB_SUCCESS;
167 PRINTF(
"LCD: failed to set cursor\n");
168 return LCD_RGB_ERROR;
172 lcd_display(uint8_t state)
174 lcd.display_ctrl &= ~LCD_RGB_DISPLAY_ON;
176 lcd.display_ctrl |= LCD_RGB_DISPLAY_ON;
179 if(lcd_cmd(LCD_RGB_DISPLAY_CONTROL + lcd.display_ctrl) == LCD_RGB_SUCCESS) {
180 return LCD_RGB_SUCCESS;
182 PRINTF(
"LCD: failed to set display\n");
183 return LCD_RGB_ERROR;
187 lcd_cursor(uint8_t state)
189 lcd.display_ctrl &= ~LCD_RGB_DISPLAY_CURSOR_ON;
191 lcd.display_ctrl |= LCD_RGB_DISPLAY_CURSOR_ON;
194 if(lcd_cmd(LCD_RGB_DISPLAY_CONTROL + lcd.display_ctrl) == LCD_RGB_SUCCESS) {
195 return LCD_RGB_SUCCESS;
197 PRINTF(
"LCD: failed to set cursor\n");
198 return LCD_RGB_ERROR;
202 lcd_blink(uint8_t state)
204 lcd.display_ctrl &= ~LCD_RGB_DISPLAY_BLINK_ON;
206 lcd.display_ctrl |= LCD_RGB_DISPLAY_BLINK_ON;
209 if(lcd_cmd(LCD_RGB_DISPLAY_CONTROL + lcd.display_ctrl) == LCD_RGB_SUCCESS) {
210 return LCD_RGB_SUCCESS;
212 PRINTF(
"LCD: failed to set blink\n");
213 return LCD_RGB_ERROR;
217 lcd_scroll_display(uint8_t direction, uint8_t num)
223 for(i = 0; i < num; i++) {
224 if(lcd_cmd(LCD_RGB_CURSOR_SHIFT + LCD_RGB_CURSOR_DISPLAY_MOVE +
225 direction) != LCD_RGB_SUCCESS) {
226 PRINTF(
"LCD: failed to set scroll\n");
227 return LCD_RGB_ERROR;
230 return LCD_RGB_SUCCESS;
234 lcd_text_direction(uint8_t direction)
236 lcd.display_mode &= ~LCD_RGB_ENTRY_MODE_LEFT;
238 lcd.display_mode |= LCD_RGB_ENTRY_MODE_LEFT;
241 if(lcd_cmd(LCD_RGB_ENTRY_MODE_SET + lcd.display_mode) == LCD_RGB_SUCCESS) {
242 return LCD_RGB_SUCCESS;
244 PRINTF(
"LCD: failed to set text direction\n");
245 return LCD_RGB_ERROR;
249 lcd_autoscroll(uint8_t state)
251 lcd.display_mode &= ~LCD_RGB_ENTRY_SHIFT_INCREMENT;
253 lcd.display_mode |= LCD_RGB_ENTRY_SHIFT_INCREMENT;
256 if(lcd_cmd(LCD_RGB_ENTRY_MODE_SET + lcd.display_mode) == LCD_RGB_SUCCESS) {
257 return LCD_RGB_SUCCESS;
259 PRINTF(
"LCD: failed to set autoscroll\n");
260 return LCD_RGB_ERROR;
264 lcd_write_byte(
int c)
267 buf[0] = LCD_RGB_SETCGRAM_ADDR;
270 if(lcd_write_reg(buf, 2) == LCD_RGB_SUCCESS) {
271 return LCD_RGB_SUCCESS;
273 return LCD_RGB_ERROR;
277 lcd_write(
const char *s)
280 while(s && *s != 0) {
281 lcd_write_byte(*s++);
285 PRINTF(
"LCD: wrote %u bytes\n", i);
290 configure(
int type,
int value)
293 if(type != LCD_RGB_ACTIVE) {
294 PRINTF(
"LCD: option not supported\n");
295 return LCD_RGB_ERROR;
303 i2c_init(I2C_SDA_PORT, I2C_SDA_PIN, I2C_SCL_PORT, I2C_SCL_PIN,
304 I2C_SCL_NORMAL_BUS_SPEED);
306 lcd.display_func = LCD_RGB_FUNCTION_SET_2_LINE +
307 LCD_RGB_FUNCTION_SET_5x8_DOTS;
313 if(lcd_cmd(LCD_RGB_FUNCTION_SET + lcd.display_func) == LCD_RGB_ERROR) {
314 return LCD_RGB_ERROR;
319 if(lcd_cmd(LCD_RGB_FUNCTION_SET + lcd.display_func) == LCD_RGB_ERROR) {
320 return LCD_RGB_ERROR;
325 if(lcd_cmd(LCD_RGB_FUNCTION_SET + lcd.display_func) == LCD_RGB_ERROR) {
326 return LCD_RGB_ERROR;
330 if(lcd_cmd(LCD_RGB_FUNCTION_SET + lcd.display_func) == LCD_RGB_ERROR) {
331 return LCD_RGB_ERROR;
335 lcd.display_ctrl = LCD_RGB_DISPLAY_ON + LCD_RGB_DISPLAY_CURSOR_OFF +
336 LCD_RGB_DISPLAY_BLINK_OFF;
337 if(lcd_cmd(LCD_RGB_DISPLAY_CONTROL + lcd.display_ctrl) == LCD_RGB_ERROR) {
338 return LCD_RGB_ERROR;
342 if(lcd_clear_display() == LCD_RGB_ERROR) {
343 return LCD_RGB_ERROR;
347 lcd.display_mode = LCD_RGB_ENTRY_MODE_LEFT + LCD_RGB_ENTRY_SHIFT_DECREMENT;
350 if(lcd_cmd(LCD_RGB_ENTRY_MODE_SET + lcd.display_mode) == LCD_RGB_ERROR) {
351 return LCD_RGB_ERROR;
355 lcd_backlight_write_reg(LCD_RGB_LED_MODE_1, LCD_RGB_LED_MODE_DEFAULT);
356 lcd_backlight_write_reg(LCD_RGB_LED_MODE_2, LCD_RGB_LED_MODE_DEFAULT);
357 lcd_backlight_write_reg(LCD_RGB_LED_OUT, LCD_RGB_LED_OUT_PWM_CTRL);
360 lcd_backlight_color(LCD_RGB_RED);
362 PRINTF(
"LCD: initialized\n");
364 return LCD_RGB_SUCCESS;
366 lcd_display(LCD_RGB_DISPLAY_OFF);
367 lcd_backlight_color(LCD_RGB_BLACK);
372 return LCD_RGB_ERROR;
375 SENSORS_SENSOR(rgb_bl_lcd, RGB_BACKLIGHT_LCD, NULL, configure, NULL);
uint8_t i2c_burst_send(uint8_t slave_addr, uint8_t *data, uint8_t len)
Perform all operations to send multiple bytes to a slave.
static uip_ds6_addr_t * addr
Pointer to a nbr cache entry.
void clock_delay_usec(uint16_t dt)
Delay a given number of microseconds.
void i2c_init(uint8_t port_sda, uint8_t pin_sda, uint8_t port_scl, uint8_t pin_scl, uint32_t bus_speed)
Initialize the I2C peripheral and pins.
Grove LCD with RGB backlight header.
void i2c_master_enable(void)
Enable master I2C module.