Dat kan wel, in het 4-bits systeem splits je de byte op in 2 stukken. Je stuurt eerst de 4 MSB bits en daarna de 4 LSB bits. Zou ook net andersom kunnen zijn, maar dat valt wel te achterhalen in een HD44780 datasheet.

Ik kan helaas geen datasheet vinden van het display dat ik heb. Is er een standaard waarde voor onderstaande zaken:

FUNCTION_SET ; Send the function set command 4-bit I/F, Font, Number of lines
DISP_OFF
DISP_ON
ENTRY_INC

Zoals Marcel hier al zegt: zoek eens een datasheet van de HD44780, de meest-gebruikte controller voor karakter LCD modules.

Ik zoek al avonden lang in die datasheets....

[Bericht gewijzigd door MMSoft op ]

Ik zie één punt waarop het soms verkeerd KAN gaan, en dat is het direct na elkaar gebruiken van BCF en BSF instructies op dezelfde poort. Deze instructies maken gebruik van zgn. Read-Modify-Write. Er kunnen meer pennen veranderen dan dat je zou verwachten.

Ik zou minimaal een NOP instructie tussen de opeenvolgende BCF en BSF commando's plaatsen, afh. van de klokfrequentie. Deze plaatsen, ook al hoeft het niet om aan de timing specificaties van het display te voldoen. Ik heb al heeeeel veeeel van dit soort vage problemen gehad!

FullPower: PIC werkt op 4 Mhz

Op 5 februari 2006 21:06:10 schreef Bliksem:
Wat wil je hebben? Gewoon een stukje asm die in 4 bit een lcd aanstuurt? Dat heb ik nog wel liggen voor een 16F628.

Stuur maar als je wilt, dan probeer ik of dat wel goed werkt....

Ik heb nog eens goed gezocht naar de gegevens van het LCD display en heb deze gevonden:
Zie PDF bestand bij Bestel nummer: 71.52.20210 www.display.nl

Welke codes moet ik nu precies opgeven ?
Het display is volgens de 4 bits mode aangesloten,
dus de vraag hoe moet dat precies ?
Ik heb al het een en ander geprobeerd, maar zonder succes.


;LCD Display initaliseren

MOVLW   0x??     ;FUNCTION_SET: 4 bits, 2 lines 
CALL    SEND_CMD ;
MOVLW   0x??     ;Display off
CALL    SEND_CMD
MOVLW   0x??     ;Display ON
CALL    SEND_CMD
MOVLW   0x??     ;ENTRY_INC
CALL    SEND_CMD

[Bericht gewijzigd door MMSoft op ]

Voor iedere opdracht moet je toch 8bits sturen, dat is dus 2x 4 bits achter elkaar, met dus ook 2 'Enable' pulsen. Deze commando's zijn vaak in HEX en binaire code terug te vinden in de datasheet, deze moet je dus opsplitsen, eerst stuur je 4 van de 8 bits, daaran de andere 4. Of de hoogste of laagste 4 bits eerst moeten, weet ik niet, dat staat ook wel in de datasheet. Voor de 4-bit interface moet je ook een andere initalisatie-opdracht geven dan bij een 8bit interface. De RS pin geeft aan of het om text of een opdracht gaat, de R/W pin is meestal overbodig, omdat er toch niemand leest, en die Busy flag controle wil volgens mij ook weleens uCs vast laten lopen, dus daar zou je gewoon een korte vertraging in kunnen voeren.

Ik heb deze code uit een 4 bits voorbeeld.
Dit werkt bij mij echter niet.
Ik krijg niets op het display !


; Modified to only use 4 bit interface and to not destroy the
; contents of the lower portion of the output register and the
; output register TRIS.  Changed the examples to include a table
; definition using the "dt" compiler directive.  Added delay 
; subroutines for testing.  Changed CHECK_BUSY to WAIT_BUSY and
; added a CHECK_BUSY that returns 0 if not busy, ff if busy.  

