aboutsummaryrefslogtreecommitdiff
path: root/drivers/avr/hd44780.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/avr/hd44780.c')
-rw-r--r--drivers/avr/hd44780.c510
1 files changed, 227 insertions, 283 deletions
diff --git a/drivers/avr/hd44780.c b/drivers/avr/hd44780.c
index 51414d8f9..f71069dec 100644
--- a/drivers/avr/hd44780.c
+++ b/drivers/avr/hd44780.c
@@ -3,7 +3,7 @@
3 Author: Peter Fleury <pfleury@gmx.ch> http://tinyurl.com/peterfleury 3 Author: Peter Fleury <pfleury@gmx.ch> http://tinyurl.com/peterfleury
4 License: GNU General Public License Version 3 4 License: GNU General Public License Version 3
5 File: $Id: lcd.c,v 1.15.2.2 2015/01/17 12:16:05 peter Exp $ 5 File: $Id: lcd.c,v 1.15.2.2 2015/01/17 12:16:05 peter Exp $
6 Software: AVR-GCC 3.3 6 Software: AVR-GCC 3.3
7 Target: any AVR device, memory mapped mode only for AT90S4414/8515/Mega 7 Target: any AVR device, memory mapped mode only for AT90S4414/8515/Mega
8 8
9 DESCRIPTION 9 DESCRIPTION
@@ -13,15 +13,15 @@
13 changed lcd_init(), added additional constants for lcd_command(), 13 changed lcd_init(), added additional constants for lcd_command(),
14 added 4-bit I/O mode, improved and optimized code. 14 added 4-bit I/O mode, improved and optimized code.
15 15
16 Library can be operated in memory mapped mode (LCD_IO_MODE=0) or in 16 Library can be operated in memory mapped mode (LCD_IO_MODE=0) or in
17 4-bit IO port mode (LCD_IO_MODE=1). 8-bit IO port mode not supported. 17 4-bit IO port mode (LCD_IO_MODE=1). 8-bit IO port mode not supported.
18 18
19 Memory mapped mode compatible with Kanda STK200, but supports also 19 Memory mapped mode compatible with Kanda STK200, but supports also
20 generation of R/W signal through A8 address line. 20 generation of R/W signal through A8 address line.
21 21
22 USAGE 22 USAGE
23 See the C include lcd.h file for a description of each function 23 See the C include lcd.h file for a description of each function
24 24
25*****************************************************************************/ 25*****************************************************************************/
26#include <inttypes.h> 26#include <inttypes.h>
27#include <avr/io.h> 27#include <avr/io.h>
@@ -29,55 +29,54 @@
29#include <util/delay.h> 29#include <util/delay.h>
30#include "hd44780.h" 30#include "hd44780.h"
31 31
32/* 32/*
33** constants/macros 33** constants/macros
34*/ 34*/
35#define DDR(x) (*(&x - 1)) /* address of data direction register of port x */ 35#define DDR(x) (*(&x - 1)) /* address of data direction register of port x */
36#if defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) 36#if defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
37 /* on ATmega64/128 PINF is on port 0x00 and not 0x60 */ 37/* on ATmega64/128 PINF is on port 0x00 and not 0x60 */
38 #define PIN(x) ( &PORTF==&(x) ? _SFR_IO8(0x00) : (*(&x - 2)) ) 38# define PIN(x) (&PORTF == &(x) ? _SFR_IO8(0x00) : (*(&x - 2)))
39#else 39#else
40 #define PIN(x) (*(&x - 2)) /* address of input register of port x */ 40# define PIN(x) (*(&x - 2)) /* address of input register of port x */
41#endif 41#endif
42 42
43
44#if LCD_IO_MODE 43#if LCD_IO_MODE
45#define lcd_e_delay() _delay_us(LCD_DELAY_ENABLE_PULSE) 44# define lcd_e_delay() _delay_us(LCD_DELAY_ENABLE_PULSE)
46#define lcd_e_high() LCD_E_PORT |= _BV(LCD_E_PIN); 45# define lcd_e_high() LCD_E_PORT |= _BV(LCD_E_PIN);
47#define lcd_e_low() LCD_E_PORT &= ~_BV(LCD_E_PIN); 46# define lcd_e_low() LCD_E_PORT &= ~_BV(LCD_E_PIN);
48#define lcd_e_toggle() toggle_e() 47# define lcd_e_toggle() toggle_e()
49#define lcd_rw_high() LCD_RW_PORT |= _BV(LCD_RW_PIN) 48# define lcd_rw_high() LCD_RW_PORT |= _BV(LCD_RW_PIN)
50#define lcd_rw_low() LCD_RW_PORT &= ~_BV(LCD_RW_PIN) 49# define lcd_rw_low() LCD_RW_PORT &= ~_BV(LCD_RW_PIN)
51#define lcd_rs_high() LCD_RS_PORT |= _BV(LCD_RS_PIN) 50# define lcd_rs_high() LCD_RS_PORT |= _BV(LCD_RS_PIN)
52#define lcd_rs_low() LCD_RS_PORT &= ~_BV(LCD_RS_PIN) 51# define lcd_rs_low() LCD_RS_PORT &= ~_BV(LCD_RS_PIN)
53#endif 52#endif
54 53
55#if LCD_IO_MODE 54#if LCD_IO_MODE
56#if LCD_LINES==1 55# if LCD_LINES == 1
57#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_1LINE 56# define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_1LINE
57# else
58# define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_2LINES
59# endif
58#else 60#else
59#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_2LINES 61# if LCD_LINES == 1
60#endif 62# define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_1LINE
61#else 63# else
62#if LCD_LINES==1 64# define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_2LINES
63#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_1LINE 65# endif
64#else
65#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_2LINES
66#endif
67#endif 66#endif
68 67
69#if LCD_CONTROLLER_KS0073 68#if LCD_CONTROLLER_KS0073
70#if LCD_LINES==4 69# if LCD_LINES == 4
71 70
72#define KS0073_EXTENDED_FUNCTION_REGISTER_ON 0x2C /* |0|010|1100 4-bit mode, extension-bit RE = 1 */ 71# define KS0073_EXTENDED_FUNCTION_REGISTER_ON 0x2C /* |0|010|1100 4-bit mode, extension-bit RE = 1 */
73#define KS0073_EXTENDED_FUNCTION_REGISTER_OFF 0x28 /* |0|010|1000 4-bit mode, extension-bit RE = 0 */ 72# define KS0073_EXTENDED_FUNCTION_REGISTER_OFF 0x28 /* |0|010|1000 4-bit mode, extension-bit RE = 0 */
74#define KS0073_4LINES_MODE 0x09 /* |0|000|1001 4 lines mode */ 73# define KS0073_4LINES_MODE 0x09 /* |0|000|1001 4 lines mode */
75 74
76#endif 75# endif
77#endif 76#endif
78 77
79/* 78/*
80** function prototypes 79** function prototypes
81*/ 80*/
82#if LCD_IO_MODE 81#if LCD_IO_MODE
83static void toggle_e(void); 82static void toggle_e(void);
@@ -87,93 +86,83 @@ static void toggle_e(void);
87** local functions 86** local functions
88*/ 87*/
89 88
90 89/*************************************************************************
91/*************************************************************************
92delay for a minimum of <us> microseconds 90delay for a minimum of <us> microseconds
93the number of loops is calculated at compile-time from MCU clock frequency 91the number of loops is calculated at compile-time from MCU clock frequency
94*************************************************************************/ 92*************************************************************************/
95#define delay(us) _delay_us(us) 93#define delay(us) _delay_us(us)
96
97 94
98#if LCD_IO_MODE 95#if LCD_IO_MODE
99/* toggle Enable Pin to initiate write */ 96/* toggle Enable Pin to initiate write */
100static void toggle_e(void) 97static void toggle_e(void) {
101{
102 lcd_e_high(); 98 lcd_e_high();
103 lcd_e_delay(); 99 lcd_e_delay();
104 lcd_e_low(); 100 lcd_e_low();
105} 101}
106#endif 102#endif
107 103
108
109/************************************************************************* 104/*************************************************************************
110Low-level function to write byte to LCD controller 105Low-level function to write byte to LCD controller
111Input: data byte to write to LCD 106Input: data byte to write to LCD
112 rs 1: write data 107 rs 1: write data
113 0: write instruction 108 0: write instruction
114Returns: none 109Returns: none
115*************************************************************************/ 110*************************************************************************/
116#if LCD_IO_MODE 111#if LCD_IO_MODE
117static void lcd_write(uint8_t data,uint8_t rs) 112static void lcd_write(uint8_t data, uint8_t rs) {
118{ 113 unsigned char dataBits;
119 unsigned char dataBits ;
120
121 114
122 if (rs) { /* write data (RS=1, RW=0) */ 115 if (rs) { /* write data (RS=1, RW=0) */
123 lcd_rs_high(); 116 lcd_rs_high();
124 } else { /* write instruction (RS=0, RW=0) */ 117 } else { /* write instruction (RS=0, RW=0) */
125 lcd_rs_low(); 118 lcd_rs_low();
126 } 119 }
127 lcd_rw_low(); /* RW=0 write mode */ 120 lcd_rw_low(); /* RW=0 write mode */
128 121
129 if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT ) 122 if ((&LCD_DATA0_PORT == &LCD_DATA1_PORT) && (&LCD_DATA1_PORT == &LCD_DATA2_PORT) && (&LCD_DATA2_PORT == &LCD_DATA3_PORT) && (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3)) {
130 && (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) )
131 {
132 /* configure data pins as output */ 123 /* configure data pins as output */
133 DDR(LCD_DATA0_PORT) |= 0x0F; 124 DDR(LCD_DATA0_PORT) |= 0x0F;
134 125
135 /* output high nibble first */ 126 /* output high nibble first */
136 dataBits = LCD_DATA0_PORT & 0xF0; 127 dataBits = LCD_DATA0_PORT & 0xF0;
137 LCD_DATA0_PORT = dataBits |((data>>4)&0x0F); 128 LCD_DATA0_PORT = dataBits | ((data >> 4) & 0x0F);
138 lcd_e_toggle(); 129 lcd_e_toggle();
139 130
140 /* output low nibble */ 131 /* output low nibble */
141 LCD_DATA0_PORT = dataBits | (data&0x0F); 132 LCD_DATA0_PORT = dataBits | (data & 0x0F);
142 lcd_e_toggle(); 133 lcd_e_toggle();
143 134
144 /* all data pins high (inactive) */ 135 /* all data pins high (inactive) */
145 LCD_DATA0_PORT = dataBits | 0x0F; 136 LCD_DATA0_PORT = dataBits | 0x0F;
146 } 137 } else {
147 else
148 {
149 /* configure data pins as output */ 138 /* configure data pins as output */
150 DDR(LCD_DATA0_PORT) |= _BV(LCD_DATA0_PIN); 139 DDR(LCD_DATA0_PORT) |= _BV(LCD_DATA0_PIN);
151 DDR(LCD_DATA1_PORT) |= _BV(LCD_DATA1_PIN); 140 DDR(LCD_DATA1_PORT) |= _BV(LCD_DATA1_PIN);
152 DDR(LCD_DATA2_PORT) |= _BV(LCD_DATA2_PIN); 141 DDR(LCD_DATA2_PORT) |= _BV(LCD_DATA2_PIN);
153 DDR(LCD_DATA3_PORT) |= _BV(LCD_DATA3_PIN); 142 DDR(LCD_DATA3_PORT) |= _BV(LCD_DATA3_PIN);
154 143
155 /* output high nibble first */ 144 /* output high nibble first */
156 LCD_DATA3_PORT &= ~_BV(LCD_DATA3_PIN); 145 LCD_DATA3_PORT &= ~_BV(LCD_DATA3_PIN);
157 LCD_DATA2_PORT &= ~_BV(LCD_DATA2_PIN); 146 LCD_DATA2_PORT &= ~_BV(LCD_DATA2_PIN);
158 LCD_DATA1_PORT &= ~_BV(LCD_DATA1_PIN); 147 LCD_DATA1_PORT &= ~_BV(LCD_DATA1_PIN);
159 LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN); 148 LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN);
160 if(data & 0x80) LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN); 149 if (data & 0x80) LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN);
161 if(data & 0x40) LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN); 150 if (data & 0x40) LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN);
162 if(data & 0x20) LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN); 151 if (data & 0x20) LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN);
163 if(data & 0x10) LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN); 152 if (data & 0x10) LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN);
164 lcd_e_toggle(); 153 lcd_e_toggle();
165 154
166 /* output low nibble */ 155 /* output low nibble */
167 LCD_DATA3_PORT &= ~_BV(LCD_DATA3_PIN); 156 LCD_DATA3_PORT &= ~_BV(LCD_DATA3_PIN);
168 LCD_DATA2_PORT &= ~_BV(LCD_DATA2_PIN); 157 LCD_DATA2_PORT &= ~_BV(LCD_DATA2_PIN);
169 LCD_DATA1_PORT &= ~_BV(LCD_DATA1_PIN); 158 LCD_DATA1_PORT &= ~_BV(LCD_DATA1_PIN);
170 LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN); 159 LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN);
171 if(data & 0x08) LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN); 160 if (data & 0x08) LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN);
172 if(data & 0x04) LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN); 161 if (data & 0x04) LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN);
173 if(data & 0x02) LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN); 162 if (data & 0x02) LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN);
174 if(data & 0x01) LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN); 163 if (data & 0x01) LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN);
175 lcd_e_toggle(); 164 lcd_e_toggle();
176 165
177 /* all data pins high (inactive) */ 166 /* all data pins high (inactive) */
178 LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN); 167 LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN);
179 LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN); 168 LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN);
@@ -182,85 +171,81 @@ static void lcd_write(uint8_t data,uint8_t rs)
182 } 171 }
183} 172}
184#else 173#else
185#define lcd_write(d,rs) if (rs) *(volatile uint8_t*)(LCD_IO_DATA) = d; else *(volatile uint8_t*)(LCD_IO_FUNCTION) = d; 174# define lcd_write(d, rs) \
175 if (rs) \
176 *(volatile uint8_t *)(LCD_IO_DATA) = d; \
177 else \
178 *(volatile uint8_t *)(LCD_IO_FUNCTION) = d;
186/* rs==0 -> write instruction to LCD_IO_FUNCTION */ 179/* rs==0 -> write instruction to LCD_IO_FUNCTION */
187/* rs==1 -> write data to LCD_IO_DATA */ 180/* rs==1 -> write data to LCD_IO_DATA */
188#endif 181#endif
189 182
190
191/************************************************************************* 183/*************************************************************************
192Low-level function to read byte from LCD controller 184Low-level function to read byte from LCD controller
193Input: rs 1: read data 185Input: rs 1: read data
194 0: read busy flag / address counter 186 0: read busy flag / address counter
195Returns: byte read from LCD controller 187Returns: byte read from LCD controller
196*************************************************************************/ 188*************************************************************************/
197#if LCD_IO_MODE 189#if LCD_IO_MODE
198static uint8_t lcd_read(uint8_t rs) 190static uint8_t lcd_read(uint8_t rs) {
199{
200 uint8_t data; 191 uint8_t data;
201 192
202
203 if (rs) 193 if (rs)
204 lcd_rs_high(); /* RS=1: read data */ 194 lcd_rs_high(); /* RS=1: read data */
205 else 195 else
206 lcd_rs_low(); /* RS=0: read busy flag */ 196 lcd_rs_low(); /* RS=0: read busy flag */
207 lcd_rw_high(); /* RW=1 read mode */ 197 lcd_rw_high(); /* RW=1 read mode */
208 198
209 if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT ) 199 if ((&LCD_DATA0_PORT == &LCD_DATA1_PORT) && (&LCD_DATA1_PORT == &LCD_DATA2_PORT) && (&LCD_DATA2_PORT == &LCD_DATA3_PORT) && (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3)) {
210 && ( LCD_DATA0_PIN == 0 )&& (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) ) 200 DDR(LCD_DATA0_PORT) &= 0xF0; /* configure data pins as input */
211 { 201
212 DDR(LCD_DATA0_PORT) &= 0xF0; /* configure data pins as input */
213
214 lcd_e_high(); 202 lcd_e_high();
215 lcd_e_delay(); 203 lcd_e_delay();
216 data = PIN(LCD_DATA0_PORT) << 4; /* read high nibble first */ 204 data = PIN(LCD_DATA0_PORT) << 4; /* read high nibble first */
217 lcd_e_low(); 205 lcd_e_low();
218 206
219 lcd_e_delay(); /* Enable 500ns low */ 207 lcd_e_delay(); /* Enable 500ns low */
220 208
221 lcd_e_high(); 209 lcd_e_high();
222 lcd_e_delay(); 210 lcd_e_delay();
223 data |= PIN(LCD_DATA0_PORT)&0x0F; /* read low nibble */ 211 data |= PIN(LCD_DATA0_PORT) & 0x0F; /* read low nibble */
224 lcd_e_low(); 212 lcd_e_low();
225 } 213 } else {
226 else
227 {
228 /* configure data pins as input */ 214 /* configure data pins as input */
229 DDR(LCD_DATA0_PORT) &= ~_BV(LCD_DATA0_PIN); 215 DDR(LCD_DATA0_PORT) &= ~_BV(LCD_DATA0_PIN);
230 DDR(LCD_DATA1_PORT) &= ~_BV(LCD_DATA1_PIN); 216 DDR(LCD_DATA1_PORT) &= ~_BV(LCD_DATA1_PIN);
231 DDR(LCD_DATA2_PORT) &= ~_BV(LCD_DATA2_PIN); 217 DDR(LCD_DATA2_PORT) &= ~_BV(LCD_DATA2_PIN);
232 DDR(LCD_DATA3_PORT) &= ~_BV(LCD_DATA3_PIN); 218 DDR(LCD_DATA3_PORT) &= ~_BV(LCD_DATA3_PIN);
233 219
234 /* read high nibble first */ 220 /* read high nibble first */
235 lcd_e_high(); 221 lcd_e_high();
236 lcd_e_delay(); 222 lcd_e_delay();
237 data = 0; 223 data = 0;
238 if ( PIN(LCD_DATA0_PORT) & _BV(LCD_DATA0_PIN) ) data |= 0x10; 224 if (PIN(LCD_DATA0_PORT) & _BV(LCD_DATA0_PIN)) data |= 0x10;
239 if ( PIN(LCD_DATA1_PORT) & _BV(LCD_DATA1_PIN) ) data |= 0x20; 225 if (PIN(LCD_DATA1_PORT) & _BV(LCD_DATA1_PIN)) data |= 0x20;
240 if ( PIN(LCD_DATA2_PORT) & _BV(LCD_DATA2_PIN) ) data |= 0x40; 226 if (PIN(LCD_DATA2_PORT) & _BV(LCD_DATA2_PIN)) data |= 0x40;
241 if ( PIN(LCD_DATA3_PORT) & _BV(LCD_DATA3_PIN) ) data |= 0x80; 227 if (PIN(LCD_DATA3_PORT) & _BV(LCD_DATA3_PIN)) data |= 0x80;
242 lcd_e_low(); 228 lcd_e_low();
243 229
244 lcd_e_delay(); /* Enable 500ns low */ 230 lcd_e_delay(); /* Enable 500ns low */
245 231
246 /* read low nibble */ 232 /* read low nibble */
247 lcd_e_high(); 233 lcd_e_high();
248 lcd_e_delay(); 234 lcd_e_delay();
249 if ( PIN(LCD_DATA0_PORT) & _BV(LCD_DATA0_PIN) ) data |= 0x01; 235 if (PIN(LCD_DATA0_PORT) & _BV(LCD_DATA0_PIN)) data |= 0x01;
250 if ( PIN(LCD_DATA1_PORT) & _BV(LCD_DATA1_PIN) ) data |= 0x02; 236 if (PIN(LCD_DATA1_PORT) & _BV(LCD_DATA1_PIN)) data |= 0x02;
251 if ( PIN(LCD_DATA2_PORT) & _BV(LCD_DATA2_PIN) ) data |= 0x04; 237 if (PIN(LCD_DATA2_PORT) & _BV(LCD_DATA2_PIN)) data |= 0x04;
252 if ( PIN(LCD_DATA3_PORT) & _BV(LCD_DATA3_PIN) ) data |= 0x08; 238 if (PIN(LCD_DATA3_PORT) & _BV(LCD_DATA3_PIN)) data |= 0x08;
253 lcd_e_low(); 239 lcd_e_low();
254 } 240 }
255 return data; 241 return data;
256} 242}
257#else 243#else
258#define lcd_read(rs) (rs) ? *(volatile uint8_t*)(LCD_IO_DATA+LCD_IO_READ) : *(volatile uint8_t*)(LCD_IO_FUNCTION+LCD_IO_READ) 244# define lcd_read(rs) (rs) ? *(volatile uint8_t *)(LCD_IO_DATA + LCD_IO_READ) : *(volatile uint8_t *)(LCD_IO_FUNCTION + LCD_IO_READ)
259/* rs==0 -> read instruction from LCD_IO_FUNCTION */ 245/* rs==0 -> read instruction from LCD_IO_FUNCTION */
260/* rs==1 -> read data from LCD_IO_DATA */ 246/* rs==1 -> read data from LCD_IO_DATA */
261#endif 247#endif
262 248
263
264/************************************************************************* 249/*************************************************************************
265loops while lcd is busy, returns address counter 250loops while lcd is busy, returns address counter
266*************************************************************************/ 251*************************************************************************/
@@ -268,65 +253,62 @@ static uint8_t lcd_waitbusy(void)
268 253
269{ 254{
270 register uint8_t c; 255 register uint8_t c;
271 256
272 /* wait until busy flag is cleared */ 257 /* wait until busy flag is cleared */
273 while ( (c=lcd_read(0)) & (1<<LCD_BUSY)) {} 258 while ((c = lcd_read(0)) & (1 << LCD_BUSY)) {
274 259 }
260
275 /* the address counter is updated 4us after the busy flag is cleared */ 261 /* the address counter is updated 4us after the busy flag is cleared */
276 delay(LCD_DELAY_BUSY_FLAG); 262 delay(LCD_DELAY_BUSY_FLAG);
277 263
278 /* now read the address counter */ 264 /* now read the address counter */
279 return (lcd_read(0)); // return address counter 265 return (lcd_read(0)); // return address counter
280
281}/* lcd_waitbusy */
282 266
267} /* lcd_waitbusy */
283 268
284/************************************************************************* 269/*************************************************************************
285Move cursor to the start of next line or to the first line if the cursor 270Move cursor to the start of next line or to the first line if the cursor
286is already on the last line. 271is already on the last line.
287*************************************************************************/ 272*************************************************************************/
288static inline void lcd_newline(uint8_t pos) 273static inline void lcd_newline(uint8_t pos) {
289{
290 register uint8_t addressCounter; 274 register uint8_t addressCounter;
291 275
292 276#if LCD_LINES == 1
293#if LCD_LINES==1
294 addressCounter = 0; 277 addressCounter = 0;
295#endif 278#endif
296#if LCD_LINES==2 279#if LCD_LINES == 2
297 if ( pos < (LCD_START_LINE2) ) 280 if (pos < (LCD_START_LINE2))
298 addressCounter = LCD_START_LINE2; 281 addressCounter = LCD_START_LINE2;
299 else 282 else
300 addressCounter = LCD_START_LINE1; 283 addressCounter = LCD_START_LINE1;
301#endif 284#endif
302#if LCD_LINES==4 285#if LCD_LINES == 4
303#if KS0073_4LINES_MODE 286# if KS0073_4LINES_MODE
304 if ( pos < LCD_START_LINE2 ) 287 if (pos < LCD_START_LINE2)
305 addressCounter = LCD_START_LINE2; 288 addressCounter = LCD_START_LINE2;
306 else if ( (pos >= LCD_START_LINE2) && (pos < LCD_START_LINE3) ) 289 else if ((pos >= LCD_START_LINE2) && (pos < LCD_START_LINE3))
307 addressCounter = LCD_START_LINE3; 290 addressCounter = LCD_START_LINE3;
308 else if ( (pos >= LCD_START_LINE3) && (pos < LCD_START_LINE4) ) 291 else if ((pos >= LCD_START_LINE3) && (pos < LCD_START_LINE4))
309 addressCounter = LCD_START_LINE4; 292 addressCounter = LCD_START_LINE4;
310 else 293 else
311 addressCounter = LCD_START_LINE1; 294 addressCounter = LCD_START_LINE1;
312#else 295# else
313 if ( pos < LCD_START_LINE3 ) 296 if (pos < LCD_START_LINE3)
314 addressCounter = LCD_START_LINE2; 297 addressCounter = LCD_START_LINE2;
315 else if ( (pos >= LCD_START_LINE2) && (pos < LCD_START_LINE4) ) 298 else if ((pos >= LCD_START_LINE2) && (pos < LCD_START_LINE4))
316 addressCounter = LCD_START_LINE3; 299 addressCounter = LCD_START_LINE3;
317 else if ( (pos >= LCD_START_LINE3) && (pos < LCD_START_LINE2) ) 300 else if ((pos >= LCD_START_LINE3) && (pos < LCD_START_LINE2))
318 addressCounter = LCD_START_LINE4; 301 addressCounter = LCD_START_LINE4;
319 else 302 else
320 addressCounter = LCD_START_LINE1; 303 addressCounter = LCD_START_LINE1;
304# endif
321#endif 305#endif
322#endif 306 lcd_command((1 << LCD_DDRAM) + addressCounter);
323 lcd_command((1<<LCD_DDRAM)+addressCounter);
324
325}/* lcd_newline */
326 307
308} /* lcd_newline */
327 309
328/* 310/*
329** PUBLIC FUNCTIONS 311** PUBLIC FUNCTIONS
330*/ 312*/
331 313
332/************************************************************************* 314/*************************************************************************
@@ -334,132 +316,107 @@ Send LCD controller instruction command
334Input: instruction to send to LCD controller, see HD44780 data sheet 316Input: instruction to send to LCD controller, see HD44780 data sheet
335Returns: none 317Returns: none
336*************************************************************************/ 318*************************************************************************/
337void lcd_command(uint8_t cmd) 319void lcd_command(uint8_t cmd) {
338{
339 lcd_waitbusy(); 320 lcd_waitbusy();
340 lcd_write(cmd,0); 321 lcd_write(cmd, 0);
341} 322}
342 323
343
344/************************************************************************* 324/*************************************************************************
345Send data byte to LCD controller 325Send data byte to LCD controller
346Input: data to send to LCD controller, see HD44780 data sheet 326Input: data to send to LCD controller, see HD44780 data sheet
347Returns: none 327Returns: none
348*************************************************************************/ 328*************************************************************************/
349void lcd_data(uint8_t data) 329void lcd_data(uint8_t data) {
350{
351 lcd_waitbusy(); 330 lcd_waitbusy();
352 lcd_write(data,1); 331 lcd_write(data, 1);
353} 332}
354 333
355
356
357/************************************************************************* 334/*************************************************************************
358Set cursor to specified position 335Set cursor to specified position
359Input: x horizontal position (0: left most position) 336Input: x horizontal position (0: left most position)
360 y vertical position (0: first line) 337 y vertical position (0: first line)
361Returns: none 338Returns: none
362*************************************************************************/ 339*************************************************************************/
363void lcd_gotoxy(uint8_t x, uint8_t y) 340void lcd_gotoxy(uint8_t x, uint8_t y) {
364{ 341#if LCD_LINES == 1
365#if LCD_LINES==1 342 lcd_command((1 << LCD_DDRAM) + LCD_START_LINE1 + x);
366 lcd_command((1<<LCD_DDRAM)+LCD_START_LINE1+x);
367#endif 343#endif
368#if LCD_LINES==2 344#if LCD_LINES == 2
369 if ( y==0 ) 345 if (y == 0)
370 lcd_command((1<<LCD_DDRAM)+LCD_START_LINE1+x); 346 lcd_command((1 << LCD_DDRAM) + LCD_START_LINE1 + x);
371 else 347 else
372 lcd_command((1<<LCD_DDRAM)+LCD_START_LINE2+x); 348 lcd_command((1 << LCD_DDRAM) + LCD_START_LINE2 + x);
373#endif 349#endif
374#if LCD_LINES==4 350#if LCD_LINES == 4
375 if ( y==0 ) 351 if (y == 0)
376 lcd_command((1<<LCD_DDRAM)+LCD_START_LINE1+x); 352 lcd_command((1 << LCD_DDRAM) + LCD_START_LINE1 + x);
377 else if ( y==1) 353 else if (y == 1)
378 lcd_command((1<<LCD_DDRAM)+LCD_START_LINE2+x); 354 lcd_command((1 << LCD_DDRAM) + LCD_START_LINE2 + x);
379 else if ( y==2) 355 else if (y == 2)
380 lcd_command((1<<LCD_DDRAM)+LCD_START_LINE3+x); 356 lcd_command((1 << LCD_DDRAM) + LCD_START_LINE3 + x);
381 else /* y==3 */ 357 else /* y==3 */
382 lcd_command((1<<LCD_DDRAM)+LCD_START_LINE4+x); 358 lcd_command((1 << LCD_DDRAM) + LCD_START_LINE4 + x);
383#endif 359#endif
384 360
385}/* lcd_gotoxy */ 361} /* lcd_gotoxy */
386
387 362
388/************************************************************************* 363/*************************************************************************
389*************************************************************************/ 364*************************************************************************/
390int lcd_getxy(void) 365int lcd_getxy(void) { return lcd_waitbusy(); }
391{
392 return lcd_waitbusy();
393}
394
395 366
396/************************************************************************* 367/*************************************************************************
397Clear display and set cursor to home position 368Clear display and set cursor to home position
398*************************************************************************/ 369*************************************************************************/
399void lcd_clrscr(void) 370void lcd_clrscr(void) { lcd_command(1 << LCD_CLR); }
400{
401 lcd_command(1<<LCD_CLR);
402}
403
404 371
405/************************************************************************* 372/*************************************************************************
406Set cursor to home position 373Set cursor to home position
407*************************************************************************/ 374*************************************************************************/
408void lcd_home(void) 375void lcd_home(void) { lcd_command(1 << LCD_HOME); }
409{
410 lcd_command(1<<LCD_HOME);
411}
412
413 376
414/************************************************************************* 377/*************************************************************************
415Display character at current cursor position 378Display character at current cursor position
416Input: character to be displayed 379Input: character to be displayed
417Returns: none 380Returns: none
418*************************************************************************/ 381*************************************************************************/
419void lcd_putc(char c) 382void lcd_putc(char c) {
420{
421 uint8_t pos; 383 uint8_t pos;
422 384
423 385 pos = lcd_waitbusy(); // read busy-flag and address counter
424 pos = lcd_waitbusy(); // read busy-flag and address counter 386 if (c == '\n') {
425 if (c=='\n')
426 {
427 lcd_newline(pos); 387 lcd_newline(pos);
428 } 388 } else {
429 else 389#if LCD_WRAP_LINES == 1
430 { 390# if LCD_LINES == 1
431#if LCD_WRAP_LINES==1 391 if (pos == LCD_START_LINE1 + LCD_DISP_LENGTH) {
432#if LCD_LINES==1 392 lcd_write((1 << LCD_DDRAM) + LCD_START_LINE1, 0);
433 if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
434 lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
435 } 393 }
436#elif LCD_LINES==2 394# elif LCD_LINES == 2
437 if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) { 395 if (pos == LCD_START_LINE1 + LCD_DISP_LENGTH) {
438 lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0); 396 lcd_write((1 << LCD_DDRAM) + LCD_START_LINE2, 0);
439 }else if ( pos == LCD_START_LINE2+LCD_DISP_LENGTH ){ 397 } else if (pos == LCD_START_LINE2 + LCD_DISP_LENGTH) {
440 lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0); 398 lcd_write((1 << LCD_DDRAM) + LCD_START_LINE1, 0);
441 } 399 }
442#elif LCD_LINES==4 400# elif LCD_LINES == 4
443 if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) { 401 if (pos == LCD_START_LINE1 + LCD_DISP_LENGTH) {
444 lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0); 402 lcd_write((1 << LCD_DDRAM) + LCD_START_LINE2, 0);
445 }else if ( pos == LCD_START_LINE2+LCD_DISP_LENGTH ) { 403 } else if (pos == LCD_START_LINE2 + LCD_DISP_LENGTH) {
446 lcd_write((1<<LCD_DDRAM)+LCD_START_LINE3,0); 404 lcd_write((1 << LCD_DDRAM) + LCD_START_LINE3, 0);
447 }else if ( pos == LCD_START_LINE3+LCD_DISP_LENGTH ) { 405 } else if (pos == LCD_START_LINE3 + LCD_DISP_LENGTH) {
448 lcd_write((1<<LCD_DDRAM)+LCD_START_LINE4,0); 406 lcd_write((1 << LCD_DDRAM) + LCD_START_LINE4, 0);
449 }else if ( pos == LCD_START_LINE4+LCD_DISP_LENGTH ) { 407 } else if (pos == LCD_START_LINE4 + LCD_DISP_LENGTH) {
450 lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0); 408 lcd_write((1 << LCD_DDRAM) + LCD_START_LINE1, 0);
451 } 409 }
452#endif 410# endif
453 lcd_waitbusy(); 411 lcd_waitbusy();
454#endif 412#endif
455 lcd_write(c, 1); 413 lcd_write(c, 1);
456 } 414 }
457 415
458}/* lcd_putc */ 416} /* lcd_putc */
459
460 417
461/************************************************************************* 418/*************************************************************************
462Display string without auto linefeed 419Display string without auto linefeed
463Input: string to be displayed 420Input: string to be displayed
464Returns: none 421Returns: none
465*************************************************************************/ 422*************************************************************************/
@@ -468,16 +425,15 @@ void lcd_puts(const char *s)
468{ 425{
469 register char c; 426 register char c;
470 427
471 while ( (c = *s++) ) { 428 while ((c = *s++)) {
472 lcd_putc(c); 429 lcd_putc(c);
473 } 430 }
474 431
475}/* lcd_puts */ 432} /* lcd_puts */
476
477 433
478/************************************************************************* 434/*************************************************************************
479Display string from program memory without auto linefeed 435Display string from program memory without auto linefeed
480Input: string from program memory be be displayed 436Input: string from program memory be be displayed
481Returns: none 437Returns: none
482*************************************************************************/ 438*************************************************************************/
483void lcd_puts_p(const char *progmem_s) 439void lcd_puts_p(const char *progmem_s)
@@ -485,108 +441,96 @@ void lcd_puts_p(const char *progmem_s)
485{ 441{
486 register char c; 442 register char c;
487 443
488 while ( (c = pgm_read_byte(progmem_s++)) ) { 444 while ((c = pgm_read_byte(progmem_s++))) {
489 lcd_putc(c); 445 lcd_putc(c);
490 } 446 }
491 447
492}/* lcd_puts_p */ 448} /* lcd_puts_p */
493
494 449
495/************************************************************************* 450/*************************************************************************
496Initialize display and select type of cursor 451Initialize display and select type of cursor
497Input: dispAttr LCD_DISP_OFF display off 452Input: dispAttr LCD_DISP_OFF display off
498 LCD_DISP_ON display on, cursor off 453 LCD_DISP_ON display on, cursor off
499 LCD_DISP_ON_CURSOR display on, cursor on 454 LCD_DISP_ON_CURSOR display on, cursor on
500 LCD_DISP_CURSOR_BLINK display on, cursor on flashing 455 LCD_DISP_CURSOR_BLINK display on, cursor on flashing
501Returns: none 456Returns: none
502*************************************************************************/ 457*************************************************************************/
503void lcd_init(uint8_t dispAttr) 458void lcd_init(uint8_t dispAttr) {
504{
505#if LCD_IO_MODE 459#if LCD_IO_MODE
506 /* 460 /*
507 * Initialize LCD to 4 bit I/O mode 461 * Initialize LCD to 4 bit I/O mode
508 */ 462 */
509 463
510 if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT ) 464 if ((&LCD_DATA0_PORT == &LCD_DATA1_PORT) && (&LCD_DATA1_PORT == &LCD_DATA2_PORT) && (&LCD_DATA2_PORT == &LCD_DATA3_PORT) && (&LCD_RS_PORT == &LCD_DATA0_PORT) && (&LCD_RW_PORT == &LCD_DATA0_PORT) && (&LCD_E_PORT == &LCD_DATA0_PORT) && (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) && (LCD_RS_PIN == 4) && (LCD_RW_PIN == 5) && (LCD_E_PIN == 6)) {
511 && ( &LCD_RS_PORT == &LCD_DATA0_PORT) && ( &LCD_RW_PORT == &LCD_DATA0_PORT) && (&LCD_E_PORT == &LCD_DATA0_PORT)
512 && (LCD_DATA0_PIN == 0 ) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3)
513 && (LCD_RS_PIN == 4 ) && (LCD_RW_PIN == 5) && (LCD_E_PIN == 6 ) )
514 {
515 /* configure all port bits as output (all LCD lines on same port) */ 465 /* configure all port bits as output (all LCD lines on same port) */
516 DDR(LCD_DATA0_PORT) |= 0x7F; 466 DDR(LCD_DATA0_PORT) |= 0x7F;
517 } 467 } else if ((&LCD_DATA0_PORT == &LCD_DATA1_PORT) && (&LCD_DATA1_PORT == &LCD_DATA2_PORT) && (&LCD_DATA2_PORT == &LCD_DATA3_PORT) && (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3)) {
518 else if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
519 && (LCD_DATA0_PIN == 0 ) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) )
520 {
521 /* configure all port bits as output (all LCD data lines on same port, but control lines on different ports) */ 468 /* configure all port bits as output (all LCD data lines on same port, but control lines on different ports) */
522 DDR(LCD_DATA0_PORT) |= 0x0F; 469 DDR(LCD_DATA0_PORT) |= 0x0F;
523 DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN); 470 DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN);
524 DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN); 471 DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN);
525 DDR(LCD_E_PORT) |= _BV(LCD_E_PIN); 472 DDR(LCD_E_PORT) |= _BV(LCD_E_PIN);
526 } 473 } else {
527 else
528 {
529 /* configure all port bits as output (LCD data and control lines on different ports */ 474 /* configure all port bits as output (LCD data and control lines on different ports */
530 DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN); 475 DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN);
531 DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN); 476 DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN);
532 DDR(LCD_E_PORT) |= _BV(LCD_E_PIN); 477 DDR(LCD_E_PORT) |= _BV(LCD_E_PIN);
533 DDR(LCD_DATA0_PORT) |= _BV(LCD_DATA0_PIN); 478 DDR(LCD_DATA0_PORT) |= _BV(LCD_DATA0_PIN);
534 DDR(LCD_DATA1_PORT) |= _BV(LCD_DATA1_PIN); 479 DDR(LCD_DATA1_PORT) |= _BV(LCD_DATA1_PIN);
535 DDR(LCD_DATA2_PORT) |= _BV(LCD_DATA2_PIN); 480 DDR(LCD_DATA2_PORT) |= _BV(LCD_DATA2_PIN);
536 DDR(LCD_DATA3_PORT) |= _BV(LCD_DATA3_PIN); 481 DDR(LCD_DATA3_PORT) |= _BV(LCD_DATA3_PIN);
537 } 482 }
538 delay(LCD_DELAY_BOOTUP); /* wait 16ms or more after power-on */ 483 delay(LCD_DELAY_BOOTUP); /* wait 16ms or more after power-on */
539 484
540 /* initial write to lcd is 8bit */ 485 /* initial write to lcd is 8bit */
541 LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN); // LCD_FUNCTION>>4; 486 LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN); // LCD_FUNCTION>>4;
542 LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN); // LCD_FUNCTION_8BIT>>4; 487 LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN); // LCD_FUNCTION_8BIT>>4;
488 lcd_e_toggle();
489 delay(LCD_DELAY_INIT); /* delay, busy flag can't be checked here */
490
491 /* repeat last command */
543 lcd_e_toggle(); 492 lcd_e_toggle();
544 delay(LCD_DELAY_INIT); /* delay, busy flag can't be checked here */ 493 delay(LCD_DELAY_INIT_REP); /* delay, busy flag can't be checked here */
545 494
546 /* repeat last command */
547 lcd_e_toggle();
548 delay(LCD_DELAY_INIT_REP); /* delay, busy flag can't be checked here */
549
550 /* repeat last command a third time */ 495 /* repeat last command a third time */
551 lcd_e_toggle(); 496 lcd_e_toggle();
552 delay(LCD_DELAY_INIT_REP); /* delay, busy flag can't be checked here */ 497 delay(LCD_DELAY_INIT_REP); /* delay, busy flag can't be checked here */
553 498
554 /* now configure for 4bit mode */ 499 /* now configure for 4bit mode */
555 LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN); // LCD_FUNCTION_4BIT_1LINE>>4 500 LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN); // LCD_FUNCTION_4BIT_1LINE>>4
556 lcd_e_toggle(); 501 lcd_e_toggle();
557 delay(LCD_DELAY_INIT_4BIT); /* some displays need this additional delay */ 502 delay(LCD_DELAY_INIT_4BIT); /* some displays need this additional delay */
558 503
559 /* from now the LCD only accepts 4 bit I/O, we can use lcd_command() */ 504 /* from now the LCD only accepts 4 bit I/O, we can use lcd_command() */
560#else 505#else
561 /* 506 /*
562 * Initialize LCD to 8 bit memory mapped mode 507 * Initialize LCD to 8 bit memory mapped mode
563 */ 508 */
564 509
565 /* enable external SRAM (memory mapped lcd) and one wait state */ 510 /* enable external SRAM (memory mapped lcd) and one wait state */
566 MCUCR = _BV(SRE) | _BV(SRW); 511 MCUCR = _BV(SRE) | _BV(SRW);
567 512
568 /* reset LCD */ 513 /* reset LCD */
569 delay(LCD_DELAY_BOOTUP); /* wait 16ms after power-on */ 514 delay(LCD_DELAY_BOOTUP); /* wait 16ms after power-on */
570 lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */ 515 lcd_write(LCD_FUNCTION_8BIT_1LINE, 0); /* function set: 8bit interface */
571 delay(LCD_DELAY_INIT); /* wait 5ms */ 516 delay(LCD_DELAY_INIT); /* wait 5ms */
572 lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */ 517 lcd_write(LCD_FUNCTION_8BIT_1LINE, 0); /* function set: 8bit interface */
573 delay(LCD_DELAY_INIT_REP); /* wait 64us */ 518 delay(LCD_DELAY_INIT_REP); /* wait 64us */
574 lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */ 519 lcd_write(LCD_FUNCTION_8BIT_1LINE, 0); /* function set: 8bit interface */
575 delay(LCD_DELAY_INIT_REP); /* wait 64us */ 520 delay(LCD_DELAY_INIT_REP); /* wait 64us */
576#endif 521#endif
577 522
578#if KS0073_4LINES_MODE 523#if KS0073_4LINES_MODE
579 /* Display with KS0073 controller requires special commands for enabling 4 line mode */ 524 /* Display with KS0073 controller requires special commands for enabling 4 line mode */
580 lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_ON); 525 lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_ON);
581 lcd_command(KS0073_4LINES_MODE); 526 lcd_command(KS0073_4LINES_MODE);
582 lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_OFF); 527 lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_OFF);
583#else 528#else
584 lcd_command(LCD_FUNCTION_DEFAULT); /* function set: display lines */ 529 lcd_command(LCD_FUNCTION_DEFAULT); /* function set: display lines */
585#endif 530#endif
586 lcd_command(LCD_DISP_OFF); /* display off */ 531 lcd_command(LCD_DISP_OFF); /* display off */
587 lcd_clrscr(); /* display clear */ 532 lcd_clrscr(); /* display clear */
588 lcd_command(LCD_MODE_DEFAULT); /* set entry mode */ 533 lcd_command(LCD_MODE_DEFAULT); /* set entry mode */
589 lcd_command(dispAttr); /* display/cursor control */ 534 lcd_command(dispAttr); /* display/cursor control */
590
591}/* lcd_init */
592 535
536} /* lcd_init */