PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (marzo 2003) SUBTTL ** TUTORIAL ASSEMBLY -- www.giobe2000.it -- by ing. Giorgio OBER ;/---------------------------------------------------------------------------\ ;| NOME : Gest_LCD | ;| AUTORE : Giorgio OBER | ;| VERSIONE : marzo 2003 | ;| DESCRIZIONE: Programma per il collaudo dell'Interfaccia Software/Hardware| ;| di un Visualizzatore LCD collegato su porta parallela LPT1. | ;| Il programma si limita ad erogare un semplice messaggio su un| ;| Visualizzatore LCD a 16 caratteri per riga, con due righe. | ;| /----------\ -------------------------------------------------------------| ;| | | Se si lavora con i Sistemi Operativi Win2000, Win NT o WinXP | ;| | NB !! | bisogna prima installare il Driver Configura_LPT1; scaricalo | ;| | | a: http://www.giobe2000.it/consigli/Scarica_VediLPT_XP.htm | ;| *----------* -------------------------------------------------------------| ;| | | Se si lavora con i Sistemi Operativi Win2000, Win NT o WinXP | ;| | NB !! | la SHELL DOS deve essere a "Pieno Schermo" (l'esecuzione in | ;| | | "finestra DOS" non produce effetto sul Display LCD) | ;| *----------* -------------------------------------------------------------| ;| | | In ogni caso PRIMA DI OGNI SESSIONE DOS Š necessario eseguire| ;| | NB !! | il programma Config_LPT1.EXE in ambiente Windows per attivare| ;| | | la visibilit… dei driver installati con Configura_LPT1 !!!!! | ;| \----------/ -------------------------------------------------------------| ;\---------------------------------------------------------------------------/ ;/---------------------------------------------------------------------------\ ;| Collegamenti tra Porta Parallela LPT1 e MODULO Visualizzatore LCD | ;*---------------------------------------------------------------------------* ;| (378H)out/bit7 DIRETTO - pin09/PORTA PARALLELA --pin14/LCD Dato7 | ;| (378H)out/bit6 DIRETTO - pin08/PORTA PARALLELA --pin13/LCD Dato6 | ;| (378H)out/bit5 DIRETTO - pin07/PORTA PARALLELA --pin12/LCD Dato5 | ;| (378H)out/bit4 DIRETTO - pin06/PORTA PARALLELA --pin11/LCD Dato4 | ;| pin10/LCD n.c. | ;| pin09/LCD n.c. | ;| pin08/LCD n.c. | ;| pin07/LCD n.c. | ;| (37AH)out/bit0 NEGATO - pin01/PORTA PARALLELA --pin05/LCD R/W | ;| (37AH)out/bit3 NEGATO - pin17/PORTA PARALLELA --pin06/LCD E | ;| (37AH)out/bit2 DIRETTO - pin16/PORTA PARALLELA --pin04/LCD RS | ;| GND - pin18/PORTA PARALLELA -*pin03/LCD GND | ;| | pin02/LCD Vcc +5V | ;| \pin01/LCD GND | ;\---------------------------------------------------------------------------/ ; COSTANTI DEFINITE PER IL PROGRAMMA: ESC_ EQU 27 ;codice del tasto ; MACRO UTILIZZATE DAL PROGRAMMA: include c:\arch-lab\bin\GIOBE.MAC M_Colora MACRO rig,col,colore,numero Ram_cur rig,col MOV CX,numero MOV AL,colore CALL CambiaAtr ENDM ; LIBRERIA UTILIZZATA DAL PROGRAMMA [opzione WinASM altrimenti non necessaria] includelib c:\arch-lab\bin\GIOBE.LIB ;PROCEDURE ESTERNE UTILIZZATE dal PROGRAMMA [NEAR, dalla LIBRERIA ~GIOBE.LIB~] ;----------------------------------------------------------------------------- EXTRN CambiaCol:NEAR EXTRN SET_cur:NEAR EXTRN VIA_cur:NEAR EXTRN RIP_cur:NEAR EXTRN KEYwait:NEAR EXTRN BIOchr1:NEAR EXTRN BIObeep:NEAR EXTRN BIOSmsg:NEAR EXTRN Byt2Asc:NEAR EXTRN RAMcls:NEAR EXTRN RAMpiu:NEAR EXTRN RAMcur:NEAR EXTRN RAMcorn:NEAR ; DICHIARAZIONI (VARIABILI) PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB ;Attributo di colore ; DICHIARAZIONI (PROCEDURE) PER I PROGRAMMI ESTERNI: PUBLIC Gest_LCD ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP Gest_LCD ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 00H Posiz DB 00H Titolo DB "Collaudo e gestione di un Modulo Display LCD",00H Avviso1 DB "Se stai lavorando con i Sistemi Operativi Windows 2000, Win NT o WinXP",00H Avviso2 DB "devi prima installare e lanciare il Driver Configura_LPT1; scaricalo",00H Avviso3 DB "a questo link: http://www.giobe2000.it/consigli/Scarica_VediLPT_XP.htm",00H Termina DB "Esc per terminare",00H CopyRgh DB "Copyright (c) 2003 - Giorgio Ober",00H TxtLCD DB " Giobe2000 " DB " Benvenuti! ",00H ;AREA DESTINATA ALLE PROCEDURE DEL PROGRAMMA ;/---------------------------------------------------------------------------\ ;|PROCEDURA : DeskTop | ;|DESCRIZIONE: Procedura che inizializza completamente il piano di lavoro.| ;\---------------------------------------------------------------------------/ DeskTop:CALL RAMcls ;Pulisce lo schermo e inizializza il segmento ;dedicato alla RamVideo (ES=0B800H) CALL VIA_cur RAMrepC 80,' ',0,0,1FH ; Barra del Titolo M_msgC Titolo,0,15,1FH ; M_msgC Avviso1, 4,4,0FH; M_msgC Avviso2, 5,4,0FH; Messaggi Avviso M_msgC Avviso3, 6,4,0FH; ÿ RAMrepC 80,' ',24,0,1FH ; M_msgC CopyRgh,24,45,1FH; Barra dei messaggi M_msgC Termina,24, 2,1FH; M_Colora 24, 2,1EH, 3 ; Evidenzia alcune parole M_Colora 24,66,1EH,12 ; ..... M_Colora 5,42,0EH,22 ; ..... M_Colora 6,20,0EH,23 ; ..... MOV BH,00H ;BH=01=con ombreggiatura; BH=00=senza MOV BL,00H ;BL=01=tratto doppio; BL=00=tratto semplice MOV AH,4 ;AH=altezza in caratteri MOV AL,18 ;AL=larghezza in caratteri MOV DH,12 ;DH=riga MOV DL,32 ;DL=colonna MOV CX,1000H ;pagina di salvataggio M_COLOR 04H ;colore ; 33 48 CALL RamCorn ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ RAMrepC 16,' ',13,33,22H ; ³± Visualizza16 ±³ riga 13 RAMrepC 16,' ',14,33,22H ; ³-------16-------³ ; ³± Visualizza16 ±³ riga 14 RET ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ;/---------------------------------------------------------------------------\ ;|PROCEDURA : CambiaAtr | ;|DESCRIZIONE: Cambia il colore dei CX caratteri consecutivi puntati in| ;| ingresso da DH (riga),DL (colonna) con quello passato in AL. | ;\---------------------------------------------------------------------------/ CambiaAtr:INC DI Cambia_:MOV ES:[DI],AL ADD DI,2 LOOP Cambia_ RET ;/---------------------------------------------------------------------------\ ;| NOME : Delay | ;| DESCRIZIONE : Il ritardo prodotto Š legato dalla velocit… del processore | ;| perch‚ utilizza le un ciclo di istruzioni.. Š di circa 1 ms | ;\---------------------------------------------------------------------------/ Delay: PUSH CX MOV CX,0000H ;65536 del2_: PUSH AX ; PUSH BX ; PUSH CX ; PoichŠ non Š possibile generare ritardi PUSH DX ; "portabili" cos piccoli, regola il tempo POP DX ; inserendo o togliendo una o pi— coppie di POP CX ; PUSH/POP POP BX ; POP AX ; LOOP del2_ POP CX RET ;/---------------------------------------------------------------------------\ ;|SERVIZIO : Sta_Chr | ;|DESCRIZIONE: Servizio per visualizzazione del carattere passato in ingresso| ;| in AL; esso Š posto a video nella posizione di stampa corrente| ;| sul Visualizzatore e trasmesso al controller LCD; la posizione| ;| di stampa viene aggiornata per puntare a quella del carattere| ;| successivo. | ;\---------------------------------------------------------------------------/ ; 33 48 ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³± Visualizza16 ±³ riga 13 ; ³-------16-------³ ; ³± Visualizza16 ±³ riga 14 ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Sta_Chr:PUSH AX M_Chr AL,DH,DL,2AH ; Stampa il carattere sul Display a Video INC DL ; Incrementa la colonna CMP DL,49 ; se NON si supera l'ultima colonna della riga JNE Serv_C1 ; video corrente si prosegue stampando sulla ; stessa riga corrente MOV DL,33 ; Altrimenti si forza il cursore a capo della INC DH ; linea opposta a quella che si sta lasciando.. CMP DH,15 ; (rileva automaticamente se quella superiore JNZ Serv_C1 ; o se quella inferiore) MOV DH,13 ; Serv_C1:POP AX ; Predispone la successiva chiamata di Out_By4 MOV AH,01H ; per provvedere alla scrittura di un carattere ; cioŠ a portare il segnale RS=1, carattere CALL Out_By4 ; Trasmette al controller LCD il carattere in AL CALL Addr_LCD ; (RS=1) e aggiorna la posizione del cursore per RET ; puntare il carattere successivo ;/---------------------------------------------------------------------------\ ;|PROCEDURA : Addr_LCD | ;|DESCRIZIONE: Predispone l'indirizzo del carattere da visualizzare sull'LCD;| ;| in pratica ci• significa indirizzare locazione della DDRam| ;| (memoria Dati del Display) che corrispondente alla posizione| ;| desiderata; poichŠ le locazioni sono 80, per indirizzarle sono| ;| sufficienti 7 bit (2^7=128), visto che 6 (2^6=64) non sono| ;| sufficienti. | ;| Dunque non tutte le 128 combinazioni sono necessarie | ;| E' comunque chiaro che il controller HD44780 Š in grado di| ;| immagazzinare pi— caratteri di quanti il visualizzatore possa| ;| mostrare; per esempio, quelli ad 1 linea gestiscono fino a 40| ;| caratteri, per cui solo una met… [da 0 (00H) a 39 (27H)] delle| ;| locazioni Š copiata sul display; la rimanente met… pu• per•| ;| essere fatta scorrere nelle medesime 40 posizioni del Display,| ;| con le istruzioni descritte in precedenza... | ;| In conclusione: | ;| 1) con visualizzatori ad 1 linea (N=0) gli indirizzi possibili| ;| vanno da 00H (=0, comando 80H) a 4FH (=79, comando CFH) | ;| 2) con visualizzatori ad 2 linee (N=1) gli indirizzi: | ;| della 1.ma vanno da 00H (=0, add 80H) a 27H(= 39, add A7H)| ;| della 2.da vanno da 40H (=64, add C0H) a 67H(=103, add E7H)| ;\---------------------------------------------------------------------------/ ; 80H 8FH istruzione necessaria ; 00H 0FH indirizzo DDRam ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³± Visualizza16 ±³ riga 13 ; ³-------16-------³ ; ³± Visualizza16 ±³ riga 14 ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ; 40H 4FH indirizzo DDRam ; C0H CFH istruzione necessaria Addr_LCD:MOV AL,CS:[Posiz] ; Assume il valore corrente dell'indirizzo DDRam INC AL ; Incrementa l'indirizzo della locazione DDRam CMP AL,10H ; Se la posizione Š in fondo alla prima linea si JE Addr_L0 ; forza il cursore a capo della linea successiva CMP AL,50H ; JNE Addr_L1 ; Se la posizione Š in fondo alla seconda linea MOV AL,00H ; si forza il cursore a capo della prima linea JMP SHORT Addr_L1 ; ; ; Fissa l'indirizzo interno della memoria DDRam Addr_L0:MOV AL,40H ; del controller LCD per puntare l'indirizzo 40H ; corrispondente alla posizione del primo carat- ; tere sulla seconda linea ; Predispone la successiva chiamata di Out_By8 Addr_L1: MOV AH,00H ; per provvedere alla scrittura di un comando ; cioŠ a portare il segnale RS=0, istruzione. ; Annota la posizione corrente del cursore nella Addr_L2:MOV CS:[Posiz],AL ; memoria DDRam e ricostruisce l'istruzione per OR AL,80H ; per il controller LCD, forzando (con la OR) il CALL Out_By4 ; bit7 a 1, come prevede l'istruzione a ci• RET ; delegata; l'istruzione sar… del tipo 1xxxxxxx ; da 80H (0,0) a A7H (0,39) sulla prima linea ; da C0H (1,0) a E7H (1,39) sulla seconda linea ;/---------------------------------------------------------------------------\ ;|PROCEDURA : Out_By8 | ;|DESCRIZIONE: In ingresso AL deve essere predisposto con il byte esadeci-| ;| male da spedire al controller HD 44780, attraverso il regi-| ;| stro di dato (0378H) della porta parallela. | ;| Il valore presisposto in AH serve per predisporre il segnale| ;| RS a 0 (AH=00H) se il byte da scrivere Š un codice operativo| ;| (istruzione) o RS a 1 (AH=01H) se invece deve essere scritto| ;| un carattere (dato). | ;| La procedura ricostruisce la sequenza temporale richiesta| ;| sui segnali RS, R/W e ENABLE del controller HD 44780 del| ;| modulo visualizzatore, assicurando le condizioni ideali per| ;| l'output verso il modulo LCD, con l'aiuto del registro di| ;| controllo (037AH) della porta parallela. | ;| /----------\ I bit3 e bit0 della porta di controllo della parallela | ;| | NB | (037AH) sono invertiti internamente e vanno riportati al | ;| \----------/ loro valore naturale (di nuovo invertiti) da software !! | ;| /----------\ Questa procedura organizza la gestione dei dati verso il | ;| | NB | mudulo visualizzatore con INTERFACCIA A 8 BIT !! | ;| \----------/ | ;\---------------------------------------------------------------------------/ ; -\ /-------------------\ /---- ; SCRITTURA Carattere (RS=1) DATA / dato o istruzione / ; o -/ \-------------------/ \---- ; SCRITTURA Istruzione (RS=0) ENABLE /---\ ; ------/ \----------------- ; WRITE ; ------------------------------ Out_By8:PUSH DX MOV BL,AL ; Salva il valore del byte (dato o istruzione) ;/-[ segnali ]-*-[bit del registro 037AH]-*-byte\ ;|    |b3/neg b2/dir b1 b0/neg|  | MOV AL,00001011B ;| E RS x R/W | EN_ RS xx R/W_|  | ;| 0 0 x 0 | 1 0 1 1 | 0BH | ;\-OUT ISTRUZ--*-------VALORE in AL-------*--AL-/ CMP AH,00H ; AH=00H  RS0 da scrivere codice operativo JE Out_By0 ; AH=01H  RS1 da scrivere carattere (dato) ;/-[ segnali ]-*-[bit del registro 037AH]-*-byte\ ;|    |b3/neg b2/dir b1 b0/neg|  | MOV AL,00001111B ;| E RS x R/W | EN_ RS xx R/W_|  | ;| 0 1 x 0 | 1 1 1 1 | 0FH | ;\-OUT CARATT--*-------VALORE in AL-------*--AL-/ Out_By0:MOV DX,037AH ; Forza i segnali Enable, RS e R/W ai livelli OUT DX,AL ; desiderati (0 , 1, 0) tramite il Registro di ; Controllo della parallela, 037AH CALL Delay ; Ritardo Tas (Address Setup Time, almeno 60 ns ; prima di riportare alto il segnale Enable) PUSH AX ; Salva il valore di AH (dato o istruzione) MOV AL,BL ; Prepara per tempo il byte (dato o istruzione) MOV DX,0378H ; sul bus dati del controller (via parallela) OUT DX,AL ; POP AX ; Recupera il valore di AH (dato o istruzione) ;/-[ segnali ]-*-[registro 037AH]-\Forza a "1" ;|    | b3 b2 b1 b0 |il segnale AND AL,11110111B ;| E RS x R/W | EN_ RS xx R/W_ |Enable (cioŠ ;| 1 inalterati| 0 inalterati |bit3 a "0") ;\-OUT ISTRUZ--*--VALORE in AL----/ MOV DX,037AH ; Forza i segnali Enable, RS e R/W ai livelli OUT DX,AL ; desiderati (1 , 1, 0) tramite il Registro di ; Controllo della parallela, 037AH CALL Delay ; Ritardo Tw (Enable Pulse Width, al minimo 450 ; ns prima di riportare basso il segnale Enable) ;/-[ segnali ]-*-[registro 037AH]-\Forza a "0" ;|    | b3 b2 b1 b0 |il segnale OR AL,00001000B ;| E RS x R/W | EN_ RS xx R/W_ |Enable (cioŠ ;| 0 inalterati| 1 inalterati |bit3 a "1") ;\-OUT ISTRUZ--*--VALORE in AL----/ ; Forza i segnali Enable, RS e R/W ai livelli ; desiderati (0 , 1, 0) tramite il Registro di ; Controllo della parallela, 037AH; il byte OUT DX,AL ; presente sul bus dati viene scritto sul fronte ; di discesa di E [si da per scontato che esso ; sia presente sul bus almeno 195 ns (Tds, Data ; Setup Time) prima che E torni a '0' ; Ritardo Th/Tah: il dato deve essere mantenuto ; sul bus almeno altri 10 ns (Th, Data Hold Time) ; dopo che il segnale Enable Š tornato basso. CALL Delay ; Non appena il segnale di abilitazione Enable ; viene riportato a '0' devono passare almeno 20 ; ns (Tah, Address Hold Time) prima di rilasciare ; i segnali RS e R/W; MOV AL,BL ; Lascia in uscita (in AL) il valore del byte ; (dato o istruzione) appena messo sull'LCD POP DX RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : Out_By4 | ;|DESCRIZIONE: In ingresso AL deve essere predisposto con il byte esadeci-| ;| male da spedire al controller HD 44780, attraverso il regi-| ;| stro di dato (0378H) della porta parallela. | ;| RS a 0 (AH=00H) se il byte da scrivere Š un codice operativo| ;| (istruzione) o RS a 1 (AH=01H) se invece deve essere scritto| ;| un carattere (dato). | ;| La procedura ricostruisce la sequenza temporale richiesta| ;| sui segnali RS, R/W e ENABLE del controller HD 44780 del| ;| modulo visualizzatore, assicurando le condizioni ideali per| ;| l'output verso il modulo LCD, con l'aiuto del registro di| ;| controllo (037AH) della porta parallela. | ;| /----------\ I bit3 e bit0 della porta di controllo della parallela | ;| | NB | (037AH) sono invertiti internamente e vanno riportati al | ;| \----------/ loro valore naturale (di nuovo invertiti) da software !! | ;| /----------\ Questa procedura organizza la gestione dei dati verso il | ;| | NB | mudulo visualizzatore con INTERFACCIA A 4 BIT !! (di fatto | ;| \----------/ il byte da scrivere viene proposto sul bau in due tempi). | ;\---------------------------------------------------------------------------/ Out_By4:CALL Out_By8 ;Scrive il nibble alto (D7-D4) del dato o istruz. SHL AL,1 ; Sposta i quattro bit meno significativi del SHL AL,1 ; byte da scrivere al posto di quelli pi— SHL AL,1 ; significativi di AL SHL AL,1 ; CALL Out_By8 ;Scrive il nibble basso (D3-D0) del dato o istruz. RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : Pre_Ini | ;|DESCRIZIONE: Inizializza il controller HD 44780, simulando l'attivazione | ;| della linea di RESET; vengono erogati tre bytes a 30H | ;| separati da piccoli ritardi pesati; per default viene | ;| predisposta l'interfaccia a 8 bit, senza curarsi, per ora, | ;| della forma del visualizzatore e della matrice del carattere| ;\---------------------------------------------------------------------------/ Pre_Ini:MOV CX,15 ; Pre_0: CALL Delay ; Ritardo iniziale di 15 ms (con Vcc=5V) LOOP Pre_0 ; ; Predispone le successive chiamate di Out_By8 MOV AH,00H ; per provvedere alla scrittura di un comando ; cioŠ a portare il segnale RS=0, istruzione. ; Predispone l'interfaccia a 8 bit senza curarsi ; della forma del visualizzatore e della matrice MOV AL,30H ; del carattere; il codice operativo pu• essere CALL Out_By8 ; dunque ambiguo su tutti i quattro bit meno si- ; gnificativi, cioŠ sar… del tipo 0011 xxxx ; 30H=0011 00xxB interfaccia a 8 bit MOV CX,5 ; Pre_1: CALL Delay ; Ulteriore ritardo di 4,1 ms LOOP Pre_1 ; ; Ripete la predisposizione dell'interfaccia a 8 MOV AL,30H ; bit, ancora in modo ambiguo su tutti i quattro CALL Out_By8 ; bit meno significativi: va bene ancora il ; codice operativo 30H=0011 00xxB ; Ritardo finale di 0,1 ms, incluso nell'esecu- ; zione della procedura appena eseguita MOV AL,30H ; Ripete per la terza volta la predisposizione CALL Out_By8 ; "ambigua" dell'interfaccia a 8 bit; il codice ; operativo sar… ancora 30H=0011 00xxB RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : Mia_Ini | ;|DESCRIZIONE: Predispone il controller HD 44780 per gestire il visualizza-| ;| tore nel modo operativo desiderato, comunque con interfaccia| ;| a 4 bit: | ;| Cancella Display 00000001 01H Azzera la memoria DDRam (Clear Display) | ;| Accesso Caratteri 000001IS 06H # I=1 (bit1) > autoincrem.indirizzo DDRam| ;| # S=0 (bit0) > display bloccato | ;| Modo del Display 00001DCB 0CH # D=1 (bit2) > display acceso | ;| # C=0 (bit1) > cursore invisibile | ;| # B=0 (bit0) > cursore a forma fissa | ;| Scorrimento Displ 0001SRxx 14H # S/C=0(bit3) > si muove il cursore | ;| # R/L=1(bit2) > verso destra | ;| Parametri 001DNFxx 28H # DL=0(bit4) > interfaccia a 4 bit | ;| # N=1 (bit3) > visualizzatore a 2 linee | ;| # F=0 (bit2) > matrice carattere 5x7 pix | ;\---------------------------------------------------------------------------/ Mia_Ini: ; Predispone le successive chiamate di Out_By8 MOV AH,00H ; per provvedere alla scrittura di un comando ; cioŠ a portare il segnale RS=0, istruzione. ; Predispone l'interfaccia a 4 bit senza curarsi ; della forma del visualizzatore e della matrice MOV AL,20H ; del carattere; il codice operativo pu• essere CALL Out_By8 ; dunque ambiguo su tutti i quattro bit meno si- ; gnificativi, cioŠ sar… del tipo 0010 xxxx ; 20H=0010 00xxB interfaccia a 4 bit ; Fissa i dettagli dell'interfaccia a 4 bit (DL= ; bit4=0) cominciando da ora ad usare la met… MOV AL,28H ; alta del bus dati (cioŠ dando per scontato che CALL Out_By4 ; i bit da BD3 a DB0 non sono pi— disponibili); ; si impone: visualizzatore a 2 linee (N=bit3=1) ; e matrice carattere con 5x7 pixel (F=bit2= 0); ; il codice operativo Š dunque 0010 10xx (=28H) MOV AL,01H ; Azzera la memoria DDRam (Clear Display ): il CALL Out_By4 ; codice operativo necessario Š 0000 0001 (=01H) ; Fissa il modo di gestire il display: con auto- MOV AL,06H ; incremento dell'indirizzo DDRam e del cursore CALL Out_By4 ; (I=bit1=1) e con display bloccato (S=bit0=0); ; il codice operativo Š dunque 0000 0110 (=06H) ; Inizializza le caratteristiche del display per MOV AL,0CH ; display acceso (D=bit2=1), cursore invisibile CALL Out_By4 ; (C=bit1=0) e a forma fissa (B=bit0=0); ; il codice operativo Š dunque 0000 1100 (=0CH) ; Inizializza lo scorrimento sul display: fissa MOV AL,14H ; il movimento del cursore (S/C=bit3=0) e verso CALL Out_By4 ; destra (R/L=bit2=1); il codice operativo Š ; dunque 0001 01xx (=14H) MOV AL,00H ; Fissa il cursore nella prima posizione, in MOV CS:[Posiz],AL ; alto a sinistra, e istruisce il controller LCD OR AL,80H ; puntando anche la prima locazione della sua CALL Out_By4 ; memoria DDRam, di indirizzo xxxxxxx=0000000; RET ; l'istruzione Š del tipo 1xxxxxxx=10000000=80H ;/---------------------------------------------------------------------------\ ;|PROCEDURA : Giochino | ;|DESCRIZIONE: Esegue un effetto visivo, in attesa di terminare | ;\---------------------------------------------------------------------------/ TabGioc DB 33,13, 80H,48,13, 8FH ; DB 34,13, 81H,47,13, 8EH ; DB 35,13, 82H,46,13, 8DH ; Tabella interna di "Giochino" DB 35,14,0C2H,46,14,0CDH ; DB 34,14,0C1H,47,14,0CEH ; DB 33,14,0C0H,48,14,0CFH ; ;--------------------------------------------------------------------- GiroChr:PUSH AX ;¿ 33 35 46 48 MOV DL,CS:[SI] ;³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ MOV DH,CS:[SI+1] ;³ ³±±±Giobe2000 ±±±³ riga 13 M_Chr AL,DH,DL,2AH ;³ ³±±±Benvenuti!±±±³ riga 14 PUSH AX ;³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ MOV AL,CS:[SI+2] ;³Procedura interna di "Giochino" MOV AH,00H ;³ CALL Out_By4 ;³ 80H 83H 8DH 8FHistruzione necessaria POP AX ;³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ MOV AH,01H ;³ ³±±±Giobe2000 ±±±³ riga 13 CALL Out_By4 ;³ ³±±±Benvenuti!±±±³ riga 14 POP AX ;³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ RET ;Ù C0H C3H CDH CFHistruzione necessaria ;---------------------- ---------------------------------------------- Giochino:MOV CX,6 ; Giochino.... un attesa della pressione LEA SI,TabGioc ; del tasto per terminare............ Gioco1: MOV AL,'*' ; CALL GiroChr ; ADD SI,3 ; CALL GiroChr ; SUB SI,3 ; PUSH CX ; MOV CX,40 ; Gioco2: CALL Delay ; LOOP Gioco2 ; POP CX ; MOV AL,' ' ; CALL GiroChr ; ADD SI,3 ; CALL GiroChr ; ADD SI,3 ; PUSH DX ; PUSH CX ; PUSH SI ; MOV AH,01H ; Controlla se Š premuto un tasto.... INT 16H ; ... se Š cos termina il giochino POP SI ; POP CX ; POP DX ; JNZ Gioco3 ; LOOP Gioco1 ; JMP Giochino ; Gioco3: CALL KEYwait ; Se non Š ESC non si esce !! CMP AL,ESC_ ; JNE Giochino ; RET ; ;***************************************************************************** ; ---------------------------------------------- Gest_LCD proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- MOV Byte Ptr CS:[Posiz],00H;Fissa l'indirizzo iniziale in DDRam (il primo) CALL DESKTOP ;Inizializza completamente il piano di lavoro ; Inizializza il controller HD 44780, simulando ; l'attivazione della linea di RESET; vengono CALL Pre_Ini ; erogati tre bytes a 30H separati da piccoli ; ritardi "pesati"; per default viene ; predisposta l'interfaccia a 8 bit ; Predispone il controller HD 44780 per gestire ; il visualizzatore nel modo operativo desiderato CALL Mia_Ini ; interfaccia a 4 bit, visualizzatore a 2 linee, ; matrice del carattere con 5x7 pixel, display ; acceso, cursore invisibile a forma fissa, ; azzeramento della memoria DDRam,autoincremento ; dell'indirizzo, display bloccato MOV DH,13 ; Fissa la Riga e la Colonna della posizione di MOV DL,33 ; stampa iniziale LEA SI,TxtLCD ; XXX00: MOV AL,CS:[SI] ; Legge e mette a video la frase CMP AL,00H ; " Giobe2000 " JE XXX01 ; " Benvenuti! " CALL Sta_Chr ; INC SI ; JMP SHORT XXX00 ; XXX01: CALL Giochino _OUT: PUSH AX ; Torna al DOS con la memoria liberata e con la CALL RIP_cur ; chiusura di tutti i file; cede il controllo MOV DH,23 ; al processo padre (generalmente COMMAND.COM); MOV DL,0 ; il valore posto eventualmente in AL prima di CALL SET_cur ; uscire pu• essere testato in uscita con la POP AX ; funzione 4DH o mediante la lettura della MOV AH,4CH ; variabile DOS "ERRORLEVEL" INT 21H Gest_LCD ENDP ; Chiusura della Procedura "Main Program" _prog ENDS ; Chiusura del Segmento di CODICE END INIZIO ; Indirizzo dell'ultima istruzione da compilare