;*******************************************************************************
;* The LCD 4-bit Module Subroutines                                            *
;*******************************************************************************

;*******************************************************************
;*SendChar - Sends character to LCD                                *
;*This routine splits the character into the upper and lower       * 
;*nibbles and sends them to the LCD, upper nibble first.           *
;*******************************************************************

SEND_CHAR
	MOVWF   CHAR            ; Character to be sent is in W
	CALL    WAIT_BUSY       ; Wait for LCD to be ready
	MOVLW   0x0F
	ANDWF   LCD_DATA,F      ; Clear the upper nibble
	MOVF    CHAR,W          
	ANDLW   0xF0            ; Get upper nibble
	IORWF   LCD_DATA,F      ; Send data to LCD
	BCF     LCD_CNTL,1    ; Set LCD to write
	BSF     LCD_CNTL,0     ; Set LCD to data mode
	BSF     LCD_CNTL,2      ; Toggle E for LCD
	BCF     LCD_CNTL,2
	MOVLW   0x0F
	ANDWF   LCD_DATA,F      ; Clear the upper nibble
	SWAPF   CHAR,W
	ANDLW   0xF0            ; Get lower nibble
	IORWF   LCD_DATA,F      ; Send data to LCD
	BSF     LCD_CNTL,2      ; Toggle E for LCD
	BCF     LCD_CNTL,2
	RETURN

;*******************************************************************
;* SEND_CMD - Sends command to LCD                                 *
;* This routine splits the command into the upper and lower        * 
;* nibbles and sends them to the LCD, upper nibble first.          *
;*******************************************************************

SEND_CMD
	MOVWF   CHAR            ; Character to be sent is in W
	CALL    WAIT_BUSY       ; Wait for LCD to be ready
	MOVLW   0x0F
	ANDWF   LCD_DATA,F      ; Clear the upper nibble
	MOVF    CHAR,W          
	ANDLW   0xF0            ; Get upper nibble
	IORWF   LCD_DATA,F      ; Send data to LCD
	BCF     LCD_CNTL,1    ; Set LCD to write
	BCF     LCD_CNTL,0     ; Set LCD to command mode
	BSF     LCD_CNTL,2      ; Toggle E for LCD
	BCF     LCD_CNTL,2
	MOVLW   0x0F
	ANDWF   LCD_DATA,F      ; Clear the upper nibble
	SWAPF   CHAR,W
	ANDLW   0xF0            ; Get lower nibble
	IORWF   LCD_DATA,F      ; Send data to LCD
	BSF     LCD_CNTL,2      ; Toggle E for LCD
	BCF     LCD_CNTL,2
	RETURN

;*******************************************************************
;* This routine checks the busy flag, returns when not busy        *
;*  Affects:                                                       *
;*  LCD_TEMP - Returned with busy/address                          *
;*******************************************************************

WAIT_BUSY
	BSF     STATUS,RP0      ; Select Register page 1
	MOVLW   0xF0            ; Set port to input
	IORWF   LCD_DATA_TRIS,W ; Only set upper half of port
	MOVWF   LCD_DATA_TRIS
	BCF     STATUS,RP0      ; Select Register page 0
	BCF     LCD_CNTL,0     ; Set LCD for Command mode
	BSF     LCD_CNTL,1    ; Setup to read busy flag
	BSF     LCD_CNTL,2      ; Set E high
	BCF     LCD_CNTL,2      ; Set E low
	MOVF    LCD_DATA,W      ; Read upper nibble busy flag, DDRam address
	ANDLW   0xF0            ; Mask out lower nibble
	MOVWF   LCD_TEMP
	BSF     LCD_CNTL,2      ; Toggle E to get lower nibble
	BCF     LCD_CNTL,2
	SWAPF   LCD_DATA,W      ; Read lower nibble busy flag, DDRam address
	ANDLW   0x0F            ; Mask out upper nibble
	IORWF   LCD_TEMP,W      ; Combine nibbles
	BTFSC   LCD_TEMP,7      ; Check busy flag, high = busy
	GOTO    WAIT_BUSY       ; If busy, check again
	BCF     LCD_CNTL,1        
	BSF     STATUS,RP0      ; Select Register page 1
	MOVLW   0x0F
	ANDWF   LCD_DATA_TRIS,W
	MOVWF   LCD_DATA_TRIS   ; Set Port for output
	BCF     STATUS, RP0     ; Select Register page 0
	RETURN

