Details | Last modification | View Log | SVN | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 160 | eqlazer | 1 | #ifndef LCD_H |
| 2 | #define LCD_H |
||
| 3 | /************************************************************************* |
||
| 4 | Title : C include file for the HD44780U LCD library (lcd.c) |
||
| 5 | Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury |
||
| 6 | File: $Id: lcd.h,v 1.13.2.2 2006/01/30 19:51:33 peter Exp $ |
||
| 7 | Software: AVR-GCC 3.3 |
||
| 8 | Hardware: any AVR device, memory mapped mode only for AT90S4414/8515/Mega |
||
| 9 | ***************************************************************************/ |
||
| 10 | |||
| 11 | /** |
||
| 12 | @defgroup pfleury_lcd LCD library |
||
| 13 | @code #include <lcd.h> @endcode |
||
| 14 | |||
| 15 | @brief Basic routines for interfacing a HD44780U-based text LCD display |
||
| 16 | |||
| 17 | Originally based on Volker Oth's LCD library, |
||
| 18 | changed lcd_init(), added additional constants for lcd_command(), |
||
| 19 | added 4-bit I/O mode, improved and optimized code. |
||
| 20 | |||
| 21 | Library can be operated in memory mapped mode (LCD_IO_MODE=0) or in |
||
| 22 | 4-bit IO port mode (LCD_IO_MODE=1). 8-bit IO port mode not supported. |
||
| 23 | |||
| 24 | Memory mapped mode compatible with Kanda STK200, but supports also |
||
| 25 | generation of R/W signal through A8 address line. |
||
| 26 | |||
| 27 | @author Peter Fleury pfleury@gmx.ch http://jump.to/fleury |
||
| 28 | |||
| 29 | @see The chapter <a href="http://homepage.sunrise.ch/mysunrise/peterfleury/avr-lcd44780.html" target="_blank">Interfacing a HD44780 Based LCD to an AVR</a> |
||
| 30 | on my home page. |
||
| 31 | |||
| 32 | */ |
||
| 33 | |||
| 34 | /*@{*/ |
||
| 35 | |||
| 36 | #if (__GNUC__ * 100 + __GNUC_MINOR__) < 303 |
||
| 37 | #error "This library requires AVR-GCC 3.3 or later, update to newer AVR-GCC compiler !" |
||
| 38 | #endif |
||
| 39 | |||
| 40 | #include <inttypes.h> |
||
| 41 | #include <avr/pgmspace.h> |
||
| 42 | |||
| 43 | #define LED_ON PORTD &= ~(1<<PD3); |
||
| 44 | #define LED_OFF PORTD |= (1<<PD3); |
||
| 45 | |||
| 46 | /** |
||
| 47 | * @name Definitions for MCU Clock Frequency |
||
| 48 | * Adapt the MCU clock frequency in Hz to your target. |
||
| 49 | */ |
||
| 50 | #define XTAL 8000000 /**< clock frequency in Hz, used to calculate delay timer */ |
||
| 51 | |||
| 52 | |||
| 53 | /** |
||
| 54 | * @name Definition for LCD controller type |
||
| 55 | * Use 0 for HD44780 controller, change to 1 for displays with KS0073 controller. |
||
| 56 | */ |
||
| 57 | #define LCD_CONTROLLER_KS0073 0 /**< Use 0 for HD44780 controller, 1 for KS0073 controller */ |
||
| 58 | |||
| 59 | /** |
||
| 60 | * @name Definitions for Display Size |
||
| 61 | * Change these definitions to adapt setting to your display |
||
| 62 | */ |
||
| 63 | #define LCD_LINES 4 /**< number of visible lines of the display */ |
||
| 64 | #define LCD_DISP_LENGTH 20 /**< visibles characters per line of the display */ |
||
| 65 | #define LCD_LINE_LENGTH 0x40 /**< internal line length of the display */ |
||
| 66 | #define LCD_START_LINE1 0x00 /**< DDRAM address of first char of line 1 */ |
||
| 67 | #define LCD_START_LINE2 0x40 /**< DDRAM address of first char of line 2 */ |
||
| 68 | #define LCD_START_LINE3 0x14 /**< DDRAM address of first char of line 3 */ |
||
| 69 | #define LCD_START_LINE4 0x54 /**< DDRAM address of first char of line 4 */ |
||
| 70 | #define LCD_WRAP_LINES 0 /**< 0: no wrap, 1: wrap at end of visibile line */ |
||
| 71 | |||
| 72 | |||
| 73 | #define LCD_IO_MODE 1 /**< 0: memory mapped mode, 1: IO port mode */ |
||
| 74 | #if LCD_IO_MODE |
||
| 75 | /** |
||
| 76 | * @name Definitions for 4-bit IO mode |
||
| 77 | * Change LCD_PORT if you want to use a different port for the LCD pins. |
||
| 78 | * |
||
| 79 | * The four LCD data lines and the three control lines RS, RW, E can be on the |
||
| 80 | * same port or on different ports. |
||
| 81 | * Change LCD_RS_PORT, LCD_RW_PORT, LCD_E_PORT if you want the control lines on |
||
| 82 | * different ports. |
||
| 83 | * |
||
| 84 | * Normally the four data lines should be mapped to bit 0..3 on one port, but it |
||
| 85 | * is possible to connect these data lines in different order or even on different |
||
| 86 | * ports by adapting the LCD_DATAx_PORT and LCD_DATAx_PIN definitions. |
||
| 87 | * |
||
| 88 | */ |
||
| 89 | #define LCD_PORT PORTC /**< port for the LCD lines */ |
||
| 90 | #define LCD_DATA0_PORT LCD_PORT /**< port for 4bit data bit 0 */ |
||
| 91 | #define LCD_DATA1_PORT LCD_PORT /**< port for 4bit data bit 1 */ |
||
| 92 | #define LCD_DATA2_PORT LCD_PORT /**< port for 4bit data bit 2 */ |
||
| 93 | #define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 3 */ |
||
| 94 | #define LCD_DATA0_PIN 0 /**< pin for 4bit data bit 0 */ |
||
| 95 | #define LCD_DATA1_PIN 1 /**< pin for 4bit data bit 1 */ |
||
| 96 | #define LCD_DATA2_PIN 2 /**< pin for 4bit data bit 2 */ |
||
| 97 | #define LCD_DATA3_PIN 3 /**< pin for 4bit data bit 3 */ |
||
| 98 | #define LCD_RS_PORT LCD_PORT /**< port for RS line */ |
||
| 99 | #define LCD_RS_PIN 4 /**< pin for RS line */ |
||
| 100 | #define LCD_RW_PORT LCD_PORT /**< port for RW line */ |
||
| 101 | #define LCD_RW_PIN 5 /**< pin for RW line */ |
||
| 102 | #define LCD_E_PORT PORTD /**< port for Enable line */ |
||
| 103 | #define LCD_E_PIN 4 /**< pin for Enable line */ |
||
| 104 | |||
| 105 | #elif defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) || defined(__AVR_ATmega64__) || \ |
||
| 106 | defined(__AVR_ATmega8515__)|| defined(__AVR_ATmega103__) || defined(__AVR_ATmega128__) || \ |
||
| 107 | defined(__AVR_ATmega161__) || defined(__AVR_ATmega162__) |
||
| 108 | /* |
||
| 109 | * memory mapped mode is only supported when the device has an external data memory interface |
||
| 110 | */ |
||
| 111 | #define LCD_IO_DATA 0xC000 /* A15=E=1, A14=RS=1 */ |
||
| 112 | #define LCD_IO_FUNCTION 0x8000 /* A15=E=1, A14=RS=0 */ |
||
| 113 | #define LCD_IO_READ 0x0100 /* A8 =R/W=1 (R/W: 1=Read, 0=Write */ |
||
| 114 | #else |
||
| 115 | #error "external data memory interface not available for this device, use 4-bit IO port mode" |
||
| 116 | |||
| 117 | #endif |
||
| 118 | |||
| 119 | |||
| 120 | /** |
||
| 121 | * @name Definitions for LCD command instructions |
||
| 122 | * The constants define the various LCD controller instructions which can be passed to the |
||
| 123 | * function lcd_command(), see HD44780 data sheet for a complete description. |
||
| 124 | */ |
||
| 125 | |||
| 126 | /* instruction register bit positions, see HD44780U data sheet */ |
||
| 127 | #define LCD_CLR 0 /* DB0: clear display */ |
||
| 128 | #define LCD_HOME 1 /* DB1: return to home position */ |
||
| 129 | #define LCD_ENTRY_MODE 2 /* DB2: set entry mode */ |
||
| 130 | #define LCD_ENTRY_INC 1 /* DB1: 1=increment, 0=decrement */ |
||
| 131 | #define LCD_ENTRY_SHIFT 0 /* DB2: 1=display shift on */ |
||
| 132 | #define LCD_ON 3 /* DB3: turn lcd/cursor on */ |
||
| 133 | #define LCD_ON_DISPLAY 2 /* DB2: turn display on */ |
||
| 134 | #define LCD_ON_CURSOR 1 /* DB1: turn cursor on */ |
||
| 135 | #define LCD_ON_BLINK 0 /* DB0: blinking cursor ? */ |
||
| 136 | #define LCD_MOVE 4 /* DB4: move cursor/display */ |
||
| 137 | #define LCD_MOVE_DISP 3 /* DB3: move display (0-> cursor) ? */ |
||
| 138 | #define LCD_MOVE_RIGHT 2 /* DB2: move right (0-> left) ? */ |
||
| 139 | #define LCD_FUNCTION 5 /* DB5: function set */ |
||
| 140 | #define LCD_FUNCTION_8BIT 4 /* DB4: set 8BIT mode (0->4BIT mode) */ |
||
| 141 | #define LCD_FUNCTION_2LINES 3 /* DB3: two lines (0->one line) */ |
||
| 142 | #define LCD_FUNCTION_10DOTS 2 /* DB2: 5x10 font (0->5x7 font) */ |
||
| 143 | #define LCD_CGRAM 6 /* DB6: set CG RAM address */ |
||
| 144 | #define LCD_DDRAM 7 /* DB7: set DD RAM address */ |
||
| 145 | #define LCD_BUSY 7 /* DB7: LCD is busy */ |
||
| 146 | |||
| 147 | /* set entry mode: display shift on/off, dec/inc cursor move direction */ |
||
| 148 | #define LCD_ENTRY_DEC 0x04 /* display shift off, dec cursor move dir */ |
||
| 149 | #define LCD_ENTRY_DEC_SHIFT 0x05 /* display shift on, dec cursor move dir */ |
||
| 150 | #define LCD_ENTRY_INC_ 0x06 /* display shift off, inc cursor move dir */ |
||
| 151 | #define LCD_ENTRY_INC_SHIFT 0x07 /* display shift on, inc cursor move dir */ |
||
| 152 | |||
| 153 | /* display on/off, cursor on/off, blinking char at cursor position */ |
||
| 154 | #define LCD_DISP_OFF 0x08 /* display off */ |
||
| 155 | #define LCD_DISP_ON 0x0C /* display on, cursor off */ |
||
| 156 | #define LCD_DISP_ON_BLINK 0x0D /* display on, cursor off, blink char */ |
||
| 157 | #define LCD_DISP_ON_CURSOR 0x0E /* display on, cursor on */ |
||
| 158 | #define LCD_DISP_ON_CURSOR_BLINK 0x0F /* display on, cursor on, blink char */ |
||
| 159 | |||
| 160 | /* move cursor/shift display */ |
||
| 161 | #define LCD_MOVE_CURSOR_LEFT 0x10 /* move cursor left (decrement) */ |
||
| 162 | #define LCD_MOVE_CURSOR_RIGHT 0x14 /* move cursor right (increment) */ |
||
| 163 | #define LCD_MOVE_DISP_LEFT 0x18 /* shift display left */ |
||
| 164 | #define LCD_MOVE_DISP_RIGHT 0x1C /* shift display right */ |
||
| 165 | |||
| 166 | /* function set: set interface data length and number of display lines */ |
||
| 167 | #define LCD_FUNCTION_4BIT_1LINE 0x20 /* 4-bit interface, single line, 5x7 dots */ |
||
| 168 | #define LCD_FUNCTION_4BIT_2LINES 0x28 /* 4-bit interface, dual line, 5x7 dots */ |
||
| 169 | #define LCD_FUNCTION_8BIT_1LINE 0x30 /* 8-bit interface, single line, 5x7 dots */ |
||
| 170 | #define LCD_FUNCTION_8BIT_2LINES 0x38 /* 8-bit interface, dual line, 5x7 dots */ |
||
| 171 | |||
| 172 | |||
| 173 | #define LCD_MODE_DEFAULT ((1<<LCD_ENTRY_MODE) | (1<<LCD_ENTRY_INC) ) |
||
| 174 | |||
| 175 | |||
| 176 | |||
| 177 | /** |
||
| 178 | * @name Functions |
||
| 179 | */ |
||
| 180 | |||
| 181 | |||
| 182 | /** |
||
| 183 | @brief Initialize display and select type of cursor |
||
| 184 | @param dispAttr \b LCD_DISP_OFF display off\n |
||
| 185 | \b LCD_DISP_ON display on, cursor off\n |
||
| 186 | \b LCD_DISP_ON_CURSOR display on, cursor on\n |
||
| 187 | \b LCD_DISP_ON_CURSOR_BLINK display on, cursor on flashing |
||
| 188 | @return none |
||
| 189 | */ |
||
| 190 | extern void lcd_init(uint8_t dispAttr); |
||
| 191 | |||
| 192 | |||
| 193 | /** |
||
| 194 | @brief Clear display and set cursor to home position |
||
| 195 | @param void |
||
| 196 | @return none |
||
| 197 | */ |
||
| 198 | extern void lcd_clrscr(void); |
||
| 199 | |||
| 200 | |||
| 201 | /** |
||
| 202 | @brief Set cursor to home position |
||
| 203 | @param void |
||
| 204 | @return none |
||
| 205 | */ |
||
| 206 | extern void lcd_home(void); |
||
| 207 | |||
| 208 | |||
| 209 | /** |
||
| 210 | @brief Set cursor to specified position |
||
| 211 | |||
| 212 | @param x horizontal position\n (0: left most position) |
||
| 213 | @param y vertical position\n (0: first line) |
||
| 214 | @return none |
||
| 215 | */ |
||
| 216 | extern void lcd_gotoxy(uint8_t x, uint8_t y); |
||
| 217 | |||
| 218 | |||
| 219 | /** |
||
| 220 | @brief Display character at current cursor position |
||
| 221 | @param c character to be displayed |
||
| 222 | @return none |
||
| 223 | */ |
||
| 224 | extern void lcd_putc(char c); |
||
| 225 | |||
| 226 | |||
| 227 | /** |
||
| 228 | @brief Display string without auto linefeed |
||
| 229 | @param s string to be displayed |
||
| 230 | @return none |
||
| 231 | */ |
||
| 232 | extern void lcd_puts(const char *s); |
||
| 233 | |||
| 234 | |||
| 235 | /** |
||
| 236 | @brief Display string from program memory without auto linefeed |
||
| 237 | @param s string from program memory be be displayed |
||
| 238 | @return none |
||
| 239 | @see lcd_puts_P |
||
| 240 | */ |
||
| 241 | extern void lcd_puts_p(const char *progmem_s); |
||
| 242 | |||
| 243 | |||
| 244 | /** |
||
| 245 | @brief Send LCD controller instruction command |
||
| 246 | @param cmd instruction to send to LCD controller, see HD44780 data sheet |
||
| 247 | @return none |
||
| 248 | */ |
||
| 249 | extern void lcd_command(uint8_t cmd); |
||
| 250 | |||
| 251 | |||
| 252 | /** |
||
| 253 | @brief Send data byte to LCD controller |
||
| 254 | |||
| 255 | Similar to lcd_putc(), but without interpreting LF |
||
| 256 | @param data byte to send to LCD controller, see HD44780 data sheet |
||
| 257 | @return none |
||
| 258 | */ |
||
| 259 | extern void lcd_data(uint8_t data); |
||
| 260 | |||
| 261 | |||
| 262 | /** |
||
| 263 | @brief macros for automatically storing string constant in program memory |
||
| 264 | */ |
||
| 265 | #define lcd_puts_P(__s) lcd_puts_p(PSTR(__s)) |
||
| 266 | |||
| 267 | /*@}*/ |
||
| 268 | #endif //LCD_H |