1 | #include <avr/io.h>
|
2 | #include "includes/lcd-routines.h"
|
3 | #include <util/delay.h>
|
4 |
|
5 | ////////////////////////////////////////////////////////////////////////////////
|
6 | // Erzeugt einen Enable-Puls
|
7 | static void lcd_enable( void )
|
8 | {
|
9 | LCD_PORT |= (1<<LCD_EN); // Enable auf 1 setzen
|
10 | //_delay_ms(5000);
|
11 | _delay_us( LCD_ENABLE_US ); // kurze Pause
|
12 | LCD_PORT &= ~(1<<LCD_EN); // Enable auf 0 setzen
|
13 | }
|
14 |
|
15 | ////////////////////////////////////////////////////////////////////////////////
|
16 | // Sendet eine 4-bit Ausgabeoperation an das LCD
|
17 | static void lcd_out( uint8_t data )
|
18 | {
|
19 | data &= 0xF0; // obere 4 Bit maskieren
|
20 |
|
21 | LCD_PORT &= ~(0xF0>>(4-LCD_DB)); // Maske löschen
|
22 | LCD_PORT |= (data>>(4-LCD_DB)); // Bits setzen
|
23 | lcd_enable();
|
24 | }
|
25 |
|
26 | ////////////////////////////////////////////////////////////////////////////////
|
27 | // Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
|
28 | void lcd_init( void )
|
29 | {
|
30 | // verwendete Pins auf Ausgang schalten
|
31 | uint8_t pins = (0x0F << LCD_DB) | // 4 Datenleitungen
|
32 | (1<<LCD_RS) | // R/S Leitung
|
33 | (1<<LCD_EN); // Enable Leitung
|
34 | LCD_DDR |= pins;
|
35 |
|
36 | // initial alle Ausgänge auf Null
|
37 |
|
38 | LCD_PORT &= ~pins;
|
39 |
|
40 | // warten auf die Bereitschaft des LCD
|
41 | _delay_ms( LCD_BOOTUP_MS ); //Zeitverzögerung von 31ms
|
42 |
|
43 | // Soft-Reset muss 3mal hintereinander gesendet werden zur Initialisierung
|
44 | lcd_out( LCD_SOFT_RESET );
|
45 | _delay_ms( LCD_SOFT_RESET_MS1 ); //Zeitverzögerung von 5ms
|
46 |
|
47 | lcd_enable();
|
48 | _delay_ms( LCD_SOFT_RESET_MS2 ); //Zeitverzögerung von 1ms
|
49 |
|
50 | lcd_enable();
|
51 | _delay_ms( LCD_SOFT_RESET_MS3 ); //Zeitverzögerung von 1ms
|
52 |
|
53 | // 4-bit Modus aktivieren --> 20h
|
54 | lcd_out( LCD_SET_FUNCTION |
|
55 | LCD_FUNCTION_4BIT );
|
56 | _delay_ms( LCD_SET_4BITMODE_MS );
|
57 |
|
58 | // 4-bit Modus / 2 Zeilen / 5x7 -->20h
|
59 | lcd_command( LCD_SET_FUNCTION |
|
60 | LCD_FUNCTION_4BIT |
|
61 | LCD_FUNCTION_2LINE |
|
62 | LCD_FUNCTION_5X7 );
|
63 |
|
64 | // Display aus / Cursor aus / Blinken aus --> 08h
|
65 | lcd_command( LCD_SET_DISPLAY_CONTR |
|
66 | LCD_DISPLAY_OFF |
|
67 | LCD_CURSOR_OFF |
|
68 | LCD_BLINKING_OFF);
|
69 |
|
70 | // Diplay Clear --> 01h
|
71 | lcd_clear();
|
72 |
|
73 | // Cursor inkrement / kein Scrollen --> 06h
|
74 | lcd_command( LCD_SET_ENTRY_MODE |
|
75 | LCD_ENTRY_INCREMENT |
|
76 | LCD_ENTRY_NOSHIFT );
|
77 | }
|
78 |
|
79 | ////////////////////////////////////////////////////////////////////////////////
|
80 | // Sendet ein Datenbyte an das LCD
|
81 | void lcd_data( uint8_t data )
|
82 | {
|
83 | LCD_PORT |= (1<<LCD_RS); // RS auf 1 setzen
|
84 |
|
85 | lcd_out( data ); // zuerst die oberen,
|
86 | lcd_out( data<<4 ); // dann die unteren 4 Bit senden
|
87 |
|
88 | _delay_us( LCD_WRITEDATA_US );
|
89 | }
|
90 |
|
91 | ////////////////////////////////////////////////////////////////////////////////
|
92 | // Sendet einen Befehl an das LCD
|
93 | void lcd_command( uint8_t data )
|
94 | {
|
95 | LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 setzen
|
96 |
|
97 | lcd_out( data ); // zuerst die oberen,
|
98 | lcd_out( data<<4 ); // dann die unteren 4 Bit senden
|
99 |
|
100 | _delay_us( LCD_COMMAND_US );
|
101 | }
|
102 |
|
103 | ////////////////////////////////////////////////////////////////////////////////
|
104 | // Sendet den Befehl zur Löschung des Displays
|
105 | void lcd_clear( void )
|
106 | {
|
107 | lcd_command( LCD_CLEAR_DISPLAY );
|
108 | _delay_ms( LCD_CLEAR_DISPLAY_MS );
|
109 | }
|
110 |
|
111 | ////////////////////////////////////////////////////////////////////////////////
|
112 | // Sendet den Befehl: Cursor Home
|
113 | void lcd_home( void )
|
114 | {
|
115 | lcd_command( LCD_CURSOR_HOME );
|
116 | _delay_ms( LCD_CURSOR_HOME_MS );
|
117 | }
|
118 | int main(void)
|
119 | {
|
120 | // Initialisierung des LCD
|
121 | // Nach der Initialisierung müssen auf dem LCD vorhandene schwarze Balken
|
122 | // verschwunden sein
|
123 | lcd_init();
|
124 | _delay_ms(5000);
|
125 | lcd_data( '1' );
|
126 | lcd_string ("1");
|
127 | while(1)
|
128 | {
|
129 | }
|
130 |
|
131 | return 0;
|
132 | }
|