;*******************************************************************
;* This routine checks the busy flag, returns FF if busy, 00 if    *
;* not busy.  LCD_TEMP will contain the current address.           *
;*                                                                 *
;*  Affects:                                                       *
;*  LCD_TEMP - Returned with busy/address                          *
;*******************************************************************

CHECK_BUSY
	BSF     STATUS,RP0      ; Select Register page 1
	MOVLW   0xF0            ; Set port to input
	IORWF   LCD_DATA_TRIS,W ; Only set upper half of port
	MOVWF   LCD_DATA_TRIS
	BCF     STATUS,RP0      ; Select Register page 0
	BCF     LCD_CNTL,0     ; Set LCD for Command mode
	BSF     LCD_CNTL,1    ; Setup to read busy flag
	BSF     LCD_CNTL,2      ; Set E high
	BCF     LCD_CNTL,2      ; Set E low
	MOVF    LCD_DATA,W      ; Read upper nibble busy flag, DDRam address
	ANDLW   0xF0            ; Mask out lower nibble
	MOVWF   LCD_TEMP
	BSF     LCD_CNTL,2      ; Toggle E to get lower nibble
	BCF     LCD_CNTL,2
	SWAPF   LCD_DATA,W      ; Read lower nibble busy flag, DDRam address
	ANDLW   0x0F            ; Mask out upper nibble
	IORWF   LCD_TEMP,W      ; Combine nibbles
	BTFSC   LCD_TEMP,7      ; Check busy flag, high = busy
	GOTO    BUSY_EXIT       ; If busy exit with busy flag set

	BCF     LCD_CNTL,1        
	BSF     STATUS,RP0      ; Select Register page 1
	MOVLW   0x0F
	ANDWF   LCD_DATA_TRIS,W
	MOVWF   LCD_DATA_TRIS   ; Set Port for output
	BCF     STATUS,RP0      ; Select Register page 0
	RETLW   0x00

BUSY_EXIT
	BCF     LCD_CNTL,1        
	BSF     STATUS,RP0      ; Select Register page 1
	MOVLW   0x0F
	ANDWF   LCD_DATA_TRIS,W
	MOVWF   LCD_DATA_TRIS   ; Set Port for output
	BCF     STATUS,RP0      ; Select Register page 0
	RETLW   0xFF

;*******************************************************************************
;*                    - Initilize the LCD Display Module                       *
;*******************************************************************************

