1 |
/*******************************************************************************************************
|
1 |
/*******************************************************************************************************
|
2 |
Title : C include file for the HD44780U LCD library (lcd_io.c)
|
2 |
Title : C include file for the HD44780U LCD library (lcd_io.c)
|
3 |
Author: Chris efstathiou hendrix@otenet.gr
|
3 |
Author: Chris efstathiou hendrix@otenet.gr
|
4 |
Date: 1/Jul/2002
|
4 |
Date: 1/Jul/2002
|
5 |
Software: AVR-GCC with AVR-AS
|
5 |
Software: AVR-GCC with AVR-AS
|
6 |
Target: any AVR device
|
6 |
Target: any AVR device
|
7 |
Comments: This software is FREE.
|
7 |
Comments: This software is FREE.
|
8 |
|
8 |
|
9 |
DESCRIPTION
|
9 |
DESCRIPTION
|
10 |
Basic routines for interfacing a HD44780U-based text lcd display
|
10 |
Basic routines for interfacing a HD44780U-based text lcd display
|
11 |
Based on Volker Oth's lcd library (http://members.xoom.com/volkeroth),
|
11 |
Based on Volker Oth's lcd library (http://members.xoom.com/volkeroth),
|
12 |
Peter Fleury's work <pfleury@gmx.ch> http://jump.to/fleury .
|
12 |
Peter Fleury's work <pfleury@gmx.ch> http://jump.to/fleury .
|
13 |
and the very good lcd page at www.myke.com
|
13 |
and the very good lcd page at www.myke.com
|
14 |
|
14 |
|
15 |
With this driver you can select from 2 different I/O modes.
|
15 |
With this driver you can select from 2 different I/O modes.
|
16 |
1) MODE 6 - 6 or 7 pin I/O mode
|
16 |
1) MODE 6 - 6 or 7 pin I/O mode
|
17 |
2) MODE 2 - 2 pin I/O mode with an additional 74LS174
|
17 |
2) MODE 2 - 2 pin I/O mode with an additional 74LS174
|
18 |
3) MODE 7 - multiple lcd unit mode
|
18 |
3) MODE 7 - multiple lcd unit mode
|
19 |
|
19 |
|
20 |
MODE 6 INFORMATION
|
20 |
MODE 6 INFORMATION
|
21 |
mode 6 now needs only 6 pins as long the pins can function as output
|
21 |
mode 6 now needs only 6 pins as long the pins can function as output
|
22 |
freeing two bits to be used as general i/o.
|
22 |
freeing two bits to be used as general i/o.
|
23 |
R/W pin on the lcd must be connected to ground.
|
23 |
R/W pin on the lcd must be connected to ground.
|
24 |
Also the pins can be scattered all over the place (any pin in any port).
|
24 |
Also the pins can be scattered all over the place (any pin in any port).
|
25 |
( the other pins of the port(s) are not affected )
|
25 |
( the other pins of the port(s) are not affected )
|
26 |
Be carefull not to change the status of the E lcd pin by using the outp()
|
26 |
Be carefull not to change the status of the E lcd pin by using the outp()
|
27 |
command (both in PORT(X) and DDR(X) ) elsewhere in your program otherwise
|
27 |
command (both in PORT(X) and DDR(X) ) elsewhere in your program otherwise
|
28 |
your program will crash and you will have a lot of fun for the whole family.
|
28 |
your program will crash and you will have a lot of fun for the whole family.
|
29 |
Use sbi() and cbi() commands instead.
|
29 |
Use sbi() and cbi() commands instead.
|
30 |
|
30 |
|
31 |
MODE 7 INFORMATION
|
31 |
MODE 7 INFORMATION
|
32 |
mode 7 supports up to 3 lcd units and all the characteristics of mode 6
|
32 |
mode 7 supports up to 3 lcd units and all the characteristics of mode 6
|
33 |
except that lcd reading is not possible.
|
33 |
except that lcd reading is not possible.
|
34 |
The lcd diplays can be of different type.
|
34 |
The lcd diplays can be of different type.
|
35 |
|
35 |
|
36 |
|
36 |
|
37 |
MODE 2 INFORMATION
|
37 |
MODE 2 INFORMATION
|
38 |
mode 2 uses only 2 pins in any combination you want as long the pin
|
38 |
mode 2 uses only 2 pins in any combination you want as long the pin
|
39 |
can function as output.
|
39 |
can function as output.
|
40 |
You also need to make a very simple cirquit (really silly) with 74LS174.
|
40 |
You also need to make a very simple cirquit (really silly) with 74LS174.
|
41 |
See the included JPG photo for the schematic.
|
41 |
See the included JPG photo for the schematic.
|
42 |
Also the pins can be scattered all over the place (any pin in any port).
|
42 |
Also the pins can be scattered all over the place (any pin in any port).
|
43 |
( the other pins of the port(s) are not affected )
|
43 |
( the other pins of the port(s) are not affected )
|
44 |
YOU MAY NOT! MULTIPLEX THE DATA AND CLOCK PINS WITH OTHER DEVICES
|
44 |
YOU MAY NOT! MULTIPLEX THE DATA AND CLOCK PINS WITH OTHER DEVICES
|
45 |
The pins are automatically set as outputs when you call an lcd function
|
45 |
The pins are automatically set as outputs when you call an lcd function
|
46 |
Be carefull not to change the status of the CLOCK and DATA pins by using the outp()
|
46 |
Be carefull not to change the status of the CLOCK and DATA pins by using the outp()
|
47 |
command (both in PORT(X) and DDR(X) ) elsewhere in your program otherwise
|
47 |
command (both in PORT(X) and DDR(X) ) elsewhere in your program otherwise
|
48 |
your program will crash and you will have a lot of fun for the whole family (again!).
|
48 |
your program will crash and you will have a lot of fun for the whole family (again!).
|
49 |
Use sbi() and cbi() commands instead.
|
49 |
Use sbi() and cbi() commands instead.
|
50 |
|
50 |
|
51 |
MEMORY MAPPED MODE IS NOT SUPPORTED BY THIS DRIVER !!!
|
51 |
MEMORY MAPPED MODE IS NOT SUPPORTED BY THIS DRIVER !!!
|
52 |
|
52 |
|
53 |
CAUTION!!! FOR SLOW LCD UNITS INCREASE THE "LCD_DELAY_TIME" VALUE!!!
|
53 |
CAUTION!!! FOR SLOW LCD UNITS INCREASE THE "LCD_DELAY_TIME" VALUE!!!
|
54 |
The driver does not read anything back from the lcd because that way i only need 6
|
54 |
The driver does not read anything back from the lcd because that way i only need 6
|
55 |
I/O lines and furthermore i can use the output only port found in MEGA103.
|
55 |
I/O lines and furthermore i can use the output only port found in MEGA103.
|
56 |
Since i dont read anything back, i just wait for commands to be executed
|
56 |
Since i dont read anything back, i just wait for commands to be executed
|
57 |
so below i define the time to wait for the two categories of commands of HD44780 .
|
57 |
so below i define the time to wait for the two categories of commands of HD44780 .
|
58 |
The two CATEGORIES are:
|
58 |
The two CATEGORIES are:
|
59 |
1) 2ms for clear screen and return home commands (nominal value=1,52 ms)
|
59 |
1) 2ms for clear screen and return home commands (nominal value=1,52 ms)
|
60 |
and it is derived from "LCD_DELAY_TIME" .
|
60 |
and it is derived from "LCD_DELAY_TIME" .
|
61 |
2) 50us for all other commands (nominal value=37 us)
|
61 |
2) 50us for all other commands (nominal value=37 us)
|
62 |
|
62 |
|
63 |
Even the slowest units will work reliably with LCD_DELAY_TIME=160.
|
63 |
Even the slowest units will work reliably with LCD_DELAY_TIME=160.
|
64 |
The Longer delay needed for CATEGORY 1 is calculated from the "LCD_DELAY_TIME" value.
|
64 |
The Longer delay needed for CATEGORY 1 is calculated from the "LCD_DELAY_TIME" value.
|
65 |
The specifications for HD44780 @ 270KHZ are 37 us for CATEGORY 2 and 1,52 ms for CATEGORY 1
|
65 |
The specifications for HD44780 @ 270KHZ are 37 us for CATEGORY 2 and 1,52 ms for CATEGORY 1
|
66 |
|
66 |
|
67 |
LCD MODULE INFORMATION!
|
67 |
LCD MODULE INFORMATION!
|
68 |
The maximum time required by each instruction for the slowest lcd units is
|
68 |
The maximum time required by each instruction for the slowest lcd units is
|
69 |
4.1 msecs for clearing the display or moving the cursor/display to the "home position",
|
69 |
4.1 msecs for clearing the display or moving the cursor/display to the "home position",
|
70 |
160 usecs for all other commands. (i use 50 because i use good units)
|
70 |
160 usecs for all other commands. (i use 50 because i use good units)
|
71 |
|
71 |
|
72 |
Usual HD44780 Pins connections
|
72 |
Usual HD44780 Pins connections
|
73 |
1 = Ground
|
73 |
1 = Ground
|
74 |
2 = Vcc
|
74 |
2 = Vcc
|
75 |
3 = Contrast Voltage
|
75 |
3 = Contrast Voltage
|
76 |
4 = "R/S" _Instruction/Register Select
|
76 |
4 = "R/S" _Instruction/Register Select
|
77 |
5 = "R/W" _Read/Write LCD Registers (Connected to GND for this driver to work!)
|
77 |
5 = "R/W" _Read/Write LCD Registers (Connected to GND for this driver to work!)
|
78 |
6 = "E" Clock
|
78 |
6 = "E" Clock
|
79 |
7 - 14 = Data I/O Pins 0 to 7 (0=7, 1=8,... 7=14 )
|
79 |
7 - 14 = Data I/O Pins 0 to 7 (0=7, 1=8,... 7=14 )
|
80 |
15 - GND for the BACKLIGHTING (Check to be sure because some units have it for VCC)
|
80 |
15 - GND for the BACKLIGHTING (Check to be sure because some units have it for VCC)
|
81 |
16 - VCC for the BACKLIGHTING (Check to be sure because some units have it for GND)
|
81 |
16 - VCC for the BACKLIGHTING (Check to be sure because some units have it for GND)
|
82 |
|
82 |
|
83 |
CONNECTION TABLE AS USED IN THIS lcd_io.h FILE
|
83 |
CONNECTION TABLE AS USED IN THIS lcd_io.h FILE
|
84 |
|^^^^^^^^^^^^^^^^^^^^^^^^^^|
|
84 |
|^^^^^^^^^^^^^^^^^^^^^^^^^^|
|
85 |
| port_pin0->lcd_D4_pin11 |
|
85 |
| port_pin0->lcd_D4_pin11 |
|
86 |
| port_pin1->lcd_D5_pin12 |
|
86 |
| port_pin1->lcd_D5_pin12 |
|
87 |
| port_pin2->lcd_D6_pin13 |
|
87 |
| port_pin2->lcd_D6_pin13 |
|
88 |
| port_pin3->lcd_D7_pin14 |
|
88 |
| port_pin3->lcd_D7_pin14 |
|
89 |
| port_pin4->lcd_RS_pin4 |
|
89 |
| port_pin4->lcd_RS_pin4 |
|
90 |
| port_pin5->lcd_E_pin6 |
|
90 |
| port_pin5->lcd_E_pin6 |
|
91 |
| lcd_E_pin5->GND |
|
91 |
| lcd_E_pin5->GND |
|
92 |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
92 |
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
93 |
|
93 |
|
94 |
*******************************************************************************************************/
|
94 |
*******************************************************************************************************/
|
95 |
#ifndef LCD_IO_H
|
95 |
#ifndef LCD_IO_H
|
96 |
#define LCD_IO_H
|
96 |
#define LCD_IO_H
|
97 |
|
97 |
|
98 |
/*############################################################################################*/
|
98 |
/*############################################################################################*/
|
99 |
/* CONFIGURATION BLOCK STARTS HERE. Change these definitions to adapt setting */
|
99 |
/* CONFIGURATION BLOCK STARTS HERE. Change these definitions to adapt setting */
|
100 |
/*############################################################################################*/
|
100 |
/*############################################################################################*/
|
101 |
/* GLOBAL SETTINGS (settings described here are aplyied everywhere) */
|
101 |
/* GLOBAL SETTINGS (settings described here are aplyied everywhere) */
|
102 |
|
102 |
|
103 |
#ifndef F_CPU
|
103 |
#ifndef F_CPU
|
104 |
#define F_CPU 3686400L /* CPU CLOCK FREQUENCY */
|
104 |
#define F_CPU 3686400L /* CPU CLOCK FREQUENCY */
|
105 |
#endif
|
105 |
#endif
|
106 |
|
106 |
|
107 |
#define LCD_IO_MODE 6 /* 6 = 6 PIN I/O, 2 = 2 PIN I/O, 7 = multi lcd mode */
|
107 |
#define LCD_IO_MODE 6 /* 6 = 6 PIN I/O, 2 = 2 PIN I/O, 7 = multi lcd mode */
|
108 |
|
108 |
|
109 |
#define LCD_AUTO_LINE_FEED 0 /* 1 = Auto line feed, 0 = no Auto line feed */
|
109 |
#define LCD_AUTO_LINE_FEED 0 /* 1 = Auto line feed, 0 = no Auto line feed */
|
110 |
|
110 |
|
111 |
#define LCD_DELAY_TIME 100 /* Read the INTRO about this */
|
111 |
#define LCD_DELAY_TIME 100 /* Read the INTRO about this */
|
112 |
|
112 |
|
113 |
/***********************************************************************************************/
|
113 |
/***********************************************************************************************/
|
114 |
#if LCD_IO_MODE == 2
|
114 |
#if LCD_IO_MODE == 2
|
115 |
/*
|
115 |
/*
|
116 |
CONFIGURATION OF BELOW LINES ONLY NECESSARY IN 2 PIN MODE
|
116 |
CONFIGURATION OF BELOW LINES ONLY NECESSARY IN 2 PIN MODE
|
117 |
If you plan to use just one port for all pins then just edit "LCD_PORT"
|
117 |
If you plan to use just one port for all pins then just edit "LCD_PORT"
|
118 |
otherwise you must specify the port of each lcd signal. the port(s) must be able
|
118 |
otherwise you must specify the port of each lcd signal. the port(s) must be able
|
119 |
to function as output. It can be any combination!
|
119 |
to function as output. It can be any combination!
|
120 |
USE CAPITAL LETTER FOR PORT DESIGNATION! (A,B,C,D...etc.)
|
120 |
USE CAPITAL LETTER FOR PORT DESIGNATION! (A,B,C,D...etc.)
|
121 |
*/
|
121 |
*/
|
122 |
#define LCD_CHARS_PER_LINE 20 /* visible chars per lcd line */
|
122 |
#define LCD_CHARS_PER_LINE 20 /* visible chars per lcd line */
|
123 |
#define LCD_LINES 4 /* visible lines */
|
123 |
#define LCD_LINES 4 /* visible lines */
|
124 |
|
124 |
|
125 |
#define LCD_PORT B
|
125 |
#define LCD_PORT B
|
126 |
|
126 |
|
127 |
#define LCD_CLOCK_SIGNAL_PORT LCD_PORT /* Put your lcd clock port here (A,B,C...etc.) */
|
127 |
#define LCD_CLOCK_SIGNAL_PORT LCD_PORT /* Put your lcd clock port here (A,B,C...etc.) */
|
128 |
#define LCD_CLOCK_PIN 0 /* Put your lcd clock pin here */
|
128 |
#define LCD_CLOCK_PIN 0 /* Put your lcd clock pin here */
|
129 |
|
129 |
|
130 |
#define LCD_DATA_SIGNAL_PORT LCD_PORT /* Put your lcd data port here (A,B,C...etc.) */
|
130 |
#define LCD_DATA_SIGNAL_PORT LCD_PORT /* Put your lcd data port here (A,B,C...etc.) */
|
131 |
#define LCD_DATA_PIN 1 /* Put your lcd data pin here */
|
131 |
#define LCD_DATA_PIN 1 /* Put your lcd data pin here */
|
132 |
|
132 |
|
133 |
#endif
|
133 |
#endif
|
134 |
/***********************************************************************************************/
|
134 |
/***********************************************************************************************/
|
135 |
/* END OF 2 PIN CONFIGURATION BLOCK */
|
135 |
/* END OF 2 PIN CONFIGURATION BLOCK */
|
136 |
/***********************************************************************************************/
|
136 |
/***********************************************************************************************/
|
137 |
#if LCD_IO_MODE == 6
|
137 |
#if LCD_IO_MODE == 6
|
138 |
/*
|
138 |
/*
|
139 |
CONFIGURATION OF BELOW LINES ONLY NECESSARY IN MODE 6
|
139 |
CONFIGURATION OF BELOW LINES ONLY NECESSARY IN MODE 6
|
140 |
If you plan to use just one port for all pins then just edit "LCD_PORT"
|
140 |
If you plan to use just one port for all pins then just edit "LCD_PORT"
|
141 |
otherwise you must specify the port of each lcd signal. the port(s) must be able
|
141 |
otherwise you must specify the port of each lcd signal. the port(s) must be able
|
142 |
to function as output. It can be any combination!
|
142 |
to function as output. It can be any combination!
|
143 |
PUT YOUR LCD PORT LETTER HERE USING CAPITAL LETTER (A,B,C,D...etc)
|
143 |
PUT YOUR LCD PORT LETTER HERE USING CAPITAL LETTER (A,B,C,D...etc)
|
144 |
*/
|
144 |
*/
|
145 |
#define LCD_CHARS_PER_LINE 20 /* visible chars per lcd line */
|
145 |
#define LCD_CHARS_PER_LINE 20 /* visible chars per lcd line */
|
146 |
#define LCD_LINES 4 /* visible lines */
|
146 |
#define LCD_LINES 4 /* visible lines */
|
147 |
|
147 |
|
148 |
#define LCD_MULTIPLEX_ENABLE 0 /* 1= the DDR's used are saved and restored */
|
148 |
#define LCD_MULTIPLEX_ENABLE 0 /* 1= the DDR's used are saved and restored */
|
149 |
#define LCD_READ_REQUIRED 0 /* 0=use delay, 1=read busy flag (7 pins needed) */
|
149 |
#define LCD_READ_REQUIRED 0 /* 0=use delay, 1=read busy flag (7 pins needed) */
|
150 |
|
150 |
|
151 |
|
151 |
|
152 |
|
152 |
|
153 |
#define LCD_PORT B
|
153 |
#define LCD_PORT B
|
154 |
|
154 |
|
155 |
#define LCD_DATA4_PORT LCD_PORT /* port for data 0 pin */
|
155 |
#define LCD_DATA4_PORT LCD_PORT /* port for data 0 pin */
|
156 |
#define LCD_D4_PIN 0 /* AVR port pin number */
|
156 |
#define LCD_D4_PIN 0 /* AVR port pin number */
|
157 |
|
157 |
|
158 |
#define LCD_DATA5_PORT LCD_PORT /* port for data 1 pin */
|
158 |
#define LCD_DATA5_PORT LCD_PORT /* port for data 1 pin */
|
159 |
#define LCD_D5_PIN 1 /* AVR port pin number */
|
159 |
#define LCD_D5_PIN 1 /* AVR port pin number */
|
160 |
|
160 |
|
161 |
#define LCD_DATA6_PORT LCD_PORT /* port for data 2 pin */
|
161 |
#define LCD_DATA6_PORT LCD_PORT /* port for data 2 pin */
|
162 |
#define LCD_D6_PIN 2 /* AVR port pin number */
|
162 |
#define LCD_D6_PIN 2 /* AVR port pin number */
|
163 |
|
163 |
|
164 |
#define LCD_DATA7_PORT LCD_PORT /* port for data 3 pin */
|
164 |
#define LCD_DATA7_PORT LCD_PORT /* port for data 3 pin */
|
165 |
#define LCD_D7_PIN 3 /* AVR port pin number */
|
165 |
#define LCD_D7_PIN 3 /* AVR port pin number */
|
166 |
|
166 |
|
167 |
#define LCD_RS_SIGNAL_PORT LCD_PORT /* port for RS line */
|
167 |
#define LCD_RS_SIGNAL_PORT LCD_PORT /* port for RS line */
|
168 |
#define LCD_RS_PIN 4 /* AVR port pin number */
|
168 |
#define LCD_RS_PIN 4 /* AVR port pin number */
|
169 |
|
169 |
|
170 |
#define LCD_E_SIGNAL_PORT LCD_PORT /* port for Enable line */
|
170 |
#define LCD_E_SIGNAL_PORT LCD_PORT /* port for Enable line */
|
171 |
#define LCD_E_PIN 5 /* AVR port pin number */
|
171 |
#define LCD_E_PIN 5 /* AVR port pin number */
|
172 |
|
172 |
|
173 |
|
173 |
|
174 |
|
174 |
|
175 |
/* YOU NEED TO EDIT "LCD_RW_SIGNAL_PORT" AND "LCD_RW_PIN" ONLY IF "LCD_READ_REQUIRED == 1" */
|
175 |
/* YOU NEED TO EDIT "LCD_RW_SIGNAL_PORT" AND "LCD_RW_PIN" ONLY IF "LCD_READ_REQUIRED == 1" */
|
176 |
#if LCD_READ_REQUIRED == 1
|
176 |
#if LCD_READ_REQUIRED == 1
|
177 |
#define LCD_RW_SIGNAL_PORT LCD_PORT /* port for R/W line */
|
177 |
#define LCD_RW_SIGNAL_PORT LCD_PORT /* port for R/W line */
|
178 |
#define LCD_RW_PIN 6 /* AVR port pin number */
|
178 |
#define LCD_RW_PIN 6 /* AVR port pin number */
|
179 |
#endif
|
179 |
#endif
|
180 |
|
180 |
|
181 |
#endif
|
181 |
#endif
|
182 |
/***********************************************************************************************/
|
182 |
/***********************************************************************************************/
|
183 |
/* END OF 6 PIN CONFIGURATION BLOCK */
|
183 |
/* END OF 6 PIN CONFIGURATION BLOCK */
|
184 |
/***********************************************************************************************/
|
184 |
/***********************************************************************************************/
|
185 |
#if LCD_IO_MODE == 7
|
185 |
#if LCD_IO_MODE == 7
|
186 |
/*
|
186 |
/*
|
187 |
CONFIGURATION OF BELOW LINES ONLY NECESSARY IN MODE 7
|
187 |
CONFIGURATION OF BELOW LINES ONLY NECESSARY IN MODE 7
|
188 |
If you plan to use just one port for all pins then just edit "LCD_PORT"
|
188 |
If you plan to use just one port for all pins then just edit "LCD_PORT"
|
189 |
otherwise you must specify the port of each lcd signal. the port(s) must be able
|
189 |
otherwise you must specify the port of each lcd signal. the port(s) must be able
|
190 |
to function as output. It can be any combination!
|
190 |
to function as output. It can be any combination!
|
191 |
PUT YOUR LCD PORT LETTER HERE USING CAPITAL LETTER (A,B,C,D...etc)
|
191 |
PUT YOUR LCD PORT LETTER HERE USING CAPITAL LETTER (A,B,C,D...etc)
|
192 |
*/
|
192 |
*/
|
193 |
#define NUMBER_OF_LCD_UNITS 2 /* 2 or 3. if you set it to 1, mode 6 will be selected */
|
193 |
#define NUMBER_OF_LCD_UNITS 2 /* 2 or 3. if you set it to 1, mode 6 will be selected */
|
194 |
|
194 |
|
195 |
#define LCD_0_CHARS_PER_LINE 20 /* visible chars per lcd line */
|
195 |
#define LCD_0_CHARS_PER_LINE 20 /* visible chars per lcd line */
|
196 |
#define LCD_0_LINES 4 /* visible lines */
|
196 |
#define LCD_0_LINES 4 /* visible lines */
|
197 |
|
197 |
|
198 |
#define LCD_1_CHARS_PER_LINE 20 /* visible chars per lcd line */
|
198 |
#define LCD_1_CHARS_PER_LINE 20 /* visible chars per lcd line */
|
199 |
#define LCD_1_LINES 4 /* visible lines */
|
199 |
#define LCD_1_LINES 4 /* visible lines */
|
200 |
|
200 |
|
201 |
#if NUMBER_OF_LCD_UNITS >=3
|
201 |
#if NUMBER_OF_LCD_UNITS >=3
|
202 |
#define LCD_2_CHARS_PER_LINE 20 /* visible chars per lcd line */
|
202 |
#define LCD_2_CHARS_PER_LINE 20 /* visible chars per lcd line */
|
203 |
#define LCD_2_LINES 4 /* visible lines */
|
203 |
#define LCD_2_LINES 4 /* visible lines */
|
204 |
#endif
|
204 |
#endif
|
205 |
|
205 |
|
206 |
|
206 |
|
207 |
|
207 |
|
208 |
#define LCD_PORT B
|
208 |
#define LCD_PORT B
|
209 |
|
209 |
|
210 |
#define LCD_DATA4_PORT LCD_PORT /* port for data 0 pin */
|
210 |
#define LCD_DATA4_PORT LCD_PORT /* port for data 0 pin */
|
211 |
#define LCD_D4_PIN 0 /* AVR port pin number */
|
211 |
#define LCD_D4_PIN 0 /* AVR port pin number */
|
212 |
|
212 |
|
213 |
#define LCD_DATA5_PORT LCD_PORT /* port for data 1 pin */
|
213 |
#define LCD_DATA5_PORT LCD_PORT /* port for data 1 pin */
|
214 |
#define LCD_D5_PIN 1 /* AVR port pin number */
|
214 |
#define LCD_D5_PIN 1 /* AVR port pin number */
|
215 |
|
215 |
|
216 |
#define LCD_DATA6_PORT LCD_PORT /* port for data 2 pin */
|
216 |
#define LCD_DATA6_PORT LCD_PORT /* port for data 2 pin */
|
217 |
#define LCD_D6_PIN 2 /* AVR port pin number */
|
217 |
#define LCD_D6_PIN 2 /* AVR port pin number */
|
218 |
|
218 |
|
219 |
#define LCD_DATA7_PORT LCD_PORT /* port for data 3 pin */
|
219 |
#define LCD_DATA7_PORT LCD_PORT /* port for data 3 pin */
|
220 |
#define LCD_D7_PIN 3 /* AVR port pin number */
|
220 |
#define LCD_D7_PIN 3 /* AVR port pin number */
|
221 |
|
221 |
|
222 |
#define LCD_RS_SIGNAL_PORT LCD_PORT /* port for RS line */
|
222 |
#define LCD_RS_SIGNAL_PORT LCD_PORT /* port for RS line */
|
223 |
#define LCD_RS_PIN 4 /* AVR port pin number */
|
223 |
#define LCD_RS_PIN 4 /* AVR port pin number */
|
224 |
|
224 |
|
225 |
#define LCD_0_E_SIGNAL_PORT LCD_PORT /* port for Enable line */
|
225 |
#define LCD_0_E_SIGNAL_PORT LCD_PORT /* port for Enable line */
|
226 |
#define LCD_0_E_PIN 5 /* AVR port pin number */
|
226 |
#define LCD_0_E_PIN 5 /* AVR port pin number */
|
227 |
|
227 |
|
228 |
#define LCD_1_E_SIGNAL_PORT LCD_PORT /* port for Enable line */
|
228 |
#define LCD_1_E_SIGNAL_PORT LCD_PORT /* port for Enable line */
|
229 |
#define LCD_1_E_PIN 6 /* AVR port pin number */
|
229 |
#define LCD_1_E_PIN 6 /* AVR port pin number */
|
230 |
|
230 |
|
231 |
/* EDIT THE BELOW LINES IF YOU USE 3 LCD UNITS */
|
231 |
/* EDIT THE BELOW LINES IF YOU USE 3 LCD UNITS */
|
232 |
#if NUMBER_OF_LCD_UNITS >=3
|
232 |
#if NUMBER_OF_LCD_UNITS >=3
|
233 |
#define LCD_2_E_SIGNAL_PORT LCD_PORT /* port for Enable line */
|
233 |
#define LCD_2_E_SIGNAL_PORT LCD_PORT /* port for Enable line */
|
234 |
#define LCD_2_E_PIN 7 /* AVR port pin number */
|
234 |
#define LCD_2_E_PIN 7 /* AVR port pin number */
|
235 |
#endif
|
235 |
#endif
|
236 |
|
236 |
|
237 |
#endif /* LCD_IO_MODE == 7 */
|
237 |
#endif /* LCD_IO_MODE == 7 */
|
238 |
|
238 |
|
239 |
/*############################################################################################*/
|
239 |
/*############################################################################################*/
|
240 |
/* CONFIGURATION BLOCK ENDS HERE. */
|
240 |
/* CONFIGURATION BLOCK ENDS HERE. */
|
241 |
/*############################################################################################*/
|
241 |
/*############################################################################################*/
|
242 |
|
242 |
|
243 |
/* you shouldn't need to change anything below this line */
|
243 |
/* you shouldn't need to change anything below this line */
|
244 |
|
244 |
|
245 |
/* Some clever thinking triks */
|
245 |
/* Some clever thinking triks */
|
246 |
#if LCD_IO_MODE == 7 && NUMBER_OF_LCD_UNITS == 1
|
246 |
#if LCD_IO_MODE == 7 && NUMBER_OF_LCD_UNITS == 1
|
247 |
|
247 |
|
248 |
#undef LCD_IO_MODE
|
248 |
#undef LCD_IO_MODE
|
249 |
#define LCD_IO_MODE 6
|
249 |
#define LCD_IO_MODE 6
|
250 |
#define LCD_READ_REQUIRED 0
|
250 |
#define LCD_READ_REQUIRED 0
|
251 |
#define LCD_E_SIGNAL_PORT LCD_0_E_SIGNAL_PORT
|
251 |
#define LCD_E_SIGNAL_PORT LCD_0_E_SIGNAL_PORT
|
252 |
#define LCD_E_PIN LCD_0_E_PIN
|
252 |
#define LCD_E_PIN LCD_0_E_PIN
|
253 |
#define LCD_CHARS_PER_LINE LCD_0_CHARS_PER_LINE
|
253 |
#define LCD_CHARS_PER_LINE LCD_0_CHARS_PER_LINE
|
254 |
#define LCD_LINES LCD_0_LINES
|
254 |
#define LCD_LINES LCD_0_LINES
|
255 |
#undef LCD_MULTIPLEX_ENABLE
|
255 |
#undef LCD_MULTIPLEX_ENABLE
|
256 |
#define LCD_MULTIPLEX_ENABLE 0
|
256 |
#define LCD_MULTIPLEX_ENABLE 0
|
257 |
#undef LCD_READ_REQUIRED
|
257 |
#undef LCD_READ_REQUIRED
|
258 |
#define LCD_READ_REQUIRED 0
|
258 |
#define LCD_READ_REQUIRED 0
|
259 |
#undef LCD_1_CHARS_PER_LINE
|
259 |
#undef LCD_1_CHARS_PER_LINE
|
260 |
#undef LCD_1_LINES
|
260 |
#undef LCD_1_LINES
|
261 |
#undef LCD_1_E_SIGNAL_PORT
|
261 |
#undef LCD_1_E_SIGNAL_PORT
|
262 |
#undef LCD_1_E_PIN
|
262 |
#undef LCD_1_E_PIN
|
263 |
|
263 |
|
264 |
|
264 |
|
265 |
#elif LCD_IO_MODE == 7 && NUMBER_OF_LCD_UNITS > 1
|
265 |
#elif LCD_IO_MODE == 7 && NUMBER_OF_LCD_UNITS > 1
|
266 |
|
266 |
|
267 |
#define LCD_0 0
|
267 |
#define LCD_0 0
|
268 |
#define LCD_1 1
|
268 |
#define LCD_1 1
|
269 |
#define LCD_2 2
|
269 |
#define LCD_2 2
|
270 |
|
270 |
|
271 |
#endif /* #if LCD_IO_MODE == 7 && NUMBER_OF_LCD_UNITS == 1 */
|
271 |
#endif /* #if LCD_IO_MODE == 7 && NUMBER_OF_LCD_UNITS == 1 */
|
272 |
|
272 |
|
273 |
/*-----------------------------------------------------------------------------------*/
|
273 |
/*-----------------------------------------------------------------------------------*/
|
274 |
/* HD44780 PARAMETERS */
|
274 |
/* HD44780 PARAMETERS */
|
275 |
/*-----------------------------------------------------------------------------------*/
|
275 |
/*-----------------------------------------------------------------------------------*/
|
276 |
|
276 |
|
277 |
#define LCD_LINE_LENGTH 0x40 /* internal line length */
|
277 |
#define LCD_LINE_LENGTH 0x40 /* internal line length */
|
278 |
#define LCD_START_LINE1 0x00 /* DDRAM address of first char of line 1 */
|
278 |
#define LCD_START_LINE1 0x00 /* DDRAM address of first char of line 1 */
|
279 |
#define LCD_START_LINE2 0x40 /* DDRAM address of first char of line 2 */
|
279 |
#define LCD_START_LINE2 0x40 /* DDRAM address of first char of line 2 */
|
280 |
#define LCD_START_LINE3 0x14 /* DDRAM address of first char of line 3 */
|
280 |
#define LCD_START_LINE3 0x14 /* DDRAM address of first char of line 3 */
|
281 |
#define LCD_START_LINE4 0x54 /* DDRAM address of first char of line 4 */
|
281 |
#define LCD_START_LINE4 0x54 /* DDRAM address of first char of line 4 */
|
282 |
|
282 |
|
283 |
/* instruction register bit positions */
|
283 |
/* instruction register bit positions */
|
284 |
#define LCD_CLR 0 /* DB0: clear display */
|
284 |
#define LCD_CLR 0 /* DB0: clear display */
|
285 |
#define LCD_HOME 1 /* DB1: return to home position */
|
285 |
#define LCD_HOME 1 /* DB1: return to home position */
|
286 |
#define LCD_ENTRY_MODE 2 /* DB2: set entry mode */
|
286 |
#define LCD_ENTRY_MODE 2 /* DB2: set entry mode */
|
287 |
#define LCD_ENTRY_INC 1 /* DB1: 1=increment, 0=decrement */
|
287 |
#define LCD_ENTRY_INC 1 /* DB1: 1=increment, 0=decrement */
|
288 |
#define LCD_ENTRY_SHIFT 0 /* DB2: 1=display shift on */
|
288 |
#define LCD_ENTRY_SHIFT 0 /* DB2: 1=display shift on */
|
289 |
#define LCD_ON 3 /* DB3: turn lcd/cursor on */
|
289 |
#define LCD_ON 3 /* DB3: turn lcd/cursor on */
|
290 |
#define LCD_ON_DISPLAY 2 /* DB2: turn display on */
|
290 |
#define LCD_ON_DISPLAY 2 /* DB2: turn display on */
|
291 |
#define LCD_ON_CURSOR 1 /* DB1: turn cursor on */
|
291 |
#define LCD_ON_CURSOR 1 /* DB1: turn cursor on */
|
292 |
#define LCD_ON_BLINK 0 /* DB0: blinking cursor ? */
|
292 |
#define LCD_ON_BLINK 0 /* DB0: blinking cursor ? */
|
293 |
#define LCD_MOVE 4 /* DB4: move cursor/display */
|
293 |
#define LCD_MOVE 4 /* DB4: move cursor/display */
|
294 |
#define LCD_MOVE_DISP 3 /* DB3: move display (0-> cursor) ? */
|
294 |
#define LCD_MOVE_DISP 3 /* DB3: move display (0-> cursor) ? */
|
295 |
#define LCD_MOVE_RIGHT 2 /* DB2: move right (0-> left) ? */
|
295 |
#define LCD_MOVE_RIGHT 2 /* DB2: move right (0-> left) ? */
|
296 |
#define LCD_FUNCTION 5 /* DB5: function set */
|
296 |
#define LCD_FUNCTION 5 /* DB5: function set */
|
297 |
#define LCD_FUNCTION_8BIT 4 /* DB4: set 8BIT mode (0->4BIT mode) */
|
297 |
#define LCD_FUNCTION_8BIT 4 /* DB4: set 8BIT mode (0->4BIT mode) */
|
298 |
#define LCD_FUNCTION_2LINES 3 /* DB3: two lines (0->one line) */
|
298 |
#define LCD_FUNCTION_2LINES 3 /* DB3: two lines (0->one line) */
|
299 |
#define LCD_FUNCTION_10DOTS 2 /* DB2: 5x10 font (0->5x7 font) */
|
299 |
#define LCD_FUNCTION_10DOTS 2 /* DB2: 5x10 font (0->5x7 font) */
|
300 |
#define LCD_CGRAM 6 /* DB6: set CG RAM address */
|
300 |
#define LCD_CGRAM 6 /* DB6: set CG RAM address */
|
301 |
#define LCD_DDRAM 7 /* DB7: set DD RAM address */
|
301 |
#define LCD_DDRAM 7 /* DB7: set DD RAM address */
|
302 |
#define LCD_BUSY 7 /* DB7: LCD is busy */
|
302 |
#define LCD_BUSY 7 /* DB7: LCD is busy */
|
303 |
|
303 |
|
304 |
/* set entry mode: display shift on/off, dec/inc cursor move direction */
|
304 |
/* set entry mode: display shift on/off, dec/inc cursor move direction */
|
305 |
#define LCD_ENTRY_DEC 0x04 /* display shift off, dec cursor move dir */
|
305 |
#define LCD_ENTRY_DEC 0x04 /* display shift off, dec cursor move dir */
|
306 |
#define LCD_ENTRY_DEC_SHIFT 0x05 /* display shift on, dec cursor move dir */
|
306 |
#define LCD_ENTRY_DEC_SHIFT 0x05 /* display shift on, dec cursor move dir */
|
307 |
#define LCD_ENTRY_INC_ 0x06 /* display shift off, inc cursor move dir */
|
307 |
#define LCD_ENTRY_INC_ 0x06 /* display shift off, inc cursor move dir */
|
308 |
#define LCD_ENTRY_INC_SHIFT 0x07 /* display shift on, inc cursor move dir */
|
308 |
#define LCD_ENTRY_INC_SHIFT 0x07 /* display shift on, inc cursor move dir */
|
309 |
|
309 |
|
310 |
/* display on/off, cursor on/off, blinking char at cursor position */
|
310 |
/* display on/off, cursor on/off, blinking char at cursor position */
|
311 |
#define LCD_DISP_OFF 0x08 /* display off */
|
311 |
#define LCD_DISP_OFF 0x08 /* display off */
|
312 |
#define LCD_DISP_ON 0x0C /* display on, cursor off */
|
312 |
#define LCD_DISP_ON 0x0C /* display on, cursor off */
|
313 |
#define LCD_DISP_ON_BLINK 0x0D /* display on, cursor off, blink char */
|
313 |
#define LCD_DISP_ON_BLINK 0x0D /* display on, cursor off, blink char */
|
314 |
#define LCD_DISP_ON_CURSOR 0x0E /* display on, cursor on */
|
314 |
#define LCD_DISP_ON_CURSOR 0x0E /* display on, cursor on */
|
315 |
#define LCD_DISP_ON_CURSOR_BLINK 0x0F /* display on, cursor on, blink char */
|
315 |
#define LCD_DISP_ON_CURSOR_BLINK 0x0F /* display on, cursor on, blink char */
|
316 |
|
316 |
|
317 |
/* move cursor/shift display */
|
317 |
/* move cursor/shift display */
|
318 |
#define LCD_MOVE_CURSOR_LEFT 0x10 /* move cursor left (decrement) */
|
318 |
#define LCD_MOVE_CURSOR_LEFT 0x10 /* move cursor left (decrement) */
|
319 |
#define LCD_MOVE_CURSOR_RIGHT 0x14 /* move cursor right (increment) */
|
319 |
#define LCD_MOVE_CURSOR_RIGHT 0x14 /* move cursor right (increment) */
|
320 |
#define LCD_MOVE_DISP_LEFT 0x18 /* shift display left */
|
320 |
#define LCD_MOVE_DISP_LEFT 0x18 /* shift display left */
|
321 |
#define LCD_MOVE_DISP_RIGHT 0x1C /* shift display right */
|
321 |
#define LCD_MOVE_DISP_RIGHT 0x1C /* shift display right */
|
322 |
|
322 |
|
323 |
/* function set: set interface data length and number of display lines */
|
323 |
/* function set: set interface data length and number of display lines */
|
324 |
#define LCD_FUNCTION_4BIT_1LINE 0x20 /* 4-bit interface, single line, 5x7 dots */
|
324 |
#define LCD_FUNCTION_4BIT_1LINE 0x20 /* 4-bit interface, single line, 5x7 dots */
|
325 |
#define LCD_FUNCTION_4BIT_2LINES 0x28 /* 4-bit interface, dual line, 5x7 dots */
|
325 |
#define LCD_FUNCTION_4BIT_2LINES 0x28 /* 4-bit interface, dual line, 5x7 dots */
|
326 |
#define LCD_FUNCTION_8BIT_1LINE 0x30 /* 8-bit interface, single line, 5x7 dots */
|
326 |
#define LCD_FUNCTION_8BIT_1LINE 0x30 /* 8-bit interface, single line, 5x7 dots */
|
327 |
#define LCD_FUNCTION_8BIT_2LINES 0x38 /* 8-bit interface, dual line, 5x7 dots */
|
327 |
#define LCD_FUNCTION_8BIT_2LINES 0x38 /* 8-bit interface, dual line, 5x7 dots */
|
328 |
|
328 |
|
329 |
|
329 |
|
330 |
#define LCD_MODE_DEFAULT ((1<<LCD_ENTRY_MODE) | (1<<LCD_ENTRY_INC) )
|
330 |
#define LCD_MODE_DEFAULT ((1<<LCD_ENTRY_MODE) | (1<<LCD_ENTRY_INC) )
|
331 |
|
331 |
|
332 |
|
332 |
|
333 |
|
333 |
|
334 |
/*-----------------------------------------------------------------------------------*/
|
334 |
/*-----------------------------------------------------------------------------------*/
|
335 |
/* function prototypes */
|
335 |
/* function prototypes */
|
336 |
/*-----------------------------------------------------------------------------------*/
|
336 |
/*-----------------------------------------------------------------------------------*/
|
337 |
|
337 |
|
338 |
extern void lcd_init(void);
|
338 |
extern void lcd_init(void);
|
339 |
extern void lcd_command(unsigned char cmd);
|
339 |
extern void lcd_command(unsigned char cmd);
|
340 |
extern void lcd_gotoxy(unsigned char lcd_x, unsigned char lcd_y);
|
340 |
extern void lcd_gotoxy(unsigned char lcd_x, unsigned char lcd_y);
|
341 |
extern void lcd_clrscr(void);
|
341 |
extern void lcd_clrscr(void);
|
342 |
extern void lcd_clrline(unsigned char line);
|
342 |
extern void lcd_clrline(unsigned char line);
|
343 |
extern void lcd_home(void);
|
343 |
extern void lcd_home(void);
|
344 |
extern void lcd_putc(unsigned char c);
|
344 |
extern void lcd_putc(unsigned char c);
|
345 |
extern void lcd_puts(const unsigned char *s);
|
345 |
extern void lcd_puts(const unsigned char *s);
|
346 |
extern void lcd_puts_p(const unsigned char *progmem_s);
|
346 |
extern void lcd_puts_p(const unsigned char *progmem_s);
|
347 |
extern void lcd_puts_e(unsigned char *eeprom_s);
|
347 |
extern void lcd_puts_e(unsigned char *eeprom_s);
|
348 |
extern void lcd_puti(int value, unsigned char dot_position);
|
348 |
extern void lcd_puti(int value, unsigned char dot_position);
|
349 |
extern unsigned int lcd_getxy(void);
|
349 |
extern unsigned int lcd_getxy(void);
|
350 |
|
350 |
|
351 |
|
351 |
|
352 |
/*
|
352 |
/*
|
353 |
1) Suppose we want to display a 16 bit var with a rvalue 0f 325
|
353 |
1) Suppose we want to display a 16 bit var with a rvalue 0f 325
|
354 |
2) We give the command lcd_puti(var_name, 0); were var=325
|
354 |
2) We give the command lcd_puti(var_name, 0); were var=325
|
355 |
The display will show 325
|
355 |
The display will show 325
|
356 |
3) alternatives:
|
356 |
3) alternatives:
|
357 |
a) We give the command lcd_puti(var_name,1);
|
357 |
a) We give the command lcd_puti(var_name,1);
|
358 |
The display will show 32,5
|
358 |
The display will show 32,5
|
359 |
b) We give the command lcd_puti(var_name,2);
|
359 |
b) We give the command lcd_puti(var_name,2);
|
360 |
The display will show 3,25
|
360 |
The display will show 3,25
|
361 |
c) We give the command lcd_puti(var_name,3);
|
361 |
c) We give the command lcd_puti(var_name,3);
|
362 |
The display will show 0,325
|
362 |
The display will show 0,325
|
363 |
d) We give the command lcd_puti(var_name,4);
|
363 |
d) We give the command lcd_puti(var_name,4);
|
364 |
The display will show 0,0325
|
364 |
The display will show 0,0325
|
365 |
e) We give the command lcd_puti(var_name,1); var=-325
|
365 |
e) We give the command lcd_puti(var_name,1); var=-325
|
366 |
The display will show -32,5
|
366 |
The display will show -32,5
|
367 |
f) We give the command lcd_puti(var_name,3); var=-325
|
367 |
f) We give the command lcd_puti(var_name,3); var=-325
|
368 |
The display will show -0,325
|
368 |
The display will show -0,325
|
369 |
|
369 |
|
370 |
*/
|
370 |
*/
|
371 |
/*
|
371 |
/*
|
372 |
** macros for automatically storing string constant in program memory
|
372 |
** macros for automatically storing string constant in program memory
|
373 |
*/
|
373 |
*/
|
374 |
#ifndef P
|
374 |
#ifndef P
|
375 |
#define P(s) ({static const char c[] __attribute__ ((progmem)) = s;c;})
|
375 |
#define P(s) ({static const char c[] __attribute__ ((progmem)) = s;c;})
|
376 |
#endif
|
376 |
#endif
|
377 |
#define lcd_puts_P(__s) lcd_puts_p(P(__s))
|
377 |
#define lcd_puts_P(__s) lcd_puts_p(P(__s))
|
378 |
|
378 |
|
379 |
#endif //LCD_IO_H
|
379 |
#endif //LCD_IO_H
|
380 |
/*######################################################################################################*/
|
380 |
/*######################################################################################################*/
|
381 |
/* T H E E N D */
|
381 |
/* T H E E N D */
|
382 |
/*######################################################################################################*/
|
382 |
/*######################################################################################################*/
|
383 |
|
383 |
|
384 |
|
384 |
|