Routine per Sgs ST6x10/20 by
Scrivere una stringa su display alfanumerico
Questa routine di scrittura sul display alfanumerico
dello standard Hitachi HD44780A a 14 pin, richiede il collegamento tra ST6 e
modulo, come da schema elettrico richiamabile cliccando sull'immagine.
Come si vede dallo schema, gli 8 bit data del micro non sono collegati direttamente al
display ma vi giungono tramite un 4094, uno shift register convertitore
seriale/parallelo.
Ho scelto questa soluzione poiche' il MCU ST6x10/20 dispone di pochi I/O
e, collegando direttamente micro e display, sarebbero stati necessari ben
10 Inp/Out su 12 disponibili. Viceversa questa soluzione mi permette di
risparmiare 5 Inp/Out utlizzabili per altre funzioni.
Se nella preparazione del circuito stampato vi fosse piu' comodo utilizzare
altri pin che non quelli richiamati dallo schema elettrico, ricordate di
apportare i cambiamenti anche nella stesura del programma.
Per prelevare l'assembler dalla pagina WEB vi consiglio di salvare la
medesima come .TXT quindi con un qualunque editor provvedere all'espianto.
; -----------------------------------------------------------------
; Scrittura su Display alfanumerico per chip HD44780A e compatibii
; *********** By tore Gennaio 2001 ***********
; -----------------------------------------------------------------
; ----------------------------------------
; sezione variabili (084H ..0BFH)
; ----------------------------------------
TX_BYTE .DEF 084H ; Byte da inviare al display
; ----------------------
; Sezione costanti
; ----------------------
R_S .EQU 0 ; Output Bit 0 porta B: Select Register
ENABLE .EQU 1 ; Output bit 1 porta B: Strobe Display
LATCH_4094 .EQU 2 ; Output bit 2 porta B: LATCH per il 4094
DATA_4094 .EQU 3 ; Output bit 3 porta B: DATA per il 4094
CLOCK_4094 .EQU 4 ; Output bit 4 porta B: CLOCK per il 4094
CLEAR .EQU 1 ; Cancella il modulo
HOME .EQU 2 ; A capo
RIGHT_CUR .EQU 6 ; Spostamento a destra del cursore
LEFT_CUR .EQU 4 ; Spostamento a sinistra del cursore
SHIFT_CUR_R .EQU 7 ; Shift a destra della visualizzazione
DISP_ON .EQU 14 ; Display acceso
DISP_OFF .EQU 8 ; Display spento
BLINK .EQU 9 ; Cursore lampeggiante
INIT_HD .EQU 60 ; Inizializzazione del modulo
; ------------------------------
; Inizializzazione del display
; ------------------------------
; L'invio dei seguenti codici servono per l'inizializzazione
; del modulo display LCD basato sul chip della HITACHI HD44780A
INIT:
LDI WDOG,0FEH ; carico il watchdog
LDI A,56 ; Abilito gli 8 bit
CALL SEND_CHAR ; invia il dato al display
LDI A,12 ; Display ON / Blink sotto al cursore
CALL SEND_CHAR ; invia il dato al display
LDI A,2 ; Cursore a capo (in alto a sinistra)
CALL SEND_CHAR ; invia il dato al display
LDI A,1 ; Cancella il display
CALL SEND_CHAR ; invia il dato al display
; ------------------------------
; Scrivi un testo sulle 2 righe
; ------------------------------
LDI DRWR,THE_BEST.W ; Puntatore sulla stringa
LDI X,THE_BEST.D ; (X) punta alla stringa
CALL WRITE_2_LINE ; Scrivi sulle 2 righe
RET
; La prima riga deve terminare con un uguale "="
; Mentre la seconda termina con il dollaro "$"
WRITE_2_LINE:
CALL UPPER_LINE ; scrivi sulla riga superiore
KG1: LDI WDOG,0FEH ; watchdog
LD A,(X) ; preleva i caratteri della prima stringa
CPI A,'$' ; se trovi il dollaro la stringa e' finita
JRZ KG3 ; se trovi l'uguale
CPI A,'=' ; predisponi la scrittura
JRNZ KG2 ; per la riga inferiore
CALL BOTTOM_LINE ;
INC X ;
JP KG1 ;
KG2: CALL SEND_CHAR ; invia il carattere alla routine
INC X ; di visualizzazione
JP KG1 ; -----------------------------------
KG3: RET
; -----------------------------------
; Routine invio data al DISPLAY
; -----------------------------------
SEND_CHAR:
LDI W,8 ; ---------------------------
KL1: LDI WDOG,0FEH ;
SLA A ;
LD TX_BYTE,A ; Questa e' la routine di invio dati
LD A,DRB ; seriale per il modulo LCD tramite
JRC KL2 ; l'integrato CD 4094
RES DATA_4094,A ; I bit passano attraverso il carry
JP KL3 ; e a seconda che quest'ultimo
KL2: SET DATA_4094,A ; sia alto o basso, il bit data viene
KL3: LD DRB,A ; settato o resettato
SET CLOCK_4094,A ;
LD DRB,A ; Successivamente viene dato un'impulso
RES CLOCK_4094,A ; positivo al clock per shiftare il bit.
LD DRB,A ;
DEC W ;
LD A,W ; Shiftati tutti gli 8 bit nel 4094
JRZ KL4 ; viene dato un'impulso positivo
LD A,TX_BYTE ; al LATCH per presentare sulla uscita
JP KL1 ; parallela gli 8 bit
KL4: LD A,DRB ;
SET LATCH_4094,A ;
LD DRB,A ;
RES LATCH_4094,A ;
LD DRB,A ;
CALL DELAY ; Infine viene dato un'impulso positivo
SET ENABLE,A ; sul ENABLE del modulo LCD perche' venga
LD DRB,A ; accettato il dato presente sgli 8 bit
CALL DELAY ;
RES ENABLE,A ;
LD DRB,A
RET
DELAY:
LDI A,50 ; ---------------------------
KL5: LDI WDOG,0FEH ;
DEC A ; ritardo di 1 millisecondo
JRNZ KL5 ;
LD A,DRB ; ---------------------------
RET
; ---------------------------
; Comandi per il display
; ---------------------------
CLS:
LDI A,CLEAR ; cancella lo schermo
JP KM1
UPPER_LINE:
LDI A,HOME ; vai a capo della prima linea
JP KM1
BOTTOM_LINE:
LDI A,192 ; vai a capo della seconda linea
KM1: RES R_S,DRB ; il registro low per i comandi
CALL SEND_CHAR ; invia il dato
SET R_S,DRB ; il registro high per la scrittura
RET
; -------------------------------------------------------------
; Stringhe posizionate fuori dal programma
;
; L'indirizzo effettivo del byte da leggere nella ROM
; e' nei 6 bit bassi del registro DRWR + i 3 bit alti
; del registro X utilizzato come puntatore indiretto
; della memoria con i comandi LDI DRWR,LABEL.W
; LDI X,LABEL.D
; .BLOCK 64-$%64 Questa istruzione deve essere inserita
; prima della label. La stringa o le stringhe
; devono contenere un massimo di 64 caratteri
; -------------------------------------------------------------
.ORG 0D00H
.BLOCK 64-$%64
THE_BEST
.ASCII " -> By Tore <- = Gennaio 2001 $"