LCD_INIT
	BCF     LCD_CNTL,2      ; Clear all controll lines
	BCF     LCD_CNTL,0
	BCF     LCD_CNTL,1

	CALL    DELAY15000      ; Wait for 15ms for LCD to get powered up
	CALL	DELAY15000
	CALL	DELAY15000

	MOVLW   0x0F
	ANDWF   LCD_DATA,F      ; Clear the upper nibble
	MOVLW   0x30            ; Command for 4-bit interface high nibble
	IORWF   LCD_DATA,F      ; Send data to LCD      

	BSF     STATUS,RP0      ; Select Register page 1
	MOVLW   0x0F
	ANDWF   LCD_DATA_TRIS,W
	MOVWF   LCD_DATA_TRIS   ; Set Port for output
	BCF     STATUS,RP0      ; Select Register page 0

	BSF     LCD_CNTL,2      ; Clock the initalize command to LCD module
	BCF     LCD_CNTL,2

	CALL    DELAY4100       ; Delay for at least 4.1ms before continuing

	BSF     LCD_CNTL,2      ; Clock the initalize command to LCD module
	BCF     LCD_CNTL,2
	 
	CALL    DELAY100        ; Delay for at least 100usec before continuing

	BSF     LCD_CNTL,2      ; Clock the initalize command to LCD module
	BCF     LCD_CNTL,2

	CALL    WAIT_BUSY       ; From here on, the Busy Bit will be valid.

	MOVLW   0x0F
	ANDWF   LCD_DATA,F      ; Clear the upper nibble
	MOVLW   0x20            ; Command for 4-bit interface high nibble (Really an 8bit command but
							; lower 4 bits are don't care at this point)
	IORWF   LCD_DATA,F      ; Send data to LCD      

	BSF     LCD_CNTL,2      ; Clock the initalize command to LCD module
	BCF     LCD_CNTL,2

	MOVLW   0x28            ;FUNCTION_SET: 4 bits, 2 lines, 5x7 font 
	CALL    SEND_CMD        ;Can now use the SEND_CMD routine since Busy Bit Valid and in 4bit mode.
	MOVLW   0x08            ;Display off
	CALL    SEND_CMD
	MOVLW   0x0C            ;Display ON
	CALL    SEND_CMD
	MOVLW   0x06            ;ENTRY_INC
	CALL    SEND_CMD
; LCD Module is now initalized
	RETURN

;*******************************************************************************
;* Delay routines.  These routines need to be modified to work with the        *
;* particular PIC configuration used.  For test purposes, they are instruction *
;* count delays based on 4Mhz PIC.  The delays are a little longer than        *
;* advertised but close enough for testing.                                    *
;*******************************************************************************

DELAY4100	; 4.1ms delay
	MOVLW   D'252'
	MOVWF   R1
	MOVLW   4
	MOVWF   R2
	MOVLW   1
	MOVWF   R3
	MOVLW   1
	MOVWF   R4
 
DELAY_LOOP
	NOP             
	DECFSZ  R1,F
	GOTO    DELAY_LOOP
	DECFSZ  R2,F
	GOTO    DELAY_LOOP
	DECFSZ  R3,F
	GOTO    DELAY_LOOP
	DECFSZ  R4,F
	GOTO    DELAY_LOOP
	RETURN

DELAY100	; 100µs delay
	MOVLW   D'44'
	MOVWF   R1
	MOVLW   1
	MOVWF   R2
	MOVLW   1
	MOVWF   R3
	MOVLW   1
	MOVWF   R4 
	GOTO    DELAY_LOOP

DELAY15000	; 15ms delay
	MOVLW   D'156'
	MOVWF   R1
	MOVLW   15
	MOVWF   R2
	MOVLW   1
	MOVWF   R3
	MOVLW   1
	MOVWF   R4 
	GOTO    DELAY_LOOP

En zo roep ik deze code op:


Aan het einde van het Initaliseren:
;LCD Display initaliseren
CALL       LCD_INIT         ;LCD Display initaliseren

Tijdens programma:               
;LCD Display Tekst Plaatsen
MOVLW   0x83            ;Select address of character to display
CALL    SEND_CMD        ;Cursor positie   DDRAM address, first character
MOVLW	  '*'			; 
CALL    SEND_CHAR       ;Display "*" character

[Bericht gewijzigd door MMSoft op ]

Mario,
De code die je gepost hebt is de 4bits-code die ik gebruik voor al mijn LCD en LCD-compatibele VFD projecten, dus ik weet zeker dat ze werkt.
Zoals ik in een mailtje naar jou zei moet het bestand LCD.H in dezelfde map staan als je ASM bestand.

LCD.H:


;***************************************************************************
	nolist

_ResetVector    set     0x00
_IntVector      set     0x04

; LCD4 Module commands
LINE1                   EQU             0x80   ; Set display to line 1 character 0
LINE2                   EQU             0xC0   ; Set display to line 2 character 0
FUNCTION_SET            EQU             0x28   ; 4 bits, 2 lines, 5x7 font 
DISP_ON                 EQU             0x0C   ; Display on
DISP_ON_C               EQU             0x0E   ; Display on, Cursor on
DISP_ON_B               EQU             0x0F   ; Display on, Cursor on, Blink cursor
DISP_OFF                EQU             0x08   ; Display off
CLR_DISP                EQU             0x01   ; Clear the Display
ENTRY_INC               EQU             0x06   ;
ENTRY_INC_S             EQU             0x07   ;
ENTRY_DEC               EQU             0x04   ;
ENTRY_DEC_S             EQU             0x05   ;
DD_RAM_ADDR             EQU             0x80   ; Least Significant 7-bit are for address
HOME                    EQU             0x80   ; Upper Left corner of the Display

	list
;***************************************************************************

LCD.H declareer je zo in je ASM bestand:


	Processor	16F628A
	LIST		P=PIC16F628A
	#INCLUDE	"P16F628A.INC"

	RADIX		HEX
	EXPAND
	#INCLUDE	<LCD.H>

	__CONFIG _CP_OFF & _MCLRE_OFF & _WDT_OFF & _INTOSC_OSC_NOCLKOUT & _LVP_OFF & _PWRTE_ON & _BOREN_OFF & _DATA_CP_OFF

Hier een fotootje van een Noritake 2x20 LCD-compatibel VFD display werkend met deze code (er zijn zelfs een aantal user defined karakters in CGRAM gebruikt):
http://www.turbokeu.com/myprojects/lcdclock/vfd2x20.jpg

Als je alle bestanden die ik je opgestuurd heb in dezelfde map plaatst en compileert en hetzelfde aansluitschema gebruikt moet je LCD exact weergeven zoals op de foto.

CD :)

