Hallo nochmal,
ich hab noch eine kleine Ergänzung zum Programmierstil:
1 | temp2 = temp2 & 0x0F; // unteres Nibble holen und maskieren
|
2 | LCD_PORT &= 0xF0;
|
3 | LCD_PORT |= temp2; // setzen
|
Das sieht aus, wie eine sogenannte Read-Modify-Write Anweisung.
Dabei möchte man bestimmte Bits einer Variable ändern, die anderen aber
unverändert lassen.
In deinem Beispiel möchtest du nur Bit 0 bis Bit 3 von temp betrachten
und diese in LCD_PORT an die Stellen von Bit 0 bis Bit 3 schreiben,
wobei die anderen Bits von LCD_PORT so bleiben sollen, wie sie vorher
waren.
Ich nehme an, LCD_PORT ist ein Portregister, schreibt also direkt auf
die Hardwareports.
Dein Programmierstil ist hier suboptimal, denn die zweite Zeile
schreibt auf die Bits 0 bis 3 von LCD_PORT tatsächlich null raus, wenn
auch nur für einen kurzen Moment, bis mit
1 | LCD_PORT |= temp2; // setzen
|
diese Bits mit etwas sinnvollem gefüllt werden.
Das ist ein unnötiger Peripheriezugriff, der Port könnte auch gleich so
gesetzt werden, wie er sein soll. Eventuell kannst du duch das
(unnötige) hochfrequente Schalten zwischen Zeile 2 und Zeile 3 sogar
mehr Störaussendung deiner Schaltung erwarten. Das ist jedoch nur
relevant, wenn dadurch der Rest deiner Schaltung störempfindlich ist,
oder das Gerät verkauft werden soll und dafür eine CE-Prüfung notwendig
ist.
Besser wäre folgende Vorgehensweise:
1 | temp2 &= 0x0F; //Bit 4 bis 7 von temp2 sind jetzt 0
|
2 | temp2 |= LCD_PORT & 0xF0; //Bit 4 bis 7 von LCD_PORT werden in temp2 zusätzlich mitgespeichert
|
3 | LCD_PORT = temp2; //und jetzt alles auf ein Mal auf die Hardware schreiben
|
4 |
|
5 | //wenn temp2 danach noch mit Bit 4 bis 7 == 0 gebraucht wird, noch folgendes:
|
6 |
|
7 | temp2 &= 0x0F;
|
So wird nur einmal auf LCD_PORT geschrieben.
Viele Grüße,
Peter