========================================================== Tomas Pribyl, Apr 19 1999 14:16:05, Prague, Czech Republic LCD display nel C64 IDE2.1 ========================================================== Questa è la spiegazione su come collegare un LCD display al C64 IDE V2.1 IO bus (SHORT BUS). In futuro verrà fornito pieno supporto all'LCDs nell'IDE software dell'IDE2.1 controller. Usa queste informazioni a tuo rischio, un LCD non connesso correttamente può danneggiare il tuo C64 o IDE2.1 controller o l'LCD. Se hai qualche dubbio, fai riferimento al manuale dell'LCD o scrivi a: dundera@volny.cz Questa descrizione è valida solo per LCD displays con controller HD44780 della HITACHI. Io ho un LCD display L1634 della SEIKO (16 caratteri/4 righe) con LED subilluminazione, ma displays simili possono essere connessi nello stesso modo. Per esempio: ------------ Dalla SHARP LM16A21 - 16 x 2, STN LM16X21A - 16 x 2, STN, LED Dalla PICVUE PVC160101BTN - 16 x 1, TN PVC160203BGN - 16 x 2, STN PVC160401AGN - 16 x 4, STN Dalla ???? MC1601 - 16 x 1 MC1602 - 16 x 2 MC1604 - 16 x 4 Se vuoi connettere un LCD all'IDE2.1 controller, hai bisogno di: - IDE2.1 controller - LCD display basato su controller HD44780 della HITACHI - cavo flat, 34 linee - connettore per ShortBus - resistenza regolata a 5kOhm - per la subilluminazione LCDs resistenza da 100 Ohm (vedi nota 2) Tutti i LCDs hanno una interfaccia veramente semplice. Pin su LCD Connessione allo ShortBus descrizione ============================================================================ 1 - GND 1, 34 - GND Ground (massa) 2 - Vcc 2, 33 - Vcc +5V 3 - Vo vedi nota 1 Voltaggio di Contrasto 4 - RS 32 - A0 Indirizzo bit0 5 - R/W 5 - R/W Segnale Read/Write dal processore 6 - E 6 - CS1 Segnale Chip select, attivo alto 7 - DB0 31 - D0 Data bus, bit 0 8 - DB1 29 - D1 Data bus, bit 1 9 - DB2 27 - D2 Data bus, bit 2 10 - DB3 25 - D3 Data bus, bit 3 11 - DB4 23 - D4 Data bus, bit 4 12 - DB5 21 - D5 Data bus, bit 5 13 - DB6 19 - D6 Data bus, bit 6 14 - DB7 17 - D7 Data bus, bit 7 15 - LED + vedi nota 2 Subilluminazione + 16 - LED - see note 2 Subilluminazione - Nota 1 Voltaggio di contrasto 0 - 5V. Una resistenza tra questo pin e GND può pilotare il contrasto. | Vo - contrasto (pin 3 su LCD) | \ / \<- 5kOhm / | \ | |__| | | GND (pin 1 su LCD) Nota 2 Solo LCDs subilluminati hanno questi pins. Connettere LED - al GND Connettere LED con resistenza (100 ohm) e questa resistenza connessa a Vcc. Il valore della resistenza dipende dalla corrente del LED, fare riferimento al manuale LCD. GND Vcc | | | | | \ | / | \ Resistenza 100 Ohm (vedi Nota 2) | / | \ | | | | LED - LED + Come programmare LCDs, connesso all'IDE2.1 controller: =================================================== I registri LCD sono agli indirizzi $de44 e $de45. $de44 ----- scrittura - registro di accesso comando lettura - registro status $de45 ----- scrittura - memorizza dato lettura - legge dato Segue una lista delle istruzioni del mio LCD display: Write=scrittura Read=lettura Adress=indirizzo Write - $de44 Istruzione D7 D6 D5 D4 D3 D2 D1 D0 ============================================== Display clear 0 0 0 0 0 0 0 1 Cursor home 0 0 0 0 0 0 1 * Entry Mode Set 0 0 0 0 0 1 I/D S Display On/Off 0 0 0 0 1 D C B Curs/Disp shift 0 0 0 1 S/C R/L * * Function Set 0 0 1 DL N F * * CG RAM adr set 0 1 ---------Acg--------- DD RAM adr set 1 -------------Add--------- Read - $de44 Istruzione D7 D6 D5 D4 D3 D2 D1 D0 ============================================== BF/Adress read BF -------------AC----------- Write - $de45 Istruzione D7 D6 D5 D4 D3 D2 D1 D0 ============================================== Write data ------------DATA-------------- Read - $de45 Istruzione D7 D6 D5 D4 D3 D2 D1 D0 ============================================== Read data -------------DATA------------- Legenda: * - bit non valido Acg - CG RAM adress (GENERATORE CARATTERE) Add - DD RAM adress (DATA DISPLAY) AC - contatore adress I/D - 1-incrementa, 0-decrementa S - 1-display shift (scorrimento), 0-no display shift D - 1-display ON, 0-display OFF C - 1-cursore ON, 0-cursore OFF B - 1-blink (lampeggio) ON, 0-blink OFF S/C - 1-display shift, 0-cursore movimento R/L - 1-shift destra, 0-shift sinistra DL - 1-8 bits trasferimento dato, 0-4 bits trasferimento dato N - 1-1/16 duty , 0-1/8 o 1/11 duty F - 1-5x10 matrice punti, 0-5x7 matrice punti BF - 1-operazione interna in progresso, 0-display pronto DISPLAY CLEAR - cancella tutto il display e riporta il cursore nella posizione home (adress 0). Il codice Spazio ($20) viene scritto in tutti gli indirizzi della DD RAM, e l'indirizzo 0 della DD RAM viene settato da AC. Se shiftato, il display ritorna alla posizione originale. Dopo l'esecuzione di questa istruzione (Clear), l'entry mode viene incrementato. Tempo d'esecuzione circa 1.64ms CURSORE HOME - riporta il cursore nella posizione home (adress 0). DD RAM adress 0 è settato a AC. Il cursore torna alla posizione home. Se shiftato, il display ritorna alla posizione originale. Il contenuto della DD RAM non cambia. Se il cursore o blinking (lampeggio) è ON, esso ritorna sul lato sinistro. Tempo d'esecuzione circa 1.64ms ENTRY MODE SET - setta la direzione del movimento cursore e comunque il display verrà shiftato. I/D: L'indirizzo DD RAM viene incrementato o decrementato di uno quando un codice carattere vi viene scritto o letto dalla DD RAM. Questo è vero anche in caso di scrittura o lettura dalla CG RAM. I/D = 1, l'indirizzo viene incrementato di uno e il cursore o blink si sposta a destra. I/D = 0, l'indirizzo viene decrementato di uno e il cursore o blink si sposta a sinistra. S = 1, l'intero display viene shiftato completamente a destra o sinistra per la scrittura nella DD RAM. La posizione del cursore non cambia, solo il display si sposta. Non c'è display shift per lettura dalla DD RAM. Quando S=1 e I/D=1, il display shifts a sinistra. Quando S=1 e I/D=0, il display shifts a destra. S = 0, il display non shifta. DISPLAY CONTROLLO ON/OFF - imposta totalmente il display ed il cursore ON e OFF, e fa iniziare il lampeggio della posizione del cursore. Cursore ON/OFF e lampeggio viene effettuato alla colonna indicata bz allo specifico indirizzo DD RAM da AC. D: D = 1, il display è impostato ON. D = 0, il display è impostato OFF. se D=0 è usato, display data rimane in DD RAM. Cambia da 0 a 1 per display data. C: C = 1, il cursore è visualizzato. C = 0, il cursore non è visualizzato. Il cursore è visualizzato nella linea punto sotto il font carattere. B: B = 1, il carattere alla posizione cursore inizia a lampeggiare. B = 0, non lampeggia. CURSOR/DISPLAY SHIFT (scorrimento) - muove il cursore e shifts il display senza cambiare il contenuto DD RAM. La posizione cursore e il contenuto AC coincidono. Questa istruzione è disponibile per correzione display poichè la posizione cursore o il display possono essere shiftati senza scrivere o leggere i dati display. Se la capacità DD RAM è di 40-caratteri in due linee, il cursore viene shiftato dal digit 40 (DD RAM adress $27) della linea 1 al digit 1 della linea 2. La visualizzazione delle linee 1,2,3 e 4 sono shiftate nello stesso tempo. Il display pattern della linea 1 o 3 non viene shiftato alla linea 2 o 4, e neanche quello della line 2 o 4 non shifta alla linea 1 o 3. S/C R/L Operazione 0 0 La posizione del cursore shifta a sinistra (AC decrementa di uno) 0 1 La posizione del cursore shifta a destra (AC incrementa di uno) 1 0 L'intero display shifta a sinistra del cursore 1 1 L'intero display shifta a destra del cursore (secondo me, questo vale solo per il mio LCD, in altri potrebbe essere differente). FUNCTION SET - setta la lunghezza dell'interface data, il duty ratio, ed il character font. DL: Lunghezza Interface data DL = 1, la lunghezza dato è settata a 8 bits (D7 - D0) DL = 0, la lunghezza dato è settata a 4 bits (D7 - D4) I 4 bits alti vengono trasferiti per primi, poi seguono i 4 bits bassi. N: Duty ratio N = 1, il duty ratio è settato a 1/16. N = 0, il duty ratio è settato a 1/8 o 1/11. (Nel mio L1634 setta N a 1.) F: Character font F = 1, il character font è settato 5x10 dot matrix. F = 0, il character font è settato 5x7 dot matrix. L'istruzione FUNCTION SET deve essere eseguita prima di tutte le altre, eccetto per la lettura del flag/indirizzo Busy.Se un'altra istruzione viene eseguita prima, nessuna istruzione di funzione (ad eccetto del cambiamento lunghezza interfaccia data) può essere eseguita. DD RAM adress nel mio display ----------------------------- left=sinistra right=destra ---------left shift \ | ------no shift DD RAM adress nel lato left LCD | | --right shift / | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Line 1 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F Line 2 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F Line 3 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F Line 4 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F =============================================================================== Segue un esempio su come visualizzare dati nell'LCD display (e contemporaneamente nel C64). Premendo un tasto, si avvierà la visualizzazione. Questo è il codice per il mio LCD, 4 x 16. Se hai un formato differente, dovrai cambiare rawMAX, columnMAX e LINETAB. *=$1000 ;codice per LCD L1634 by Tomas Pribyl, 1999 getin = $ffe4 chrout = $ffd2 lcd_base = $de44 lcd_ir = lcd_base lcd_dr = lcd_base+1 rawMAX = 4 columnMAX = 16 LCDcolumn = $fc LCDraw = $fd ;--------------------------------------------------------------------------- ; ANOMALO CASO DI INIZIALIZZAZIONE ; se la inizializzazione automatica non viene eseguita causa le condizioni di ; alimentazione non soddisfatte, occorrerà ripetere FUNCTION SET per 3 volte. ; lda #$00 sta LCDraw sta LCDcolumn ;cursore posizione (cursore HOME) lda #%00110000 ;function set, 8 bits data transfer sta lcd_ir jsr wait ;aspetta per 4.1ms o più lda #%00110000 ;function set, 8 bits data transfer sta lcd_ir jsr wait ;aspetta per 100us o più lda #%00110000 ;function set, 8 bits data transfer sta lcd_ir jsr wait ;------------------------------------------------------------------------ lda #%00111000 ;function set, 8 bits, duty ratio 16,font sta lcd_ir jsr wait lda #%00001111 ;display on, cursore on, blinking on sta lcd_ir jsr wait_busy ;controlla busy flag lda #%00000001 ;display clear sta lcd_ir jsr set_cursor ;set cursore posizione ldy #$00 prt lda text,y beq wait4key jsr print ;visualizza data su LCD iny jmp prt wait4key jsr getin ;preleva un tasto beq wait4key ;tasto non premuto pha ;memorizza codice tasto jsr chrout ;visualizza nello schermo C64 pla ;recupera codice tasto jsr print ;visualizza nell'LCD jmp wait4key ;aspetta il prossimo tasto ;------------------------------------------------ ; routine di attesa wait ldy #$05 wait2 ldx #$00 wait1 dex bne wait1 dey bne wait2 rts ;------------------------------------------------- ; controlla busy flag wait_busy pha ;salva AC wait_busy1 lda lcd_ir ;legge registro istruzione and #%10000000 ;controlla busy bit bne wait_busy1 pla ;recupera AC rts ;-------------------------------------- ; x-LCD riga da 0 a 3 ; y-LCD colonna da $00 a $0f print cmp #$0d ;controlla NEW LINE beq next_line jsr wait_busy ;aspetta display pronto sta lcd_dr ;salva data inc LCDcolumn ;colonna seguente lda LCDcolumn ;controlla fine colonna cmp #columnMAX bne set_cursor next_line lda #$00 ;setta all'inizio linea sta LCDcolumn inc LCDraw ;prossima riga lda LCDraw cmp #rawMAX ;controlla ultima riga bne set_cursor lda #$00 ;cursore HOME sta LCDraw set_cursor jsr wait_busy ;controlla busy flag ldx LCDraw ;legge RAW (riga) lda LCDcolumn ;legge COLUMN (colonna) ora linetab,x ;converte in istruzione sta lcd_ir ;setta indirizzo posizione rts text .text "THIS IS LCD TEST",$0d,0 linetab .byte %10000000,%11000000,%10010000,%11010000