PS: Misschien een stomme vraag: Het contrast van je LCD staat toch goed?

Contrast staat goed !

Dan zit er niet andes op dan dat ik een slecht display heb (ik weet het niet meer) ....
Ik heb ook al een nieuwe PIC geprobeerd, maar het probleem blijft !
Ook als ik alles bestanden die ik van je (Turbokeu) ontvangen heb compileer, dan krijg ik helemaal niets op het scherm.
Daarom probeer ik de juiste code (volgens de datasheet van mijn display) te plaatsen in de initalisering.
Ik begrijp echter nog niet hoe ik dit aanpak, met het oog op 8 bits code (die in de datasheet staat) plaatsen in deze code.

Het vreemde is dat het display wel werkt met de code van Ganzz !
Helaas is dat geen asm code...

[Bericht gewijzigd door MMSoft op ]

Zucht... Als dat LCD met een ander z'n code wel werkt, ligt het dus niet aan de LCD.
Zo spannend is een 44780 nou ook weer niet - heb je de datasheet wel eens goed gelezen? Staan voorbeeldjes in tot op bit niveau, met timing diagrams en alles. Zo vreselijk moeilijk kan het in assembly dan toch niet meer zijn??

Had je nou met een AVR gewerkt, had je wat aan mijn assembly library gehad ;)

Wie wil er eens in de datasheet kijken, omdat dit voor mij het eerste (en als het zo daargaat tevens het laatste :) ) LCDtje is, kan ik niets vergelijken.

Wat moet er dan in die datasheet gekeken worden???? Hier staat alles wat je weten wilt. Tot op bit niveau voor 4-bit mode.

Op 11 februari 2006 11:13:25 schreef MMSoft:
Contrast staat goed !

Dan zit er niet andes op dan dat ik een slecht display heb (ik weet het niet meer) ....
Ik heb ook al een nieuwe PIC geprobeerd, maar het probleem blijft !
Ook als ik alles bestanden die ik van je (Turbokeu) ontvangen heb compileer, dan krijg ik helemaal niets op het scherm.
Daarom probeer ik de juiste code (volgens de datasheet van mijn display) te plaatsen in de initalisering.
Ik begrijp echter nog niet hoe ik dit aanpak, met het oog op 8 bits code (die in de datasheet staat) plaatsen in deze code.

