Forum: Projekte & Code Simulation des 4-Bit Modus beim HD44780


von Christian S. (chrisstra84)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

ich habe hier mal ein Programm geschrieben, welches Simuliert, wie ein 
Zeichen im 4-Bit Modus an mein HD44780 kompatibles LCD (EA W204B-NLW) 
von Electronic Assembly übertragen wird. Zur Hilfe habe ich hier die 
Routine von der Seite genommen 
(http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung).
Ich habe halt versucht zu verstehen, wie der Kontroller angesteuert 
wird. Betrachtet habe ich hierbei erst mal nur die Datenübertragung an 
sich.

Mit der Funktion „lcd_data()“ wird hier ein Datenwert (253) an den 
Kontroller geschickt. Dies passiert wie folgt. Zuerst wird das gesamte 
Byte an die Funktion „lcd_out()“ geschickt. Dabei werden die oberen Bits 
mit 1111 und die unteren mit 0000 maskiert. So das mit „data &= 0xF0“ 
dafür gesorgt wird, dass nur noch die Daten an sich (4 oben Bits) 
vorhanden sind. Dann wird in der eigentlichen Funktion mit „Port &= 
~(0xF0>>(4-0))“ dafür gesorgt, dass erst mal die Pins am Port, welche 
zur Übertragung genutzt werden auf 0000 gesetzt werden. Dann wird mit 
„LCD_PORT |= (data>>(4-LCD_DB)“ dafür gesorgt, dass nur noch die 4 
Bit-Daten an die Pins gelegt werden. Der restliche Port bleibt also wie 
es ist.

Dann kommen auf die gleiche Weise die restlichen 4-Bits (unteren) 
hinterher. Nur wurde vorher mit einem linksshift (data<<4) dafür 
gesorgt, dass die untern 4-Bits jetzt an der Position der 4 oberen Bits 
liegen und auf gleiche Art und Weise wie die eigentlichen oberen Bits 
übertragen werden.

Wenn ich also von dem Zeichen 253 ausgehe (0b11111101), dann wird zuerst 
die obere Hälfte (1111) und dann die untere Hälfte (1101) übertragen. So 
das im gesamten Ergebnis die 253 (11111101) übertragen wurde. Man sieht 
auch, dass zu jedem Zeitpunkt (T1 & T2) die 4 anderen (hier oberen) Pins 
vom Port unverändert bleiben.

Ich hoffe ich habe es so richtig verstanden.

Gruß
Christian
1
/*
2
 * LCD.c
3
 *
4
 * Created: 06.09.2014 17:45:44
5
 *  Author: Christian
6
 */ 
7
8
#include <avr/io.h>
9
#include "lcd-routines.h"
10
#include <util/delay.h>
11
12
// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
13
// Simulation der lcd-routine von :
14
// http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
15
16
// Es wird das Zeichen 253 übertragen
17
18
//Virtuelle Port (mit dem Zustand 0b10010000)
19
static uint8_t Port =  0b10010000;
20
21
22
// Sendet ein Datenbyte an das LCD (lcd_out( uint8_t data ))
23
24
  static uint8_t test(uint8_t daten)
25
  {    
26
    //obere 4 Bit maskieren
27
    daten &= 0xF0;
28
    
29
    //Maske löschen
30
    Port &= ~(0xF0>>(4-0));
31
    //Bits setzen
32
    Port |= (daten>>(4-0));    
33
    return(Port);    
34
  };
35
36
37
//Simulation lcd_data( uint8_t data )
38
int main(void)
39
{
40
   
41
  lcd_init(); 
42
  
43
  
44
45
  uint8_t test_daten = 0b11111101;  
46
  uint8_t gesamt = 0;  
47
  uint8_t test_Port = 0;
48
    char buffer[33];
49
    
50
  
51
  // Oberen 4 Bits  
52
  //Ablauf in der Funktion (hier nur für Hilfszwecke)
53
  uint8_t D1 = test_daten;
54
  D1 &= 0xF0;
55
  D1 = (D1>>(4-0));  
56
  
57
  //obern Bits an Funktion
58
  test_Port = test( test_daten );   
59
  gesamt |= (test_Port<<4);  
60
  
61
  //Zeitpunkt 1 am Port
62
  lcd_setcursor(0, 1);
63
  lcd_string("T1:");         
64
  
65
  lcd_setcursor(5, 1);
66
  itoa(test_Port,buffer,2);
67
  lcd_string(buffer);
68
  
69
  //Übertragende Bits
70
  lcd_setcursor(14, 1);
71
  itoa(D1,buffer,2);
72
  lcd_string(buffer);
73
  
74
  //Unteren 4 Bits  
75
  //Ablauf in der Funktion (hier nur für Hilfszwecke)
76
  uint8_t D2 = test_daten;
77
  D2 = ( D2<<4 );
78
  D2 &= 0xF0;
79
  D2 = (D2>>(4-0));  
80
    
81
  //unteren Bits an Funktion
82
  test_Port = test( test_daten<<4 ); 
83
  gesamt |= (test_Port);
84
  
85
  //Zeitpunkt 2 am Port
86
  lcd_setcursor(0, 2);
87
  lcd_string("T2:");
88
          
89
  lcd_setcursor(5, 2);  
90
  itoa(test_Port,buffer,2);
91
  lcd_string(buffer);
92
  
93
  //Übertragende Bits
94
  lcd_setcursor(14, 2);
95
  itoa(D2,buffer,2);
96
  lcd_string(buffer);
97
   
98
  
99
    lcd_setcursor(0, 3);    
100
  lcd_string("-------------");
101
  
102
  
103
  //Gesamt übertragende Daten an HD44780
104
  lcd_setcursor(0, 4); 
105
  lcd_string("Data:");
106
  
107
  
108
  lcd_setcursor(5, 4);
109
  itoa(gesamt,buffer,2);
110
  lcd_string(buffer);
111
  
112
  lcd_setcursor(14, 4);
113
  itoa(gesamt,buffer,10);
114
  lcd_string(buffer);
115
  
116
  lcd_setcursor(18, 4);
117
  lcd_data(gesamt);
118
  
119
  
120
  
121
  return 0;
122
}

von Karl H. (kbuchegg)


Lesenswert?

Na ja. Von einer 'Simulation' bist du noch weit entfernt.
Dein Programm zeigt eigentlich nur an, wie ein 8 Bit Wert in 2 4 Bit 
Teile zerlegt wird. Das ist zwar ein integraler Teil, der 
notwendigerweise bei der Kommunikation mit einem HD44780 im 4 Bit Modus 
anfällt, aber es ist nur ein kleiner Teil davon. Da fehlt zb noch das 
ganze Geklimpere mit den Steuerleitungen, denn die Übertragung ist ja 
nicht einfach nach dem Muster: erst leg ich die ersten 4 Bit an, dann 
leg ich die 2.ten 4 Bit an und schwupdiwupp ist das Byte im 
LCD-Controller.

Wenn dir da was unklar ist, dann frag bitte im Forum. Aber zu einem 
Eintrag in der Codesammlung reicht das gezeigte meiner Meinung nach 
nicht wirklich.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.