Hallo Leute, versuche seit Tagen auf dem W164B-NLW von Electronic Assembly eine vernünftige Anzeige hinzubekommen. Doch während der Initialisierung und später bei der Anzeige, werden nur die Zeilen 2+4 angezeigt (alle korrekt), die komischerweise auf dem Display als Zeile 1+3 erscheinen (haben aber die RAM-Adressen von Zeile 2+4). Mir fehlen also zwei Zeilen! Mache ich da irgendwas falsch, oder ist mein Display im Eimer? Hier meine init-Sequenz: movlw D'255' ; 250 ms Pause nach dem Einschalten movwf loops call WAIT movlw B'00110000' ; 1 movwf PORTC bsf PORTC, LcdE nop bcf PORTC, LcdE movlw D'50' ; 50 ms Pause movwf loops call WAIT movlw B'00110000' ; 2 call Control8Bit movlw B'00110000' ; 3 call Control8Bit movlw B'00100000' ; 4 call Control8Bit movlw B'00000001' ; löschen und cusor home call OutLcdControl movlw B'00101000' ; 5 function set, 4-bit 2-zeilig, 5x7 call OutLcdControl movlw B'00001000' ; 6 display off call OutLcdControl movlw B'00000110' ; 7 entry mode, increment, disable display-shift call OutLcdControl movlw B'00000011' ; 8 cursor home, cursor home call OutLcdControl movlw B'00001111' ; 9 display on call OutLcdControl Vielleicht fällt dem einen oder anderen irgendetwas auf oder hatte ein ähnliches Problem. Danke im Vorraus. MfG Hannes
> movlw B'00101000' ; 5 function set, 4-bit 2-zeilig, 5x7
Ich kenne das Display leider nicht, aber wäre es möglich, dass man das
Ding vielleicht auf "4-zeilig" einstellen muss?
Im Handbuch steht nur was von 2-zeilig, und das ist das 2. Bit neben der ersten 1 (was schon gesetzt ist). Nach Handbuch müsste durch setzen automatisch 4-zeilig gewählt werden. Bei zweizeiligen Displays würden zwei zeilen angezeigt werden, und bei vierzeiligen eben vier (laut Handbuch). Bei einem Vierzeilendisplay kann ich somit zwischen einer Zeile wählen und vier Zeilen. Kann natürlich auch anders sein. Vielleicht besitzt jemand ein vierzeiliges Display von EA. Wie habt ihr dort 4 Zeilen eigestellt? MfG Hannes
Die vierzeiligen Displays haben i.d.R. nur zwei "echte" (logische) Zeilen. Die dritte Zeile ist meist die Fortsetzung der ersten und die vierte eine Fortsetzung der zweiten, was die Adressen der Display-Character angeht.
@johnny.m >Die vierzeiligen Displays haben i.d.R. nur zwei "echte" (logische) >Zeilen. Die dritte Zeile ist meist die Fortsetzung der ersten und die >vierte eine Fortsetzung der zweiten, was die Adressen der >Display-Character angeht. Genau. http://www.zing.com.tw/WINTEK/wm-c1604m.htm MFg Falk
1 | EADIP_init: |
2 | D_cs_LOW ; Chipselect LOW |
3 | ldi r16, 0b11111000 ; Load START-BYTE |
4 | sts LCD_STARTBYTE, r16 ; LCD_STARTBAYTE setzen |
5 | rcall Send_Startbyte ; Startbyte senden |
6 | |
7 | ldi r17, 0b00110100 |
8 | rcall LCD_Send_BYTE |
9 | rcall WAIT_45uS |
10 | |
11 | ldi r17, 0b00001001 |
12 | rcall LCD_Send_BYTE |
13 | rcall WAIT_45uS |
14 | |
15 | ldi r17, 0b00110000 |
16 | rcall LCD_Send_BYTE |
17 | rcall WAIT_45uS |
18 | |
19 | ldi r17, 0b00001100 |
20 | rcall LCD_Send_BYTE |
21 | rcall WAIT_45uS |
22 | |
23 | ldi r17, 0b00000001 |
24 | rcall LCD_Send_BYTE |
25 | rcall WAIT_1600uS |
26 | |
27 | ldi r17, 0b00000110 |
28 | rcall LCD_Send_BYTE |
29 | rcall WAIT_45uS |
30 | |
31 | D_cs_HIGH ; Chipselect HIGH |
32 | |
33 | ret |
Beispiel von einem EA-DIP204. Lg EC
Diese Zeilen
1 | movlw B'00101000' ; 5 function set, 4-bit 2-zeilig, 5x7 |
2 | call OutLcdControl |
betriffen wie von Dir angemerkt "FUNCTION SET". Du musst den VIER-Zeilenmodus im "EXTENDED(!) FUNCTION SET" aktivieren. Geht bei mir so:
1 | ldi r17, 0b00110100 ; 8-Bit Datenlänge, extension Bit RE=1 |
2 | rcall LCD_Send_BYTE |
3 | rcall WAIT_45uS |
4 | |
5 | ldi r17, 0b00001001 ; 4 Zeilen Modus |
6 | rcall LCD_Send_BYTE |
7 | rcall WAIT_45uS |
8 | |
9 | ldi r17, 0b00110000 ; 8-Bit Datenlänge, extension Bit RE=0 |
10 | rcall LCD_Send_BYTE |
11 | rcall WAIT_45uS |
Versuchs mal. LG EC
@ecslowhand: Mein LCD von EA hat leider nur 16 Pins, und die Extended Function kennt er auch nicht. Ich weiß jetzt aber woran es lag. Es war die Verbindung zwischen Testplatine und LCD, die war locker. Trotzdem danke und hier ist der funktionierende init-code: InitLCD movlw D'255' ; 250 ms Pause nach dem Einschalten movwf loops call WAIT movlw B'00110000' ; 1 movwf PORTC bsf PORTC, LcdE nop bcf PORTC, LcdE movlw D'50' ; 50 ms Pause movwf loops call WAIT movlw B'00110000' ; 2 call Control8Bit movlw B'00110000' ; 3 call Control8Bit movlw B'00110000' ; 4 call Control8Bit movlw B'00101000' ; 5 function set, 4-bit 2-zeilig, 5x7 ; call OutLcdControl ; movlw B'00001000' ; 6 display off call OutLcdControl ; movlw B'00000110' ; 7 entry mode, increment, disable display-shift ; call OutLcdControl movlw B'00000011' ; 8 cursor home, cursor home call OutLcdControl movlw B'00001111' ; 9 display on call OutLcdControl movlw B'00000001' ; löschen und cusor home call OutLcdControl return
@Hannes >Ich weiß jetzt aber woran es lag. Es war die Verbindung zwischen >Testplatine und LCD, die war locker. Wackelkontakt. Immer wieder gern genommen . . . ;-) MFG Falk
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.