Het vreemde is dat het display wel werkt met de code van Ganzz !
Helaas is dat geen asm code...

OK...
Je PIC draait toch aan 4MHz? (de delays in mijn LCD routines zijn voorzien voor een clock van 4MHz)

Op de tientallen LCD's die ik bezit heb ik ook ééntje die niet werkt met deze code, ligt dus aan het LCD zelf in mijn geval.
Heb je geen ander LCD'eetje om te testen?

CD :)

PIC draait op 4MHz (Kristal).

Tientallen LCD's ?
Wat ben jij van plan :)

Omdat ik pas begonnen ben met LCDtjes heb ik er maar 1.
Bij Voti zijn ze tijdelijk op, dus maar een dure besteld bij Display.

Terug sturen is lastig omdat hij het (soms) wel doet !

Je kan ze ook goedkoop bij www.world-led.com kopen, daar heb ik ook nog een voorraadje van liggen. Ik zal ook als ik het niet vergeet straks even die code mailen, die staat alleen op een andere pc dan deze, en omdat ik door de week in delft zit had ik ook toen de mogelijkheid niet, maar hij komt eraan.

Op 11 februari 2006 12:55:10 schreef MMSoft:
Tientallen LCD's ?
Wat ben jij van plan :)

Gewoon wat reserve...;)
Gekocht op het goede moment, 't kan altijd van pas komen.

Mijn LCD-VFD collectie:
http://www.turbokeu.com/temp/lcd-vfd.jpg
2x16, 2x20, 4x16, 4x20, 2x40.
Bovenaan een blauwe grafische 240x128, onderaan links een blauwe grafische 340x240, en helemaal links onderaan een 2x20 OLED.
Rechts al mijn VFD's waaronder één grafische en twee 16-segments, 1x20, 2x20, 2x24, 2x40, 4x20 en twee enorme 1x20 VFD's van IEE -"The Moose".

CD :)

PS: Er ontbreekt nog een Seetron 120x32 grafisch LCD maar die zit in mijn desktop.

Geen wonder dat bijna overal die Displays zijn uitverkocht ;)

Bliksem: Alvast bedankt !

[Bericht gewijzigd door MMSoft op ]

Op 11 februari 2006 13:38:36 schreef Bliksem:
Je kan ze ook goedkoop bij www.world-led.com kopen, daar heb ik ook nog een voorraadje van liggen. Ik zal ook als ik het niet vergeet straks even die code mailen, die staat alleen op een andere pc dan deze, en omdat ik door de week in delft zit had ik ook toen de mogelijkheid niet, maar hij komt eraan.

Nog niets gezien :)

Een 16x2tje heb ik evt. ook nog wel voor je. Als je geen haast hebt, wil ik 'm ook nog wel even voor je testen (zal wel goed zijn, maar om je probleem nou niet ingewikkelder te maken dan het is...). Mocht je interesse hebben, probeer dan per mail.

Op 12 februari 2006 18:45:10 schreef MMSoft:
[...]Nog niets gezien :)

Goed dat je het zegt, ik heb een geheugen als een zeef dus ik zou het weer bijna vergeten, maar als het goed is zit hij nu in je mailbox.

Bliksem: Ik heb de code ontvangen.
Helaas loopt het display nog steeds vast !

Dit Display leg ik aan de kant en bestel binnenkort een ander.

Iedereen bedankt !

Mijn DCF klokje met LCD display loopt nu al 24 uur zonder problemen.

Het LCD probleem is dus opgelost.

Ik heb een gebruikt en getest LCD Display over kunnen nemen van Marco69.
Omdat dit in eerste instantie ook niet werkte bij mij, ben ik daarmee aan de slag gegaan.
Vraag mij niet waar het nu precies aan lag, ik heb nog zoveel gewijzigd en veranderd...
Er is wel een groot verschil, en dat is dat ik nu alleen naar het display schrijf.
De R/W lijn hangt nu constant aan de massa.

Het andere Display werkt nu ook.

Iedereen bedankt !