1 | /*
|
2 | * GccApplication1.c
|
3 | *
|
4 | * Created: 26.05.2016 20:58:27
|
5 | * Author : creme
|
6 | * LCD Pin Description
|
7 | * 1 - Vss (GND)
|
8 | * 2 - Vcc (+5V)
|
9 | * 3 - Vee (poti Kontrasteinstellung)
|
10 | * 4 - RS
|
11 | * 5 - R/W
|
12 | * 6 - E
|
13 | * 7 - DB0
|
14 | * 8 - DB1
|
15 | * 9 - DB2
|
16 | * 10 - DB3
|
17 | * 11 - DB4
|
18 | * 12 - DB5
|
19 | * 13 - DB6
|
20 | * 14 - DB7
|
21 | * PCF8574 Pin Description
|
22 | * P0 - DB4
|
23 | * P1 - DB5
|
24 | * P2 - DB6
|
25 | * P3 - DB7
|
26 | * P4 - RS
|
27 | * P5 - E
|
28 | * R/W - GND
|
29 | */
|
30 |
|
31 | #include <avr/io.h>
|
32 | #include <avr/interrupt.h>
|
33 | //#include <avr/iom16.h> //ISR Vektoradresse mit Variablenbezeichnung
|
34 | //#include "lcd-routines.h"
|
35 |
|
36 | #include "i2clcd.h"
|
37 | #include "i2cmaster.h"
|
38 |
|
39 | //#define F_CPU 1000000UL
|
40 |
|
41 | //#include "lcd.h"
|
42 | //#include <avr/i2c>
|
43 | #define DevPCF8457 0x40
|
44 | uint8_t PCFPort = 0x00;
|
45 |
|
46 | #define PC0 0
|
47 | #define PC1 1
|
48 | #define PC2 2
|
49 | #define PC3 3
|
50 | #define PC4 4
|
51 | #define PC5 5
|
52 | #define PC6 6
|
53 | #define PC7 7
|
54 |
|
55 | #define RS (1<<PC0)
|
56 | #define RW (1<<PC1)
|
57 | #define E (1<<PC2)
|
58 | //#define PC3 (1<<3)
|
59 | #define D4 (1<<PC4)
|
60 | #define D5 (1<<PC5)
|
61 | #define D6 (1<<PC6)
|
62 | #define D7 (1<<PC7)
|
63 | #define PX (1<<0)
|
64 |
|
65 |
|
66 | #define SetDisplay 0x08
|
67 | #define DisplayOn 0x04
|
68 | #define CursorOn 0x02
|
69 | #define CursorOff 0x00
|
70 | #define CursorBlinkOn 0x01
|
71 | #define CursorBlinkOff 0x00
|
72 |
|
73 | #define LCDSetEntry 0x10
|
74 | #define LCDEntryIncrease 0x04
|
75 | #define LCDEntryDecrease 0x00
|
76 | #define LCDShift 0x01
|
77 | #define LCDNoShift 0x00
|
78 | #define DisplayCursorShift 0x10
|
79 |
|
80 | #define ClearDisp 0x01
|
81 |
|
82 | #define FuncionSet 0x20
|
83 | #define LCD4Bit 0x00
|
84 | #define LCD2Lines 0x08
|
85 | #define LCD5x7 0x00
|
86 |
|
87 |
|
88 | uint16_t cnt=0;
|
89 | uint8_t fin=0;
|
90 |
|
91 | ISR(TIMER0_COMP_vect)
|
92 | //Aufruf alle 2,04ms
|
93 | {
|
94 | cnt++;
|
95 | if(cnt<=2451) //~5sec
|
96 | {
|
97 | fin=1;
|
98 | cnt=0;
|
99 | }
|
100 | TCNT0 = 0;
|
101 | }
|
102 |
|
103 | void lcd_init_pcf(void)
|
104 | {
|
105 | _delay_ms(16);
|
106 |
|
107 | }
|
108 |
|
109 | void LCD_Command_PCF(uint8_t data)
|
110 | {
|
111 | //RS auf 0 setzen
|
112 | //i2c_start_wait(LCD_I2C_DEVICE+I2C_WRITE);
|
113 | //i2c_write((!RS));
|
114 | //i2c_stop();
|
115 | //for(uint8_t i=0; i<=12;i++)_delay_ms(500);
|
116 |
|
117 | i2c_start_wait(LCD_I2C_DEVICE+I2C_WRITE);
|
118 | //i2c_write((!RS) | (data&0xF0)); //first high byte
|
119 | i2c_write((data&0xF0)); //first high byte
|
120 | i2c_stop();
|
121 |
|
122 | _delay_us(20);for(uint8_t i=0; i<=12;i++)_delay_ms(500);
|
123 |
|
124 | i2c_start_wait(LCD_I2C_DEVICE+I2C_WRITE);
|
125 | //i2c_write((!RS) | (data<<4) ); //low byte
|
126 | i2c_write((data<<4) ); //low byte
|
127 | i2c_stop();
|
128 | _delay_us(84); //42
|
129 |
|
130 | //for(uint8_t i=0; i<=12;i++)_delay_ms(500);
|
131 |
|
132 | }
|
133 |
|
134 | void LCD_Data_PCF(uint8_t data)
|
135 | {
|
136 | //RS auf 1 setzen
|
137 | i2c_start_wait(LCD_I2C_DEVICE+I2C_WRITE);
|
138 | i2c_write(RS);
|
139 | i2c_stop();
|
140 | //for(uint8_t i=0; i<=12;i++)_delay_ms(500);
|
141 |
|
142 | i2c_start_wait(LCD_I2C_DEVICE+I2C_WRITE);
|
143 | i2c_write(RS | (data&0xF0)); //first high bytes
|
144 | i2c_stop();
|
145 |
|
146 | //20 //for(uint8_t i=0; i<=12;i++)_delay_ms(500);
|
147 |
|
148 | i2c_start_wait(LCD_I2C_DEVICE+I2C_WRITE);
|
149 | i2c_write(RS | (data<<4) ); //low bytes
|
150 | i2c_stop();
|
151 |
|
152 | _delay_us(92); //46
|
153 | }
|
154 |
|
155 | void LCD_Clear_PCF(void)
|
156 | {
|
157 | LCD_Command_PCF(0x01);
|
158 | _delay_ms(6); //3
|
159 | }
|
160 |
|
161 | void pause(void)
|
162 | {
|
163 | }
|
164 |
|
165 | int main(void)
|
166 | {
|
167 | //Test
|
168 | DDRD |= (1<<PD6);
|
169 | PORTD &= ~(1<<PD6);
|
170 | //
|
171 | DDRC |= (1<<PC0) | (1<<PC1);
|
172 | i2c_init();
|
173 |
|
174 | _delay_ms(100); //16
|
175 |
|
176 | i2c_start_wait(LCD_I2C_DEVICE+I2C_WRITE);
|
177 | i2c_write(0x00);
|
178 | i2c_stop();
|
179 |
|
180 | //for(uint8_t i=0; i<=12;i++)_delay_ms(500);
|
181 | _delay_us(20);
|
182 |
|
183 | //LCD Software Reset
|
184 | i2c_start_wait(LCD_I2C_DEVICE+I2C_WRITE);
|
185 | i2c_write(FuncionSet | D4); //1
|
186 | i2c_stop();
|
187 | _delay_ms(10);//5 for(uint8_t i=0; i<=12;i++)_delay_ms(500);
|
188 |
|
189 | //Enable Pulse Signal
|
190 | i2c_start_wait(LCD_I2C_DEVICE+I2C_WRITE);
|
191 | i2c_write(FuncionSet | D4 | E); //2
|
192 | i2c_stop();
|
193 | _delay_us(40);// 20 for(uint8_t i=0; i<=12;i++) _delay_ms(500);
|
194 | i2c_start_wait(LCD_I2C_DEVICE+I2C_WRITE);
|
195 | i2c_write(FuncionSet | D4); //3
|
196 | i2c_stop();
|
197 | _delay_ms(2);//1for(uint8_t i=0; i<=12;i++)_delay_ms(500);
|
198 |
|
199 | //Enable Pulse Signal
|
200 | i2c_start_wait(LCD_I2C_DEVICE+I2C_WRITE);
|
201 | i2c_write(FuncionSet | D4 | E); //4
|
202 | i2c_stop();
|
203 | _delay_us(40);//20for(uint8_t i=0; i<=12;i++)_delay_ms(500);
|
204 | i2c_start_wait(LCD_I2C_DEVICE+I2C_WRITE);
|
205 | i2c_write(FuncionSet | D4); //5
|
206 | i2c_stop();
|
207 | _delay_ms(2);//1 for(uint8_t i=0; i<=12;i++)_delay_ms(500);
|
208 |
|
209 | //4-Bit Modus aktivieren
|
210 | i2c_start_wait(LCD_I2C_DEVICE+I2C_WRITE);
|
211 | i2c_write(FuncionSet | LCD4Bit); //6
|
212 | i2c_stop();
|
213 |
|
214 | _delay_ms(20);//5//for(uint8_t i=0; i<=12;i++)_delay_ms(500);
|
215 |
|
216 |
|
217 | LCD_Command_PCF(FuncionSet | LCD4Bit | LCD2Lines | LCD5x7); //7, 8
|
218 | //for(uint8_t i=0; i<=12;i++)_delay_ms(500);
|
219 | LCD_Command_PCF(SetDisplay | DisplayOn | CursorOff | CursorBlinkOff); //9,10
|
220 | //for(uint8_t i=0; i<=12;i++)_delay_ms(500);
|
221 | LCD_Command_PCF(LCDSetEntry | LCDEntryIncrease | LCDNoShift);
|
222 | //for(uint8_t i=0; i<=12;i++)_delay_ms(500);
|
223 | LCD_Clear_PCF();
|
224 | //for(uint8_t i=0; i<=12;i++)_delay_ms(500);
|
225 | LCD_Data_PCF('T');
|
226 |
|
227 | //PORTD &= ~(1<<PD6);
|
228 |
|
229 | while (1)
|
230 | {
|
231 |
|
232 | }
|
233 | }
|