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 : EditLCD1 /--------------------------------------------\| ;| AUTORE : Giorgio OBER | Tratto da una IDEA di PAOLO RALLO || ;| VERSIONE 1 : marzo 2003 \--------------------------------------------/| ;| /----------\ /-----------------------------------------------------------\| ;| | | |Questa versione di "Edit_LCD" Š adatta solo per Display|| ;| | VERSIONE | |a due linee, con 16 caratteri per linea; e possibile per•|| ;| | BASE | |controllare anche le rimanenti 24 locazioni DDRam e quindi|| ;| | | |potenzialmente editare testi anche con risoluzioni migliori|| ;| \----------/ \-----------------------------------------------------------/| ;| DESCRIZIONE: Programma per il collaudo dell'Interfaccia Software/Hardware| ;| di un Visualizzatore LCD collegato su porta parallela LPT1. | ;| Si tratta di un vero e proprio "Editor" per Display LCD, in| ;| grado di accettare qualunque carattere Ascii e di gestire| ;| i tasti di movimento (le frecce , PgUp, PgDn, Home e End)| ;| per spostare il cursore senza scrivere, e quelli di controllo| ;| come Invio (va a capo linea) e BackSpace (cancella indietro).| ;| consente di commutare il controllo da 16 a 40 caratteri| ;| per riga, e cancella tutto il Display. | ;| /----------\ -------------------------------------------------------------| ;| | | 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 1BH ; Codice Ascii per il tasto Invio EQU 0DH ; BackSp EQU 08H ; Codici di protocollo per la gestione Frec_Su EQU 48H ; del Visualizzatore LCD Frec_Giu EQU 50H ; Frec_Dx EQU 4DH ; Frec_Sn EQU 4BH ; Home EQU 47H ; PgUp EQU 49H ; /-[NB:]-------------------------------\ PgDn EQU 51H ; |esclusi e | End_Fine EQU 4FH ; |sono tutti Tasti Funzionali, cioŠ | Del_Canc EQU 53H ; |caratterizzati da codice Ascii = 00H | F1_ EQU 3BH ; \-------------------------------------/ F2_ EQU 3CH ; ; MACRO UTILIZZATE DAL PROGRAMMA: include c:\arch-lab\bin\GIOBE.MAC M_Cornice MACRO altez,largh,rig,col,colore,ombra,tipo,pagina PUSH SI PUSH CX PUSH AX PUSH BX PUSH DX MOV BH,ombra ;BH=01=con ombreggiatura; BH=00=senza MOV BL,tipo ;BL=01=tratto doppio; BL=00=tratto semplice MOV AH,altez ;AH=altezza in caratteri MOV AL,largh ;AL=larghezza in caratteri MOV DH,rig ;DH=riga MOV DL,col ;DL=colonna MOV CX,pagina ;pagina di salvataggio M_COLOR colore ;colore CALL RamCorn POP DX POP BX POP AX POP CX POP SI ENDM 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 Delay: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 EditLCD1 ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP EditLCD1 ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 0FH OldChr DB ' ' Limite DB 0FFH ;FFH  Limite a 16 caratteri ;00H  Limite a 40 caratteri Posiz DB 00H Titolo DB "Editor per Visualizzatore LCD con eco a Video",00H Intest1 DB "Il controllo del Visualizzatore Š garantito direttamente da Tastiera",00H Intest2 DB "L'azione dei Tasti produce effetto sia sul Display che nell'eco a video",00H Intest3 DB " consente di commutare il controllo da 16 a 40 caratteri per riga",00H Intest4 DB "Le frecce  spostano il cursore; lo forza all'inizio 2ø riga",00H Intest5 DB ", , e spostano il cursore nei quattro angoli",00H Intest6 DB " cancella indietro i testi scritti; cancella tutto il Display",00H Intest7 DB "Se stai lavorando con i Sistemi Operativi Windows 2000, Win NT o WinXP",00H Intest8 DB "devi prima installare e lanciare il Driver Configura_LPT1; scaricalo",00H Intest9 DB "a questo link: http://www.giobe2000.it/consigli/Scarica_VediLPT_XP.htm",00H Displ1 DB "Display Data Random Access Memory (DDram)",00H Displ2 DB "Visualizzatore predisposto per 40 chr/riga",00H Termina DB "Esc per terminare",00H CopyRgh DB "- Copyright (c) 2003 - Giorgio Ober/Paolo Rallo",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 ; RAMrepC 80,' ',20,0,1FH ; M_msgC CopyRgh,20,29,1FH; Barra dei messaggi M_msgC Termina,20, 2,1FH; M_msgC Intest1,2,4,0FH; M_msgC Intest2,3,4,0FH; M_msgC Intest3,5,4,0FH; Messaggi di presentazione M_msgC Intest4,6,4,0FH; M_msgC Intest5,7,4,0FH; M_msgC Intest6,8,4,0FH; M_msgC Intest7,22,4,01H; M_msgC Intest8,23,4,01H; M_msgC Intest9,24,4,01H; M_msgC Displ1,11,21,0FH; M_msgC Displ2,16,21,0FH; M_Colora 5, 5,0EH, 2 ; M_Colora 6,14,0EH, 4 ;  M_Colora 6,41,0EH, 5 ; M_Colora 7, 5,0EH, 4 ; M_Colora 7,13,0EH, 4 ; M_Colora 7,21,0EH, 4 ; Evidenzia alcune parole M_Colora 7,30,0EH, 3 ; M_Colora 8, 5,0EH, 4 ; M_Colora 8,46,0EH, 2 ; M_Colora 20, 2,1EH, 3 ; M_Colora 20,55,1EH,12 ; ..... M_Colora 20,68,1EH,12 ; ...... M_Colora 24,20,03H,23 ; ..... M_Chr '0',16,53,0EH ; ..... ;/--------------------------------\ CALL Displ16 ;| Visualizzatore a 16 caratteri | 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 ;/---------------------------------------------------------------------------\ ;|SERVIZIO : Cursore | ;|DESCRIZIONE: Mette a Video il Cursore "°", provvedendo prima a salvare il| ;| carattere che sar… coperto dalla sua forma | ;\---------------------------------------------------------------------------/ Cursore:PUSH AX CALL RAMcur ; Assume il carattere che sar… coperto MOV AL,ES:[DI] ; direttamente dalla RamVideo, e ne fa copia MOV CS:[OldChr],AL; nella variabile locale [OldChr] M_Chr '°',DH,DL,2AH ; Mostra il cursore sul Display a Video POP AX RET ;/---------------------------------------------------------------------------\ ;|SERVIZIO : Evidenz | ;|DESCRIZIONE: Evidenzia il carattere coperto dal Cursore, invece di coprirlo| ;| con il suo simbolo "°" | ;\---------------------------------------------------------------------------/ Evidenz:PUSH AX CALL RAMcur ; MOV AL,ES:[DI+1] ; Assume l'attributo di colore del carattere OR AL,80H ; che sar… coperto, direttamente in RamVideo MOV ES:[DI+1],AL ; POP AX RET ;/---------------------------------------------------------------------------\ ;|SERVIZIO : Old_Chr | ;|DESCRIZIONE: Ripropone il carattere coperto di volta in volta dal Cursore, | ;| nei casi in cui Š necessario, come dopo la pressione di Invio| ;| o di BackSpace. | ;\---------------------------------------------------------------------------/ Old_Chr:PUSH AX MOV AL,CS:[OldChr]; Assume dalla variabile locale [OldChr] il CALL RAMcur ; carattere coperto in precedenza dal Cursore ° MOV ES:[DI],AL ; e lo rimette al suo posto, in RamVideo POP AX RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : Displ16 | ;|DESCRIZIONE: Indica che la gestione del Visualizzatore Š consentita su 16 | ;| caratteri per riga | ;\---------------------------------------------------------------------------/ ; 21 36 39 62 ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³± Visualizza16 ±³³± Visualizza a 40 ±³ riga 13 ; ³-------16-------³³-----------24-----------³ riga 14 ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ;M_Cornice altez,largh,rig,col,colore,ombra,tipo,pagina ; ombra >> 01=con ombreggiatura, 00=senza ombreggiatura ; tipo >> 00=tratto semplice, 01=tratto doppio Displ16:M_Cornice 4,26,12,38,04H,0,0,1000H ;/--------------------------------\ RAMrepC 24,'°',13,39,08H ;| Visualizzatore a 40 caratteri | RAMrepC 24,'°',14,39,08H ;\--------------------------------/ ; /-------------------------------------------\ ; | Visualizzatore a 16 caratteri | JMP Displ_0 ; \-------------------------------------------/ ; Fissa la Riga e la Colonna iniziale e ; mostra il cursore in quella posizione ;/---------------------------------------------------------------------------\ ;|PROCEDURA : Displ40 | ;|DESCRIZIONE: Indica che la gestione del Visualizzatore Š consentita su 40 | ;| caratteri per riga | ;\---------------------------------------------------------------------------/ ; 21 36 39 62 ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³± Visualizza16 ±³³± Visualizza a 40 ±³ riga 13 ; ³-------16-------³³-----------24-----------³ riga 14 ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Displ40:M_Cornice 4,26,12,38,04H,0,0,1000H ;/--------------------------------\ RAMrepC 24,' ',13,39,22H ;| Visualizzatore a 40 caratteri | RAMrepC 24,' ',14,39,22H ;\--------------------------------/ M_Chr '-',12,36, 04H M_Chr '-',15,36, 04H M_Chr '',12,62,0CFH M_Chr '',15,62,0CFH M_Chr '4',16,52, 0EH M_Chr '0',16,53, 0EH Displ_0:M_Cornice 4,18,12,20,04H,0,0,1000H ;/--------------------------------\ RAMrepC 16,' ',13,21,22H ;| Visualizzatore a 16 caratteri | RAMrepC 16,' ',14,21,22H ;\--------------------------------/ CMP Byte Ptr CS:[Limite],0FFH JE Displ_1 JMP Displ_2 Displ_1:M_Chr '',12,36,0CFH M_Chr '',15,36,0CFH M_Chr '-',12,62, 04H M_Chr '-',15,62, 04H M_Chr '1',16,52, 0EH M_Chr '6',16,53, 0EH Displ_2:MOV DH,13 ; Fissa la Riga e la Colonna iniziale e MOV DL,21 ; mostra il cursore in quella posizione CALL Cursore ; RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : 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 PUSH DX POP DX POP CX POP BX POP AX LOOP del2_ POP CX RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : Delay_ | ;|DESCRIZIONE: Impone un ritardo PORTABILE di 55 millisecondi. | ;\---------------------------------------------------------------------------/ Delay_: PUSH CX PUSH AX MOV CX,1 CALL Delay POP AX POP CX RET ;/---------------------------------------------------------------------------\ ;|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:PUSH DX 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. POP DX 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 0FH # D=1 (bit2) > display acceso | ;| # C=1 (bit1) > cursore visibile | ;| # B=1 (bit0) > a forma lampeggiante | ;| 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,0FH ; display acceso (D=bit2=1), cursore visibile CALL Out_By4 ; (C=bit1=1) e a forma lampeggiante (B=bit0=1); ; il codice operativo Š dunque 0000 1111 (=0FH) ; 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; ; l'istruzione Š del tipo 1xxxxxxx=10000000=80H RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : FissaAdd | ;|DESCRIZIONE: Indirizza la locazione della DDRam (memoria Dati del Display) | ;| che corrispondente alla posizione di stampa corrente, quella | ;| nella quale sar… visibile il cursore, sia sul Visualizzatore | ;| LCD che in quello simulato a video; aggiorna anche il valore | ;| contenuto nella variabile locale che memorizza la posizione. | ;\---------------------------------------------------------------------------/ FissaAdd:CALL Cursore ; Mostra il cursore sul Display a Video ; Predispone la successiva chiamata di Out_By8 FissaAd_: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 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• ; delegata; l'istruzione sar… del tipo 1xxxxxxx ; da 80H (0,0) a A7H (0,39) sulla prima linea RET ; da C0H (1,0) a E7H (1,39) sulla seconda linea ;/---------------------------------------------------------------------------\ ;|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 90H A7Histruzione necessaria ; 00H 0FH 10H 27Hindirizzo DDRam ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³± Visualizza16 ±³³± Visualizza a 40 ±³ riga 13 ; ³-------16-------³³-----------24-----------³ ; ³± Visualizza16 ±³³± Visualizza a 40 ±³ riga 14 ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ; 40H 4FH 50H 67Hindirizzo DDRam ; C0H CFH D0H E7Histruzione necessaria Addr_LCD:MOV AL,CS:[Posiz] ; Assume il valore corrente dell'indirizzo DDRam INC AL ; Incrementa l'indirizzo della locazione DDRam CMP Byte Ptr CS:[Limite],0FFH; FFH  Limite a 16 caratteri JE Addr_L2 ; 00H  Limite a 40 caratteri ;----[Gestione a 40 caratteri]---------------------------------------- CMP AL,28H ; Se la posizione Š in fondo alla prima linea si JE Addr_L0 ; forza il cursore a capo della linea successiva CMP AL,68H ; 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 ; Indirizza la locazione della DDRam (memoria ; Dati del Display) che corrispondente alla ; posizione di stampa corrente, quella nella Addr_L1:CALL FissaAdd ; quale sar… visibile il cursore, sia sul RET ; Visualizzatore LCD che in quello simulato a ; video;aggiorna anche il valore contenuto nella ; variabile locale che memorizza la posizione. ;----[Gestione a 16 caratteri]---------------------------------------- Addr_L2: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 ; ;***************************************************************************** ; ---------------------------------------------- EditLCD1 proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- MOV Byte Ptr CS:[Limite],0FFH;FFH  Limite a 16 caratteri ;00H  Limite a 40 caratteri 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 visibile a forma lampeggiante, ; azzeramento della memoria DDRam, autoincremento ; dell'indirizzo, display bloccato Rientra:CALL KEYwait ;Aspetta decisioni CMP AL,00H ; Si tratta di tasto Funzionale... JE KeyFunz ; Va servito a parte CMP AL,Invio ; JNE Rein_0 ; Servizio per la pressione di JMP Serv_Invio ; Rein_0: CMP AL,BackSp ; JNE Rein_1 ; Servizio per la pressione di JMP Serv_BkSp ; Rein_1: CMP AL,ESC_ ; Servizio per la pressione di JE OUT_ ; ; Servizio per la pressione di un comune tasto JMP Serv_Chr ; Ascii: il carattere corrispondente viene posto ; a video e trasmesso al visualizzatore KeyFunz:CMP AH,F1_ ; JNE KeyFun0 ; Servizio per la pressione di JMP Serv_F1 ; KeyFun0:CMP AH,F2_ ; JNE KeyFun1 ; Servizio per la pressione di JMP Serv_F2 ; KeyFun1:CMP AH,Frec_Su ; JNE KeyFun2 ; Servizio Scorrimento cursore: Freccia  JMP Serv_Up ; KeyFun2:CMP AH,Frec_Giu ; JNE KeyFun3 ; Servizio Scorrimento cursore: Freccia  JMP Serv_Dn ; KeyFun3:CMP AH,Frec_Dx ; JNE KeyFun4 ; Servizio Scorrimento cursore: Freccia  JMP Serv_Dx ; KeyFun4:CMP AH,Frec_Sn ; JNE KeyFun5 ; Servizio Scorrimento cursore: Freccia  JMP Serv_Sn ; KeyFun5:CMP AH,End_Fine ; JNE KeyFun6 ; Servizio Scorrimento cursore: End (=Fine) JMP Serv_End ; KeyFun6:CMP AH,Home ; JNE KeyFun7 ; Servizio Scorrimento cursore: Home JMP Serv_Hom ; KeyFun7:CMP AH,PgDn ; JNE KeyFun8 ; Servizio Scorrimento cursore: PgDn JMP Serv_PD ; KeyFun8:CMP AH,PgUp ; JNE Rientra ; Servizio Scorrimento cursore: PgUp JMP Serv_PU ; ; Predispone le successive chiamate di Out_By8 OUT_: MOV AH,00H ; per provvedere alla scrittura di un comando ; cioŠ a portare il segnale RS=0, istruzione. MOV AL,01H ; Azzera la memoria DDRam (Clear Display ): il CALL Out_By4 ; codice operativo necessario Š 0000 0001 (=01H) ; Inizializza le caratteristiche del display per MOV AL,08H ; display spento (D=bit2=0), cursore invisibile CALL Out_By4 ; (C=bit1=0) e a forma a trattino (B=bit0=0); ; il codice operativo Š dunque 0000 1000 (=08H) _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 ;/---------------------------------------------------------------------------\ ;|SERVIZIO : Serv_Invio | ;|DESCRIZIONE: La pressione del tasto "Invio" sposta la posizione di stampa | ;| per puntare il carattere all'inizio della seconda riga. | ;\---------------------------------------------------------------------------/ Serv_Invio: CALL Old_Chr ; Annulla la visualizzazione del cursore nel ; punto previsito per la stampa corrente MOV DL,21 ; Prepara il puntatore Video a capo linea MOV AL,CS:[Posiz] ; Assume il valore corrente dell'indirizzo DDRam MOV DH,14 ; Prepara il puntatore Video sulla seconda linea MOV AH,40H ; Prepara il puntatore DDRam a inizio 2.da linea CMP AL,27H ; Se la posizione Š sulla prima linea si forza JBE Serv_I ; il cursore a capo della seconda linea ; Altrimenti (posizione sulla seconda linea) si ; forza il cursore a capo della prima linea.... MOV DH,13 ; Prepara il puntatore Video sulla prima linea MOV AH,00H ; Prepara il puntatore DDRam a inizio 1.ma linea ; Indirizza la locazione della DDRam (memoria ; Dati del Display) che corrispondente alla Serv_I: MOV AL,AH ; posizione di stampa corrente, quella nella CALL FissaAdd ; quale sar… visibile il cursore, sia sul ; Visualizzatore LCD che in quello simulato a ; video;aggiorna anche il valore contenuto nella ; variabile locale che memorizza la posizione. JMP Rientra ;/---------------------------------------------------------------------------\ ;|SERVIZIO : Serv_BkSp | ;|DESCRIZIONE: La pressione del tasto "BackSpace" sposta la posizione di| ;| stampa indietro di una posizione, cancellando il carattere| ;| anche nella memoria DDRam del controller LCD | ;\---------------------------------------------------------------------------/ ; 00H 0FH 10H 27Hindirizzo DDRam ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³± Visualizza16 ±³³± Visualizza a 40 ±³ riga 13 ; ³-------16-------³³-----------24-----------³ ; ³± Visualizza16 ±³³± Visualizza a 40 ±³ riga 14 ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ; 40H 4FH 50H 67Hindirizzo DDRam Serv_BkSp: CALL Old_Chr ; Annulla la visualizzazione del cursore nel ; punto previsito per la stampa corrente MOV AL,CS:[Posiz] ; Assume il valore corrente dell'indirizzo DDRam DEC AL ; Decrementa l'indirizzo della locazione DDRam CMP Byte Ptr CS:[Limite],0FFH; FFH  Limite a 16 caratteri JE Back__3 ; 00H  Limite a 40 caratteri ;----[Gestione a 40 caratteri]---------------------------------------- CMP AL,3FH ; Se la posizione Š all'inizio della seconda JE Back__0 ; linea si forza il cursore in fondo alla prima CMP AL,0FFH ; Se la posizione NON Š all'inizio della prima JNE Back___ ; linea si arretra normalmente di un carattere MOV DH,14 ; Prepara il puntatore Video e l'indirizzo MOV DL,63 ; interno della memoria DDRam del controller LCD MOV AL,67H ; all'indirizzo 67H per puntare alla posizione JMP SHORT Back__1 ; dell'ultimo carattere sulla seconda linea Back___:DEC DL ; CMP DL,38 ; Adatta la colonna di stampa ai due campi del JNE Back__2 ; Visualizzatore a video, se necessario SUB DL,2 ; JMP SHORT Back__2 ; Back__0:MOV DH,13 ; Prepara il puntatore Video e l'indirizzo MOV DL,63 ; interno della memoria DDRam del controller LCD MOV AL,27H ; all'indirizzo 27H per puntare alla posizione ; dell'ultimo carattere sulla prima linea Back__1:DEC DL ; Se la posizione NON Š all'inizio di una linea ; si arretra normalmente di un carattere Back__2:PUSH AX ; CALL FissaAd_ ; Cancella il carattere attualmente presente sui MOV AL,' ' ; due Visualizzatori (quello a Video e l'LCD), CALL RAMcur ; Il primo direttamente a Livello RamVideo e il MOV ES:[DI],AL ; secondo predisponendo la chiamata successiva MOV AH,01H ; di Out_By4 per provvedere alla scrittura di un CALL Out_By4 ; carattere (cioŠ per a portare il segnale RS=1) POP AX ; al fine di trasmettere lo spazio al controller ; Indirizza la locazione della DDRam (memoria ; Dati del Display) che corrispondente alla ; posizione di stampa corrente, quella nella CALL FissaAdd ; quale sar… visibile il cursore, sia sul JMP Rientra ; Visualizzatore LCD che in quello simulato a ; video;aggiorna anche il valore contenuto nella ; variabile locale che memorizza la posizione. ;----[Gestione a 16 caratteri]---------------------------------------- Back__3:CMP AL,3FH ; Se la posizione Š all'inizio della seconda JNE Back__4 ; linea si forza il cursore in fondo alla prima MOV DL,37 ; Prepara il puntatore Video e l'indirizzo MOV DH,13 ; interno della memoria DDRam del controller LCD MOV AL,0FH ; all'indirizzo 0FH per puntare alla posizione JMP SHORT Back__1 ; dell'ultimo carattere sulla prima linea Back__4:CMP AL,0FFH ; Se la posizione NON Š all'inizio della prima JNE Back__1 ; linea si arretra normalmente di un carattere MOV DL,37 ; Prepara il puntatore Video e l'indirizzo MOV DH,14 ; interno della memoria DDRam del controller LCD MOV AL,4FH ; all'indirizzo 4FH per puntare alla posizione JMP SHORT Back__1 ; dell'ultimo carattere sulla seconda linea ;/---------------------------------------------------------------------------\ ;|SERVIZIO : Serv_F1 | ;|DESCRIZIONE: Commuta il controllo da 16 a 40 caratteri per riga | ;\---------------------------------------------------------------------------/ Serv_F1:CMP Byte Ptr CS:[Limite],0FFH; FFH  Limite a 16 caratteri JNE Srv_F1 ; 00H  Limite a 40 caratteri MOV Byte Ptr CS:[Limite],00H ;/--------------------------------------\ CALL Displ40 ;| 00H  Visualizzatore a 40 caratteri | JMP SHORT Srv_F_ ;\--------------------------------------/ Srv_F1: MOV Byte Ptr CS:[Limite],0FFH;/--------------------------------------\ CALL Displ16 ;| 0FFH  Visualizzatore a 16 caratteri | JMP SHORT Srv_F_ ;\--------------------------------------/ ;/---------------------------------------------------------------------------\ ;|SERVIZIO : Serv_F2 | ;|DESCRIZIONE: Cancella i caratteri nel Display a Video e fissa il cursore e | ;| anche quelli sul Visualizzatore LCD | ;\---------------------------------------------------------------------------/ Serv_F2:CMP Byte Ptr CS:[Limite],0FFH; FFH  Limite a 16 caratteri JE Srv_F2 ; 00H  Limite a 40 caratteri ;/--------------------------------------\ CALL Displ40 ;| 00H  Visualizzatore a 40 caratteri | JMP SHORT Srv_F_ ;\--------------------------------------/ ;/--------------------------------------\ Srv_F2: CALL Displ16 ;| 0FFH  Visualizzatore a 16 caratteri | ;\--------------------------------------/ Srv_F_: PUSH AX ; Predispone la successiva chiamata di Out_By8 MOV AH,00H ; per provvedere alla scrittura di un comando ; cioŠ a portare il segnale RS=0, istruzione. MOV AL,01H ; Azzera la memoria DDRam (Clear Display ): il CALL Out_By4 ; codice operativo necessario Š 0000 0001 (=01H) MOV CS:[Posiz],AH ; Fissa il cursore nella prima posizione, in POP AX ; alto a sinistra, e istruisce il controller LCD JMP Rientra ;/---------------------------------------------------------------------------\ ;|SERVIZIO : Serv_Chr | ;|DESCRIZIONE: Servizio per la pressione di un qualunque tasto Ascii; il| ;| corrispondente carattere, trovato in ingresso in AL, viene| ;| posto a video nel campo del Visualizzatore e trasmesso al| ;| controller LCD; la posizione di stampa viene aggiornata per| ;| puntare la posizione del carattere successivo, in funzione del| ;| tipo di Visualizzatore, attualmemente in uso. | ;\---------------------------------------------------------------------------/ Serv_Chr:PUSH AX M_Chr AL,DH,DL,2AH ; Stampa il carattere sul Display a Video INC DL ; Incrementa la colonna CMP DL,63 ; Nel caso di Gestione a 40 caratteri si forza JE Serv_C0 ; il cursore a capo linea CMP DL,37 ; Con Gestione a 40 caratteri (Limite=00H) JNE Serv_C1 ; si forza il cursore a capo linea CMP Byte Ptr CS:[Limite],00H; JNE Serv_C0 ; Con Gestione a 40 caratteri MOV DL,39 ; si forza il cursore nel secondo campo JMP SHORT Serv_C1 ; Serv_C0:MOV DL,21 ; Con Gestione a 16 caratteri INC DH ; Fissa il cursore a capo dell'altra linea 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_By8 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 ; puntare il carattere successivo JMP Rientra ;/---------------------------------------------------------------------------\ ;|SERVIZIO : Serv_Sn | ;|DESCRIZIONE: La pressione della Freccia a Sinistra sposta la posizione di| ;| stampa indietro di una posizione | ;\---------------------------------------------------------------------------/ Serv_Sn:CALL Old_Chr ; Annulla la visualizzazione del cursore nel ; punto previsito per la stampa corrente MOV AL,CS:[Posiz] ; Assume il valore corrente dell'indirizzo DDRam DEC AL ; Decrementa l'indirizzo della locazione DDRam CMP Byte Ptr CS:[Limite],0FFH; FFH  Limite a 16 caratteri JE FrSn__3 ; 00H  Limite a 40 caratteri ;----[Gestione a 40 caratteri]---------------------------------------- CMP AL,3FH ; Se la posizione Š all'inizio della seconda JE FrSn__0 ; linea si forza il cursore in fondo alla prima CMP AL,0FFH ; Se la posizione NON Š all'inizio della prima JNE FrSn___ ; linea si arretra normalmente di un carattere MOV DH,14 ; Prepara il puntatore Video e l'indirizzo MOV DL,63 ; interno della memoria DDRam del controller LCD MOV AL,67H ; all'indirizzo 67H per puntare alla posizione JMP SHORT FrSn__1 ; dell'ultimo carattere sulla seconda linea FrSn___:DEC DL ; CMP DL,38 ; Adatta la colonna di stampa ai due campi del JNE FrSn__2 ; Visualizzatore a video, se necessario SUB DL,2 ; JMP SHORT FrSn__2 ; FrSn__0:MOV DH,13 ; Prepara il puntatore Video e l'indirizzo MOV DL,63 ; interno della memoria DDRam del controller LCD MOV AL,27H ; all'indirizzo 27H per puntare alla posizione ; dell'ultimo carattere sulla prima linea FrSn__1:DEC DL ; Se la posizione NON Š all'inizio di una linea ; si arretra normalmente di un carattere ; Indirizza la locazione della DDRam (memoria ; Dati del Display) che corrispondente alla ; posizione di stampa corrente, quella nella FrSn__2:CALL FissaAdd ; quale sar… visibile il cursore, sia sul JMP Rientra ; Visualizzatore LCD che in quello simulato a ; video;aggiorna anche il valore contenuto nella ; variabile locale che memorizza la posizione. ;----[Gestione a 16 caratteri]---------------------------------------- FrSn__3:CMP AL,3FH ; Se la posizione Š all'inizio della seconda JNE FrSn__4 ; linea si forza il cursore in fondo alla prima MOV DL,37 ; Prepara il puntatore Video e l'indirizzo MOV DH,13 ; interno della memoria DDRam del controller LCD MOV AL,0FH ; all'indirizzo 0FH per puntare alla posizione JMP SHORT FrSn__1 ; dell'ultimo carattere sulla prima linea FrSn__4:CMP AL,0FFH ; Se la posizione NON Š all'inizio della prima JNE FrSn__1 ; linea si arretra normalmente di un carattere MOV DL,37 ; Prepara il puntatore Video e l'indirizzo MOV DH,14 ; interno della memoria DDRam del controller LCD MOV AL,4FH ; all'indirizzo 4FH per puntare alla posizione JMP SHORT FrSn__1 ; dell'ultimo carattere sulla seconda linea ;/---------------------------------------------------------------------------\ ;|SERVIZIO : Serv_Dx | ;|DESCRIZIONE: La pressione della Freccia a Destra sposta la posizione di| ;| stampa in avanti di una posizione | ;\---------------------------------------------------------------------------/ Serv_Dx:CALL Old_Chr ; Annulla la visualizzazione del cursore nel ; punto previsito per la stampa corrente MOV AL,CS:[Posiz] ; Assume il valore corrente dell'indirizzo DDRam INC AL ; Decrementa l'indirizzo della locazione DDRam CMP Byte Ptr CS:[Limite],0FFH; FFH  Limite a 16 caratteri JE FrDx__3 ; 00H  Limite a 40 caratteri ;----[Gestione a 40 caratteri]---------------------------------------- CMP AL,68H ; Se la posizione Š alla fine della seconda JE FrDx__0 ; linea si forza il cursore in cima alla prima CMP AL,28H ; Se la posizione NON Š alla fine della prima JNE FrDx___ ; linea si avanza normalmente di un carattere MOV DH,14 ; Prepara il puntatore Video e l'indirizzo MOV DL,20 ; interno della memoria DDRam del controller LCD MOV AL,40H ; all'indirizzo 40H per puntare alla posizione JMP SHORT FrDx__1 ; del primo carattere sulla seconda linea FrDx___:INC DL ; CMP DL,37 ; Adatta la colonna di stampa ai due campi del JNE FrDx__2 ; Visualizzatore a video, se necessario ADD DL,2 ; JMP SHORT FrDx__2 ; FrDx__0:MOV DH,13 ; Prepara il puntatore Video e l'indirizzo MOV DL,20 ; interno della memoria DDRam del controller LCD MOV AL,00H ; all'indirizzo 00H per puntare alla posizione ; del primo carattere sulla prima linea FrDx__1:INC DL ; Se la posizione NON Š all'inizio di una linea ; si avanza normalmente di un carattere ; Indirizza la locazione della DDRam (memoria ; Dati del Display) che corrispondente alla ; posizione di stampa corrente, quella nella FrDx__2:CALL FissaAdd ; quale sar… visibile il cursore, sia sul JMP Rientra ; Visualizzatore LCD che in quello simulato a ; video;aggiorna anche il valore contenuto nella ; variabile locale che memorizza la posizione. ;----[Gestione a 16 caratteri]---------------------------------------- FrDx__3:CMP AL,50H ; Se la posizione Š alla fine della seconda JNE FrDx__4 ; linea si forza il cursore in cima alla prima MOV DL,20 ; Prepara il puntatore Video e l'indirizzo MOV DH,13 ; interno della memoria DDRam del controller LCD MOV AL,00H ; all'indirizzo 00H per puntare alla posizione JMP SHORT FrDx__1 ; del primo carattere sulla prima linea FrDx__4:CMP AL,10H ; Se la posizione NON Š all'inizio della prima JNE FrDx__1 ; linea si avanza normalmente di un carattere MOV DL,20 ; Prepara il puntatore Video e l'indirizzo MOV DH,14 ; interno della memoria DDRam del controller LCD MOV AL,40H ; all'indirizzo 40H per puntare alla posizione JMP SHORT FrDx__1 ; del primo carattere sulla seconda linea ;/---------------------------------------------------------------------------\ ;|SERVIZIO : Serv_Up | ;|DESCRIZIONE: La pressione della Freccia in Alto sposta la posizione di| ;| stampa sulla stessa colonna nella riga superiore; se gi… si| ;| trova in posizione superiore l'azione del tasto non ha effetto| ;\---------------------------------------------------------------------------/ Serv_Up:MOV AL,CS:[Posiz] ; Assume il valore corrente dell'indirizzo DDRam CMP AL,40H ; Se la posizione Š sulla prima linea l'azione JB FrUp__1 ; della pressione del tasto non ha effetto CALL Old_Chr ; Annulla la visualizzazione del cursore nel ; punto previsito per la stampa corrente MOV DH,13 ; MOV DL,21 ; Se la posizione Š sulla seconda linea forza il SUB AL,40H ; cursore nella stessa colonna della linea sopra ADD DL,AL ; FrUp_Dn:CMP Byte Ptr CS:[Limite],0FFH; FFH  Limite a 16 caratteri JE FrUp__0 ; 00H  Limite a 40 caratteri ADD DL,2 ;Nella Gestione a 40 caratteri saltiamo le cornici ; Indirizza la locazione della DDRam (memoria ; Dati del Display) che corrispondente alla ; posizione di stampa corrente, quella nella FrUp__0:CALL FissaAdd ; quale sar… visibile il cursore, sia sul FrUp__1:JMP Rientra ; Visualizzatore LCD che in quello simulato a ; video;aggiorna anche il valore contenuto nella ; variabile locale che memorizza la posizione. ;/---------------------------------------------------------------------------\ ;|SERVIZIO : Serv_Dn | ;|DESCRIZIONE: La pressione della Freccia in Basso sposta la posizione di| ;| stampa sulla stessa colonna nella riga inferiore; se gi… si| ;| trova in posizione inferiore l'azione del tasto non ha effetto| ;\---------------------------------------------------------------------------/ Serv_Dn:MOV AL,CS:[Posiz] ; Assume il valore corrente dell'indirizzo DDRam CMP AL,40H ; Se la posizione Š sulla seconda linea l'azione JGE FrUp__1 ; della pressione del tasto non ha effetto CALL Old_Chr ; Annulla la visualizzazione del cursore nel ; punto previsito per la stampa corrente MOV DH,14 ; MOV DL,21 ; Se la posizione Š sulla prima linea forza il ADD DL,AL ; cursore nella stessa colonna della linea sotto ADD AL,40H ; ; Indirizza la locazione della DDRam (memoria ; Dati del Display) che corrispondente alla ; posizione di stampa corrente, quella nella JMP SHORT FrUp_Dn ; quale sar… visibile il cursore, sia sul ; Visualizzatore LCD che in quello simulato a ; video;aggiorna anche il valore contenuto nella ; variabile locale che memorizza la posizione. ;/---------------------------------------------------------------------------\ ;|SERVIZIO : PgUp | ;|DESCRIZIONE: La pressione di PgUp sposta la posizione di stampa nell'angolo| ;| in alto a destra, sulla riga superiore. | ;\---------------------------------------------------------------------------/ Serv_PU:CALL Old_Chr ; Annulla la visualizzazione del cursore nel ; punto previsito per la stampa corrente MOV DH,13 ; Prepara il puntatore Video sulla linea in alto CMP Byte Ptr CS:[Limite],0FFH; FFH  Limite a 16 caratteri JNE PgUp__0 ; 00H  Limite a 40 caratteri MOV DL,36 ; Prepara il puntatore Video sul carattere in MOV AL,0FH ; alto a destra, sulla prima linea; prepara JMP SHORT PgUp__1 ; anche il puntatore DDRam nello stesso punto PgUp__0:MOV DL,62 ; Prepara il puntatore Video sul carattere in MOV AL,27H ; alto a destra, sulla prima linea; prepara ; anche il puntatore DDRam nello stesso punto ; Indirizza la locazione della DDRam (memoria ; Dati del Display) che corrispondente alla ; posizione di stampa corrente, quella nella PgUp__1:CALL FissaAdd ; quale sar… visibile il cursore, sia sul JMP Rientra ; Visualizzatore LCD che in quello simulato a ; video;aggiorna anche il valore contenuto nella ; variabile locale che memorizza la posizione. ;/---------------------------------------------------------------------------\ ;|SERVIZIO : PgDn | ;|DESCRIZIONE: La pressione di PgDn sposta la posizione di stampa nell'angolo| ;| in basso a destra, sulla riga inferiore. | ;\---------------------------------------------------------------------------/ Serv_PD:CALL Old_Chr ; Annulla la visualizzazione del cursore nel ; punto previsito per la stampa corrente MOV DH,14 ; Prepara il puntatore Video sulla linea in basso CMP Byte Ptr CS:[Limite],0FFH; FFH  Limite a 16 caratteri JNE PgDn__0 ; 00H  Limite a 40 caratteri MOV DL,36 ; Prepara il puntatore Video sul carattere in MOV AL,4FH ; basso a destra, sulla seconda linea; prepara JMP SHORT PgDn__1 ; anche il puntatore DDRam nello stesso punto PgDn__0:MOV DL,62 ; Prepara il puntatore Video sul carattere in MOV AL,67H ; basso a destra, sulla seconda linea; prepara ; anche il puntatore DDRam nello stesso punto ; Indirizza la locazione della DDRam (memoria ; Dati del Display) che corrispondente alla ; posizione di stampa corrente, quella nella PgDn__1:CALL FissaAdd ; quale sar… visibile il cursore, sia sul JMP Rientra ; Visualizzatore LCD che in quello simulato a ; video;aggiorna anche il valore contenuto nella ; variabile locale che memorizza la posizione. ;/---------------------------------------------------------------------------\ ;|SERVIZIO : Home | ;|DESCRIZIONE: La pressione di PgUp sposta la posizione di stampa nell'angolo| ;| in alto a sinistra, sulla riga superiore. | ;\---------------------------------------------------------------------------/ Serv_Hom:CALL Old_Chr ; Annulla la visualizzazione del cursore nel ; punto previsito per la stampa corrente MOV DH,13 ; Prepara il puntatore Video sul carattere in MOV DL,21 ; alto a sinistra, sulla prima linea; prepara MOV AL,00H ; anche il puntatore DDRam nello stesso punto ; Indirizza la locazione della DDRam (memoria ; Dati del Display) che corrispondente alla ; posizione di stampa corrente, quella nella CALL FissaAdd ; quale sar… visibile il cursore, sia sul JMP Rientra ; Visualizzatore LCD che in quello simulato a ; video;aggiorna anche il valore contenuto nella ; variabile locale che memorizza la posizione. ;/---------------------------------------------------------------------------\ ;|SERVIZIO : End | ;|DESCRIZIONE: La pressione di PgDn sposta la posizione di stampa nell'angolo| ;| in basso a sinistra, sulla riga inferiore. | ;\---------------------------------------------------------------------------/ Serv_End:CALL Old_Chr ; Annulla la visualizzazione del cursore nel ; punto previsito per la stampa corrente MOV DH,14 ; Prepara il puntatore Video sul carattere in MOV DL,21 ; basso a sinistra, sulla seconda linea; prepara MOV AL,40H ; anche il puntatore DDRam nello stesso punto ; Indirizza la locazione della DDRam (memoria ; Dati del Display) che corrispondente alla ; posizione di stampa corrente, quella nella CALL FissaAdd ; quale sar… visibile il cursore, sia sul JMP Rientra ; Visualizzatore LCD che in quello simulato a ; video;aggiorna anche il valore contenuto nella ; variabile locale che memorizza la posizione. EditLCD1 ENDP ; Chiusura della Procedura "Main Program" _prog ENDS ; Chiusura del Segmento di CODICE END INIZIO ; Indirizzo dell'ultima istruzione da compilare