Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: Elektor Zweidraht-LCD mit CControl1.1 ansteuern Kategorie: Hardware (von Mak - 11.07.2009 1:58)
 Als Antwort auf Re: Elektor Zweidraht-LCD mit CControl1.1 ansteuern von Mak - 19.06.2009 10:07
Hallo,
konnte endlich das Problem lösen und kann das Thema hoffentlich bald beenden:
Folgender Zusatz zu den vorangegangenen Notizen:

1. Habe den 74HCT4049, der wiederholbar nicht mit der spezifizierten Vs gearbeitet hat, rausgehauen und somit habe ich auch die Diode auf Massepotential entfernt --> saubere Lösung. Der neue IC 74HCT4094 arbeitet nach Spec.
2. Die 1N4148 Wald- und Wiesen-Diode an Pin 12 des Schieberegisters für eine UND-Verknüfung zur Erzeugung des Enable-Signals fürs LCD habe ich nun doch gegen eine Schottky-Diode BAT43 getauscht. Das reicht für die Anforderungen und diskreten Aufbau.
3. Das Problem, dass das LCD nach Power-On oder auch nach Reset nicht permanent richtig funktionierte, lag an der nicht ausreichenden Initialisierung des Display-Controllers. Ein Blick in das Datenblatt des HD44780 hat erfolgreich weitergeholfen.

Ich habe die Conrad-Beispiele zur CC1-MainUnit lcdx.bas auf das Zweidraht-LCD für das Conrad 2x16LCD (MC1602E-TGR) umgesetzt.

Hier ein Beispiel zur Textausgabe (wie bereits gepostet), nun aber mit korrekter Initialisierung, für ein 2x16LC-Display:

'******************************************
'* *
'* Textausgabe auf *
'* einem 2x16 HD44780 kompatiblen *
'* 2-Draht-LC-Display *
'* *
'* Version: 1.1 *
'* Author: M.Piering *
'* Datum: 10.07.2009 *
'* Referenzen: *
'* elektor artikel 05/2008 *
'* Conrad Electronic LCD3.BAS *
'* *
'******************************************

' *** Daten-Definition ***
DEFINE i BYTE
DEFINE k BYTE
DEFINE lcd_param BYTE
DEFINE lcd_rs BYTE

' *** Definition LCD-Ports ***
DEFINE lcd_data PORT[15]
DEFINE lcd_clock PORT[16]

'*** ASCII-Codes ***
define A_ &H41
define B_ &H42
define C_ &H43
define D_ &H44
define E_ &H45
define F_ &H46
define G_ &H47
define H_ &H48
define I_ &H49
define J_ &H4A
define K_ &H4B
define L_ &H4C
define M_ &H4D
define N_ &H4E
define O_ &H4F
define P_ &H50
define Q_ &H51
define R_ &H52
define S_ &H53
define T_ &H54
define U_ &H55
define V_ &H56
define W_ &H57
define X_ &H58
define Y_ &H59
define Z_ &H5A

DEFINE MINUS &H2D

'*** Programmoperationen  ***

  GOSUB LCD_INIT
PAUSE 5

'Ausgabe von Zweidraht LC-Display am Display
  lcd_param = Z_ : GOSUB LCD_WRITECHAR       'ZWEIDRAHT
  lcd_param = W_ : GOSUB LCD_WRITECHAR
  lcd_param = E_ : GOSUB LCD_WRITECHAR
  lcd_param = I_ : GOSUB LCD_WRITECHAR
  lcd_param = D_ : GOSUB LCD_WRITECHAR
  lcd_param = R_ : GOSUB LCD_WRITECHAR
  lcd_param = A_ : GOSUB LCD_WRITECHAR
  lcd_param = H_ : GOSUB LCD_WRITECHAR
  lcd_param = T_ : GOSUB LCD_WRITECHAR

  lcd_param = 2 : GOSUB LCD_GOTOLINE         'Wechsel in die zweite Zeile

  lcd_param = L_ : GOSUB LCD_WRITECHAR       'LC-DISPLAY
  lcd_param = C_ : GOSUB LCD_WRITECHAR
  lcd_param = MINUS : GOSUB LCD_WRITECHAR
  lcd_param = D_ : GOSUB LCD_WRITECHAR
  lcd_param = I_ : GOSUB LCD_WRITECHAR
  lcd_param = S_ : GOSUB LCD_WRITECHAR
  lcd_param = P_ : GOSUB LCD_WRITECHAR
  lcd_param = L_ : GOSUB LCD_WRITECHAR
  lcd_param = A_ : GOSUB LCD_WRITECHAR
  lcd_param = Y_ : GOSUB LCD_WRITECHAR

  END

'*** LCD_Interface ***
'( muss in jedes Programm mit LCD-Ausgabe eingefuegt werden)

#LCD_INIT
'8-Bit-Kommandos lt. HD44780 Datenblatt
  lcd_param = &H33 : GOSUB LCD_WRITECMD 'Initialisierung durch externen Controller
  lcd_param = &H32 : GOSUB LCD_WRITECMD

'4-Bit-Modus aktivieren
  lcd_param = &H28 : GOSUB LCD_WRITECMD '4Bit-modus, zwei Zeilen
  lcd_param = &H0C : GOSUB LCD_WRITECMD 'Display an, Cursor+Blinken aus

'Display loeschen
#LCD_CLS
  lcd_param = &H01 : GOSUB LCD_WRITECMD 'Display loeschen
  RETURN

'Zeilenwechsel
#LCD_GOTOLINE
IF lcd_param = 1 THEN lcd_param = &H80
IF lcd_param = 2 THEN lcd_param = &HC0

'LCD-Kommando
#LCD_WRITECMD
lcd_rs = 0
GOTO LCD_WRITE_BYTE

'Zeichenausgabe
#LCD_WRITECHAR
lcd_rs = 1

'Kommando oder Zeichen an Display senden
#LCD_WRITE_BYTE 'teile Datenbyte in High- und Low-Nibble auf und sende es an LCD im 4Bit-Mode
k = lcd_param SHR 4 'High-Nibble durch Rechtsschieben separieren
GOSUB LCD_WRITE_NIBBLE 'und ausgeben
k = lcd_param AND 15 'Low-Nibble durch UND-Verknuepfung bilden
GOSUB LCD_WRITE_NIBBLE 'und ausgeben
RETURN

#LCD_WRITE_NIBBLE
lcd_clock=0
lcd_data=0
'Clear all stages of shift register
FOR i=1 TO 8
lcd_clock=1
lcd_clock=0
NEXT
'Zustand in Q7 des Schieberegisters ist egal und wird nicht bewußt gesetzt
'Set E-Level at Q6
lcd_data=1
lcd_clock=1
lcd_clock=0
'Set level for RS at Q5
lcd_data=lcd_rs
lcd_clock=1
lcd_clock=0 '
'Shift in 4 bits
FOR i=1 TO 4
IF (k AND 8) = 0 THEN lcd_data=0 ELSE lcd_data=1
'Clock in data with rising edge
lcd_clock=1
lcd_clock=0
k=k SHL 1
NEXT
'Shift in 0-Bit
lcd_data=0
lcd_clock=1
lcd_clock=0
'Set E
lcd_data=1
lcd_data=0
RETURN


Falls jemand Fragen hat oder die anderen Beispiele brauchen sollte, bitte einfach melden.
An der Umsetzung auf ein 4x16 bzw. 4x20 LCD bin ich noch dran - der Knoten ist geplatzt.
MfG, Mak

 Antwort schreiben

Bisherige Antworten: