1 | /*
|
2 | LCD4b.c
|
3 | ---------------------------------------------------------------------------------------
|
4 | LCD-Routine für KS0070 und HD44780 im 4Bit Modus v1.1
|
5 | ---------------------------------------------------------------------------------------
|
6 | */
|
7 |
|
8 | #include <avr/io.h>
|
9 | #include "lcd4b.h"
|
10 | #include <avr/delay.h>
|
11 |
|
12 |
|
13 | int main(void)
|
14 | {
|
15 | DDRD |= 0b11111100; //Pins 2-7 als Ausgänge
|
16 |
|
17 | DDRC = 0xff;
|
18 | _delay_ms(2000);
|
19 | PORTC=0x00;
|
20 | _delay_ms(500);
|
21 | PORTC=0xff;
|
22 |
|
23 | lcd_linit(); //LCD Initialisieren
|
24 | lcd_clear(); //Display löschen
|
25 | lcd_out("Hallo Welt"); //Text ausgeben
|
26 | lcd_command(line2); //2. Zeile
|
27 | lcd_out("!!!"); //Text ausgeben
|
28 |
|
29 | while(1);
|
30 | }
|
31 |
|
32 |
|
33 | // sendet ein Datenbyte an das LCD
|
34 | void lcd_data(char byte)
|
35 | {
|
36 | char sich_byte;
|
37 | sich_byte = byte;
|
38 | byte &= ~0x0f; //Bit 0-3 auf 0 setzen
|
39 | byte |= (1<<lcd_rs); //RS setzen
|
40 | PORT = byte; //oberes Nibbel Ausgeben
|
41 | lcd_enable();
|
42 |
|
43 | byte = sich_byte;
|
44 | byte = byte<<4; //Nibbles vertauschen
|
45 | byte &= ~0x0f; //Bit 0-3 auf 0 setzen
|
46 | byte |= (1<<lcd_rs); //RS setzen
|
47 | PORT = byte; //unteres Nibbel Ausgeben
|
48 | lcd_enable();
|
49 |
|
50 | kpause();
|
51 | }
|
52 |
|
53 | //sendet einen Befehl an das LCD
|
54 | void lcd_command(char byte)
|
55 | { //wie lcd_data, nur ohne RS zu setzen
|
56 | char sich_byte;
|
57 | sich_byte = byte;
|
58 | byte &= ~0x0f; //Bit 0-3 auf 0 setzen
|
59 | PORT = byte; //oberes Nibbel Ausgeben
|
60 | lcd_enable();
|
61 |
|
62 | byte = sich_byte;
|
63 | byte = byte<<4; //Nibbles vertauschen
|
64 | byte &= ~0x0f; //Bit 0-3 auf 0 setzen
|
65 | PORT = byte; //unteres Nibbel Ausgeben
|
66 | lcd_enable();
|
67 |
|
68 | kpause();
|
69 | }
|
70 |
|
71 | //erzeugt den Enable-Puls
|
72 | void lcd_enable(void)
|
73 | {
|
74 | PORT |= (1<<lcd_e); //Enable auf High
|
75 | kpause(); //kurze pause
|
76 | PORT &= ~(1<<lcd_e); //Enable auf Low
|
77 | }
|
78 |
|
79 | //Pause nach jeder Übertragung
|
80 | void kpause(void)
|
81 | {
|
82 | _delay_us(48); //48us Pause
|
83 | }
|
84 |
|
85 |
|
86 | //Längere Pause für manche Befehle
|
87 | void lpause(void)
|
88 | {
|
89 | _delay_ms(5); //5ms Pause
|
90 | }
|
91 |
|
92 | //Initialisierung
|
93 | void lcd_linit(void) //Wenn der Display gleich nachdem er mit Spannung versorgt wurde
|
94 | { //in Betrieb genommen werden soll
|
95 | unsigned char i;
|
96 | for(i=0;i<10;i++)
|
97 | {
|
98 | _delay_ms(10);
|
99 | }
|
100 | lcd_init();
|
101 | }
|
102 |
|
103 | //Initialisierung
|
104 | void lcd_init(void)
|
105 | {
|
106 | PORT = 0b00100000; //Interface auf 4-Bit setzen
|
107 |
|
108 | lcd_enable();
|
109 | lpause();
|
110 |
|
111 |
|
112 | lcd_command(0b00101000); // 2-zeilig, 5x8-Punkt-Matrix
|
113 | lcd_command(0b00001100); // Display ein
|
114 | lcd_command(0b00000110); // Kursor nach rechts wandernd, kein Display shift
|
115 | }
|
116 |
|
117 | //Sendet den Befehl zur Löschung des Displays
|
118 | void lcd_clear(void)
|
119 | {
|
120 | lcd_command(0x01);
|
121 | lpause();
|
122 | }
|
123 |
|
124 | //gibt einen Text aus
|
125 | void lcd_out(char *s)
|
126 | {
|
127 | while (*s) //so lange *s != '\0' also ungleich dem "String-Endezeichen"
|
128 | {
|
129 | lcd_data(*s); //Zeichen ausgeben
|
130 | s++;
|
131 | }
|
132 | }
|
133 | /*
|
134 | -----------------------------------------------------------------------------------------------
|
135 | LCD4b developed by Johannes K.
|
136 | -----------------------------------------------------------------------------------------------
|
137 | */
|