Routine per Sgs ST6x10/20

by

Chessa Salvatore


Scrivere una stringa su display alfanumerico



Schema elettrico

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  $"

 

Home