Anton schrieb:
> Hmm, also ich finde das eigentlich garnicht so schlecht lesbar.
Dann bist du nicht sehr anspruchsvoll
>
> Prinzipiell,
>
> ins port schreiben, enable an/aus, nächster befehl...
Mach dir wenigstens für enable an/aus eine eigene Funktion
1 | void enablePuls()
|
2 | {
|
3 | _delay_us(20);
|
4 | PORTB|=(1<<EN);
|
5 | _delay_us(20);
|
6 | PORTB&=~(1<<EN);
|
7 | }
|
und schon verkürzt sich der Rest. Zb.:
1 | void display_loeschen(void)
|
2 | {
|
3 | PORTB=(0<<EN)| (0<<RS)|(0<<D4)|(0<<D5)|(0<<D6)|(0<<D7);
|
4 | //PORTB=0b00000000;
|
5 | enablePuls();
|
6 | _delay_us(10);
|
7 |
|
8 | PORTB=(0<<EN)| (0<<RS)|(1<<D4)|(0<<D5)|(0<<D6)|(0<<D7);
|
9 | //PORTB=0b00000001;
|
10 | enablePuls();
|
11 | _delay_ms(20);
|
12 | }
|
13 |
|
14 | void cursor_rechts()
|
15 | {
|
16 | PORTB=(0<<EN)| (0<<RS)|(0<<D4)|(0<<D5)|(0<<D6)|(0<<D7);
|
17 | //PORTB=0b00000000;
|
18 | enablePuls();
|
19 | _delay_us(20);
|
20 |
|
21 | PORTB=(0<<EN)| (0<<RS)|(0<<D4)|(1<<D5)|(1<<D6)|(0<<D7);
|
22 | //PORTB=0b0000011;
|
23 | enablePuls();
|
24 | _delay_ms(20);
|
25 | }
|
26 |
|
27 | ...
|
Jetzt bedenken wir noch, dass ein Kommando übertragen IMMER nach dem
gleichen Muster abläuft: Zuerst das höherwertige Nibble, dann das
niederwertige Nibble und schreiben dafür auch noch eine Funktion
1 | void display_command( uint8_t command )
|
2 | {
|
3 | PORTB = ( command & 0xF0 );
|
4 | enablePuls();
|
5 | _delay_us(20);
|
6 |
|
7 | PORTB = ( command & 0x0F ) << 4;
|
8 | enablePuls();
|
9 | _delay_us(20);
|
10 | }
|
und schon können die Einzelfunktionen schon wieder kürzer und
übersichtlicher geschrieben werden
1 | void display_loeschen(void)
|
2 | {
|
3 | display_command( 0b00000001 );
|
4 | _delay_ms(20);
|
5 | }
|
6 |
|
7 | void cursor_rechts()
|
8 | {
|
9 | display_command( 0b00000110 );
|
10 | _delay_ms(20);
|
11 | }
|
Für die magischen Konstanten noch ein paar #define
1 | #define LCD_COMMAND_CLEAR 0b00000001
|
2 | #define LCD_COMMAND_CURSOR_RIGHT 0b00000110
|
3 |
|
4 | void display_loeschen(void)
|
5 | {
|
6 | display_command( LCD_COMMAND_CLEAR );
|
7 | _delay_ms(20);
|
8 | }
|
9 |
|
10 | void cursor_rechts()
|
11 | {
|
12 | display_command( LCD_COMMAND_CURSOR_RIGHT );
|
13 | _delay_ms(20);
|
14 | }
|
und jetzt vergleich mal deine Funktionen mit dieser letzten Version.
Welche ist leichter zu lesen und zu verstehen?
Aus 15 Zeilen Code für display_löschen ist ein schicker 2-Zeiler
geworden, den jeder mit einmal Hinsehen verifizieren kann, solange
die Konstanten richtig sind
display_command richtig geschrieben ist.
Und das beste am ganzen: display_löschen ist nicht mehr abhängig davon,
wie und wo du dein LCD angeschlossen hast. Ändert sich da was, dann ist
die einzige Stelle die Anpassung benötigt, die Funktion display_command
bzw. enablePuls. Und die gilt dann automatisch auch für alle anderen
Kommando-Funktionen.