aboutsummaryrefslogtreecommitdiff
path: root/3rd-party/LCDHD44780.h
diff options
context:
space:
mode:
authortslil clingman <tslil@posteo.de>2021-01-18 23:14:12 -0500
committertslil <tslil@posteo.de>2026-08-28 19:37:41 +0100
commit82d679ab5fa43c33ae52fe7b66d7c358f6046a45 (patch)
treefdb42bd3647c7c2934ec29d32aedbdf8b16d28fe /3rd-party/LCDHD44780.h
parent10dcfac23be0a8cab39efaaf63abecf098c993db (diff)
First steps towards character LCD
Diffstat (limited to '3rd-party/LCDHD44780.h')
-rw-r--r--3rd-party/LCDHD44780.h198
1 files changed, 198 insertions, 0 deletions
diff --git a/3rd-party/LCDHD44780.h b/3rd-party/LCDHD44780.h
new file mode 100644
index 0000000..d25f046
--- /dev/null
+++ b/3rd-party/LCDHD44780.h
@@ -0,0 +1,198 @@
+/*##############################################################*/
+/* Author: Marcus Nasarek */
+/* File: LCDH44780.h */
+/* License: */
+/* */
+/* This program is free software; you can redistribute it */
+/* and/or modify it under the terms of the GNU General */
+/* Public License as published by the Free Software */
+/* Foundation; either version 3 of the License, or */
+/* (at your option) any later version. */
+/* */
+/* This program is distributed in the hope that it will */
+/* be useful, but WITHOUT ANY WARRANTY; without even the */
+/* implied warranty of MERCHANTABILITY or */
+/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General */
+/* Public License for more details. */
+/* */
+/* You should have received a copy of the GNU General */
+/* Public License along with this program; if not, */
+/* see <http://www.gnu.org/licenses/>. */
+/* */
+/*##############################################################*/
+
+// Thanks to Matt Hawkins (http://www.raspberrypi-spy.co.uk)
+// The wiring for the LCD is as follows:
+// 1 : GND
+// 2 : 5V
+// 3 : Contrast (0-5V)*
+// 4 : RS (Register Select)
+// 5 : R/W (Read Write) - GROUND THIS PIN
+// 6 : Enable or Strobe
+// 7 : Data Bit 0 - NOT USED
+// 8 : Data Bit 1 - NOT USED
+// 9 : Data Bit 2 - NOT USED
+// 10: Data Bit 3 - NOT USED
+// 11: Data Bit 4
+// 12: Data Bit 5
+// 13: Data Bit 6
+// 14: Data Bit 7
+// 15: LCD Backlight +5V**
+// 16: LCD Backlight GND
+
+#ifndef _LCDHD44780_H_
+#define _LCDHD44780_H_
+
+#include <stdlib.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdbool.h>
+#include <bcm2835.h>
+
+// Define GPIO pin to LCD pin mapping
+#define LCD_RS RPI_V2_GPIO_P1_26
+#define LCD_RW RPI_V2_GPIO_P1_07
+#define LCD_E RPI_V2_GPIO_P1_24
+#define LCD_D4 RPI_V2_GPIO_P1_22
+#define LCD_D5 RPI_V2_GPIO_P1_18
+#define LCD_D6 RPI_V2_GPIO_P1_16
+#define LCD_D7 RPI_V2_GPIO_P1_12
+
+// Define some device constants
+// Maximum characters per line
+#define LCD_WIDTH 16
+#define LCD_DATA HIGH
+#define LCD_CMD LOW
+
+// Function set -
+// Sets interface data length
+// (DL), number of display lines
+// (N), and character font (F).
+// RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
+// 0 0 0 0 1 DL N F - -
+// DL = 0 --> 4 bit data length (1 = 8 bit)
+// N = 1 --> 2 line display (0 = 1 line)
+// F = 0 --> 5x8 dot character font
+// F = 1 --> 5x10 dot character font
+// 0x28 =
+// 0 0 0 0 1 0 1 0 0 0
+#define LCD_FUNCTION_SET 0x20
+#define DATA_LENGTH 0x10
+#define TWO_LINES 0x08
+#define BIG_FONT_SET 0x04
+
+
+
+// Display control flags
+// Sets entire display (D) on/off,
+// cursor on/off (C), and
+// blinking of cursor position
+// character (B).
+// RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
+// 0 0 0 0 0 0 1 D C B
+// D = 1 --> display on
+// C = 0 --> cursor off
+// B = 0 --> blinking off
+#define LCD_CONTROL 0x08 // display control
+#define DISPLAY_ON 0x04
+#define DISPLAY_OFF 0x00
+#define CURSOR_ON 0x02
+#define BLINKING_ON 0x01
+
+// Entry mode set -
+// Sets cursor move direction
+// and specifies display shift.
+// These operations are
+// performed during data write
+// and read.
+// Execution time 37us
+// RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
+// 0 0 0 0 0 0 0 1 I/D S
+// I/D = increment/decrement address pointer
+// I/D = 1 --> increment
+// S = 0 --> no shift
+#define LCD_ENTRY_MODE 0x04
+#define ADDR_INCREMENT 0x02
+#define LINE_SHIFT 0x01
+
+// Cursor or display shift -
+// Moves the cursor and shifts
+// display without chaning
+// DDRAM contents.
+// Execution time 37us
+// RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
+// 0 0 0 0 0 1 S/C R/L - -
+// S/C = cursor/display shift
+// S/C = 0 --> cursor shift
+// R/L = shift direction
+// R/L = 1 --> shift to right
+#define CURSOR_DISPLAY_SHIFT 0x10
+#define CURSOR_SHIFT 0x00
+#define DISPLAY_SHIFT 0x08
+#define SHIFT_RIGHT 0x04
+#define SHIFT_LEFT 0x00
+
+
+// LCD DDRAM address for the 1st line
+// bits DB0..DB6 --> 0x00..0x4F
+// DB7 = 1 --> offset = 0x80
+// RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
+// 0 0 1 ADD ADD ADD ADD ADD ADD ADD
+// 0x80 =
+// 0 0 1 0 0 0 0 0 0 0
+#define LCD_LINE_1 0x80
+// LCD DDRAM address for the 2nd line
+// 2 lines with equal # of addresses
+// DB7 = 1 --> offset = 0x80 + (0x00..0x4F)/2 = 0xC0
+#define LCD_LINE_2 0xC0
+
+// Timing constants in us
+#define E_DELAY 1 // us
+#define E_CMD_PULSE 5000 // us
+#define E_DATA_PULSE 5000 // us
+#define C_DELAY 1 // us
+#define R_EXEC_TIME 50 // us
+#define GPIO_RISING 10 // ms
+
+#define MAX_WAIT 100
+
+void init_gpio(void);
+
+void init_lcd(void);
+
+void lcd_function_set(uint8_t control_flags);
+
+void lcd_control(uint8_t control_flags);
+
+void lcd_entry_mode(uint8_t control_flags);
+
+void lcd_shift_control(uint8_t control_flags);
+
+void clear_lcd(void);
+
+void set_cursor(uint8_t addr);
+
+uint8_t busy_wait(void);
+
+void display_off(void);
+
+void show_cursor(bool on);
+
+void cursor_blinking(bool on);
+
+void shift_cursor(uint8_t direction);
+
+void shift_display(uint8_t direction);
+
+void return_home(void);
+
+void write_to_lcd(uint8_t byte, uint8_t mode);
+
+void write_string(char *str);
+
+uint8_t read_from_lcd(uint8_t mode);
+
+void gpio_reset(void);
+
+#endif