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 : LCD1 | ;| AUTORE : RALLO PAOLO | ;| VERSIONE : marzo 2003 | ;| DESCRIZIONE: Programma per il collaudo dell'Interfaccia Software/Hardware| ;| di un Visualizzatore LCD collegato su porta parallela LPT1. | ;| /----------\ -------------------------------------------------------------| ;| | | 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 ;Codici di protocollo x la gestione LCD RETURN EQU 0DH BACK EQU 08H SPACE EQU 20H SU EQU 48H GIU EQU 50H DESTRA EQU 4DH ;AL = 00H SINISTRA EQU 4BH FINE EQU 4FH CANC EQU 53H F1_ EQU 3BH ; MACRO UTILIZZATE DAL PROGRAMMA: include c:\arch-lab\bin\GIOBE.MAC M_TAB MACRO testo,colore,col,rig PUSH SI PUSH CX PUSH AX PUSH BX PUSH DX LEA SI,testo MOV AH,colore MOV DH,rig MOV DL,col MOV BL,DL CALL TAB POP DX POP BX POP AX POP CX POP SI ENDM M_Ramcur MACRO colo,riga PUSH DX MOV DH,riga MOV DL,colo CALL RAMcur POP DX ENDM M_Copy MACRO pagina0,agir,annoloc,quanto PUSH DX MOV DH,agir MOV DL,annoloc MOV BX,pagina0 MOV CX,quanto CALL Copy_r POP DX ENDM M_RECOPY_R MACRO pagina1,pagina2,aagir,aannoloc,quanta PUSH DX PUSH AX PUSH BX MOV DH,aagir MOV DL,aannoloc MOV AX,pagina2 MOV BX,pagina1 MOV CX,quanta CALL RECopy_r POP BX POP AX POP DX 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 STAsp:NEAR EXTRN Acapo:NEAR EXTRN BIOScls:NEAR EXTRN BIOchr1:NEAR EXTRN BIObeep:NEAR EXTRN BIOSmsg:NEAR ; DICHIARAZIONI (VARIABILI) PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB ;Attributo di colore ; DICHIARAZIONI (PROCEDURE) PER I PROGRAMMI ESTERNI: PUBLIC LCDasm ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP LCDasm ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 0000H CONTA DB 01H CODICE DB 00H LIMITE DB 00H POSIZ DB 00H LCD DB "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿",00H ;16 DB "³ ³",00H DB "³ ³",00H DB "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ",01H MEMI DB "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿",00H ;24 DB "³ ³",00H DB "³ ³",00H DB "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ",01H INTER DB "°°°°°°°°°°°°°°°°",00H INTER1 DB "°°°°°°°°°°°°°°°°°°°°°°°°",00H TESTO DB "MEMORIA VIDEO",00H DB " DD ram ",01H TESTO1 DB "MEMORIA INTERNA",00H DB " DD ram ",01H TESTO2 DB " Interfaccia per la gestione di un display LCD ",00H TESTO3 DB " RALLO PAOLO VøCel ",00H HELP DB "Men— ",00H HELP1 DB "F1",00H COMA DB "ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄ¿",00H DB "³  ³  ³  ³  ³ Canc ³ Fine ³ Backspace ³ Return ³ Space ³ Esc ³",00H DB "ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÙ",01H ;29 ;60 ;66 COMA1 DB "³ ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÄÄÄÁÄÄÄÂÄÄÁÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÙ",00H DB "³ spostati a destra di uno ³ ",00H DB "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ",01H DB "ÃÄÄÄÙ ÀÄÄÄÁÄÄÄÁÄÄÄÄÄÄÁÄÄÄÂÄÄÁÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÙ",00H DB "³ spostati in basso di uno ³ ",00H DB "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ",01H DB "ÃÄÄÄÁÄÄÄÙ ÀÄÄÄÁÄÄÄÄÄÄÁÄÄÂÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÙ",00H DB "³ spostati in alto di uno ³ ",00H DB "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ",01H DB "ÃÄÄÄÁÄÄÄÁÄÄÄÙ ÀÄÄÄÄÄÄÁÄÄÄÄÄÂÁÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÙ",00H DB "³ spostati a sinistra di uno ³ ",00H DB "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ",01H DB "ÀÄÄÄÁÄÄÄÅÄÄÄÁÄÄÄÙ ÃÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÙ",00H DB " ³ cancella LCD ³ ",00H DB " ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ",01H DB "ÃÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄ´",00H DB "³ scegli in che memoria lavorare: DDram + DDram o soltanto DDram ³",00H DB "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ",01H DB "ÀÄÄÄÁÄÄÂÁÄÄÄÁÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÙ ÃÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÙ",00H DB " ³ cancella il carattere precedente ³ ",00H DB " ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ",01H DB "ÃÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÂÄÄÄÄÄÁÄÄÄÄÄÙ",00H DB "³ il cursore si sposta all'inizio della seconda riga ³ ",00H DB "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ",01H DB "ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ ÃÄÄÄÄÄÙ",00H DB " ³ inserisce uno spazio vuoto ³ ",00H DB " ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ",01H DB "ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÁÄÂÄÄÄÄÄÄÁÄÄÄÄÄÄÄÙ ³",00H DB " ³ Esci dal programma ³",00H DB " ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ",01H,03H COPY DB "Copyright (c) Rallo Paolo",00H PAUSA DB "!!!!!!!!!ATTENDI!!!!!!!!!",01H ;AREA DESTINATA ALLE PROCEDURE DEL PROGRAMMA ;----------------------------------------------------------------------------- DESKTOP:CALL BIOScls CALL VIA_cur MOV AX,0B800H MOV ES,AX M_MSGC TESTO3,0,0,1FH M_MSGC TESTO2,1,0,1FH M_TAB TESTO,0FH,22,10 M_TAB TESTO1,0FH,44,10 M_TAB LCD,04H,20,12 M_TAB MEMI,04H,38,12 M_MSGC INTER,13,21,01H M_MSGC INTER1,13,39,01H M_MSGC INTER,14,21,01H M_MSGC INTER1,14,39,01H M_MSGC COPY,24,54,0FH M_MSGC HELP,3,0,0FH M_MSGC HELP1,3,7,0AH M_CURSOR 4,0 ;;;;;;;;;;;;;;; CALL CARICA MOV AX,00H MOV BX,AX CALL SET_DYS CALL RICARICA MOV DH,13 MOV DL,21 CALL EVI RET CARICA: M_TAB PAUSA,40H,29,20 M_COPY 0BA00H,15,29,15 RET RICARICA:M_RECOPY_R 0B800H,0BA00H,20,29,25 RET RAMCUR: PUSH AX PUSH DX ADD DL,DL MOV AL,160 MUL DH MOV DH,00H ADD AX,DX MOV DI,AX POP DX POP AX RET TAB: MOV AL,CS:[SI] CMP AL,00H JNE TAB1 INC DH MOV DL,BL INC SI JMP SHORT TAB TAB1: CMP AL,01H JE TAB0 CALL RAMcur MOV ES:[DI],AX INC SI INC DL JMP SHORT TAB TAB0: RET ;Il ritardo generato di circa 1 ms dipende dalla frequenza del processore Delay__: PUSH CX MOV CX,0000H Del: PUSH AX PUSH BX PUSH CX PUSH DX POP DX POP CX POP BX POP AX LOOP Del POP CX RET ;/---------------------------------------------------------------------------\ ;| SERVIZIO < CANC > Cancella display | ;\---------------------------------------------------------------------------/ CANC0: CMP LIMITE,0FFH JNE CANC1 M_MSGC INTER,14,21,01H M_MSGC INTER,13,21,01H JMP SHORT CANC2 CANC1: M_MSGC INTER1,13,39,01H M_MSGC INTER1,14,39,01H M_MSGC INTER,14,21,01H M_MSGC INTER,13,21,01H CANC2: MOV DL,21 MOV DH,13 CALL EVI CALL CLEAR RET ;/---------------------------------------------------------------------------\ ;| SERVIZIO < BACKSPACE > Cancella il carattere precedente | ;\---------------------------------------------------------------------------/ BACKS: CMP DL,21 JE BAC0 MOV BL,62 CMP LIMITE,0FFH JNE BAC11 MOV BL,36 BAC11: CMP DL,BL JNE BAC2 CALL DEVI CALL RAMCUR MOV AL,ES:[DI] MOV Byte Ptr ES:[DI],'°' SUB DI,2 MOV ES:[DI],AL JMP SHORT BAC23 BAC2: CALL DEVI PUSH DX BAC21: CALL GESTLIM MOV AL,ES:[DI] PUSH DX DEC DL CALL GESTLIM MOV ES:[DI],AL POP DX CMP DL,BL JE BAC22 INC DL JMP SHORT BAC21 BAC22: CALL RAMCUR MOV Byte Ptr ES:[DI],'°' POP DX BAC23: DEC DL CALL EVI CALL CARICA CALL BACKS_D CALL RICARICA BAC0: RET ;/---------------------------------------------------------------------------\ ;| SERVIZIO < SPACE > Aggiunge uno spazio | ;\---------------------------------------------------------------------------/ SPAZIO: MOV AL,'°' CALL CARAT INC DL CALL EVI CALL SPAZIO_ RET ;/---------------------------------------------------------------------------\ ;| SERVIZIO < ,,, > Scorrimento cursore | ;\---------------------------------------------------------------------------/ FRECCE: CALL DEVI ;mi muovo sul LCD con il cursore cambiando solo CMP AH,SU ;il colore degli altri caratteri JNE F1 CALL CURS_UP DEC DH JMP SHORT F4 F1: CMP AH,GIU JNE F2 CALL CURS_DW INC DH JMP SHORT F4 F2: CMP AH,DESTRA JNE F3 INC DL CALL CURS_DX JMP SHORT F4 F3: CMP AH,SINISTRA JNE F4 DEC DL CALL CURS_SX F4: CALL EVI RET ;/---------------------------------------------------------------------------\ ;| SERVIZIO Return | ;\---------------------------------------------------------------------------/ RETU: CALL DEVI MOV DL,21 MOV DH,14 CALL EVI CALL RETURN_ RET ;/-----------------------------------------------------------------------------\ ;| SERVIZIO Definisce il limite della Memoria Video e/o Memoria Interna | ;\-----------------------------------------------------------------------------/ FIN: CMP LIMITE,0FFH JNE FIN1 ;SI=00H  SI=FFH MOV LIMITE,00H ;SI=FFH  SI=00H JMP FIN0 FIN1: MOV LIMITE,0FFH M_MSGC INTER1,14,39,08H M_MSGC INTER1,13,39,08H JMP SHORT FIN2 FIN0: M_MSGC INTER1,13,39,01H M_MSGC INTER1,14,39,01H FIN2: M_CURSOR 4,0 ;;;;;;;;;;;;;;; RET ;/---------------------------------------------------------------------------\ ;| SERVIZIO Stampa a video di un carattere | ;\---------------------------------------------------------------------------/ GESTLIM:CMP LIMITE,0FFH ; SI=FFH  DDRAM JNE C1 ; SI=00H  LIMITI CALL DDRAM JMP C0 C1: CALL LIMITI C0: RET CARAT: CALL GESTLIM ;stampa il carattere e lo trasmette MOV AH,01H ;ed evidenzia la nuova posizione MOV ES:[DI],AX RET EVI: PUSH DI ;evidenzia il carattere cambiando il colore CALL GESTLIM ;e controlla i limiti x non uscire INC DI MOV Byte Ptr ES:[DI],1EH POP DI RET DEVI: PUSH AX CALL GESTLIM INC DI MOV Byte Ptr ES:[DI],01H POP AX RET ;/---------------------------------------------------------------------------\ ;| SERVIZIO Definisce i limiti di DDram e/o DDram (DL=col DH=rig) | ;\---------------------------------------------------------------------------/ ; 21 36 39 62 ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; 00H ³ DDram ³³ DDram ³ 13 40 28H ; 64 40H ³ ³³ ³ 14 104 68H ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ LIMITI: CMP DL,20 ;se DL=20  DL=62 JNE L1 ;se DH=12  DH=14 MOV DL,62 ;se DH=15  DH=13 CMP DH,14 JNE L8 ;se DL=63  DL=21 DEC DH ;se DH=12  DH=14 JMP SHORT L1 ;se DH=115  DH=13 L8: INC DH L1: CMP DL,63 JNE L2 MOV DL,21 CMP DH,14 JNE L7 DEC DH JMP SHORT L2 L7: INC DH L2: CMP DL,37 JNE L3 MOV DL,39 L3: CMP DL,38 JNE L4 MOV DL,36 L4: CMP DH,12 JNE L5 MOV DH,14 L5: CMP DH,15 JNE L6 MOV DH,13 L6: CALL RAMcur RET DDRAM: CMP DL,20 ;se DL=20  DL=36 JNE D1 ;se DH=12  DH=14 MOV DL,36 ;se DH=15  DH=13 CMP DH,14 JNE D8 ;se DL=37  DL=21 DEC DH ;se DH=12  DH=14 JMP SHORT D1 ;se DH=15  DH=13 D8: INC DH D1: CMP DL,37 JNE D2 MOV DL,21 CMP DH,12 JNE D7 DEC DH JMP SHORT D2 D7: INC DH D2: CMP DH,12 JNE D5 MOV DH,14 D5: CMP DH,15 JNE D6 MOV DH,13 D6: CALL RAMcur RET ;/---------------------------------------------------------------------------\ ;| SERVIZIO < ESC > USCIRE | ;\---------------------------------------------------------------------------/ ESCI: CALL EXIT MOV AL,00H MOV BL,AL CALL PARAL_0378H CALL PARAL_037AH PUSH AX CALL RIP_cur MOV DH,23 MOV DL,0 CALL SET_cur POP AX MOV AH,4CH INT 21H RET ;/---------------------------------------------------------------------------\ ;| SERVIZIO < F1 > Men— | ;\---------------------------------------------------------------------------/ Menu: M_COPY 0B900H,3,0,480 M_TAB COMA,0FH,7,3 M_COPY 0BA00H,5,0,240 M_TAB COMA1,0FH,7,5 PUSH AX PUSH BX PUSH DX LEA SI,COMA1 MOV AH,0FH MOV DH,5 MOV DL,7 MOV BL,DL CALL TAB POP DX POP BX POP AX MOV DL,8 CALL COLORA TASMEN: CALL KEYWAIT CMP AL,ESC_ JE G0 CMP AL,00H JNE TASMEN GEST: CMP AH,DESTRA JNE G0 INC CONTA M_RECOPY_R 0B800H,0BA00H,5,0,240 PUSH AX PUSH BX PUSH DX INC SI CMP Byte Ptr CS:[SI],03H JNE G1 LEA SI,COMA1 MOV CONTA,01H G1: MOV AH,0FH MOV DH,5 MOV DL,7 MOV BL,DL CALL TAB POP DX POP BX POP AX CALL DECOLOR INC DL CMP DL,67 JNA G MOV DL,8 G: CALL COLORA G0: CMP AL,ESC_ JE M0 CMP AH,SINISTRA JNE TASMEN DEC CONTA CMP CONTA,00H JNE G2 LEA SI,COMA1 ADD SI,1809 MOV CONTA,0AH JMP SHORT G3 G2: SUB SI,401 G3: PUSH AX PUSH BX PUSH DX M_RECOPY_R 0B800H,0BA00H,5,0,240 MOV AH,0FH MOV DH,5 MOV DL,7 MOV BL,DL CALL TAB POP DX POP BX POP AX CALL DECOLOR CALL SCALA CALL COLORA JMP TASMEN M0: M_RECOPY_R 0B800H,0B900H,3,0,480 MOV CONTA,01H RET Copy_r: CALL RAMcur MOV AX,ES:[DI] PUSH ES MOV ES,BX MOV ES:[DI],AX POP ES INC DL CMP DL,80 JNE C_3 MOV DL,0 INC DH C_3: LOOP Copy_r RET RECopy_r: MOV ES,AX C_2: CALL RAMcur MOV AX,ES:[DI] PUSH ES MOV ES,BX MOV ES:[DI],AX POP ES INC DL CMP DL,80 JNE C_4 MOV DL,0 INC DH C_4: LOOP C_2 MOV AX,0B800H MOV ES,AX RET COLORA: PUSH AX MOV DH,4 MOV BL,DL COLO1: CALL RAMCUR MOV AH,2FH MOV AL,ES:[DI] CMP AL,'|' JE COL INC DI MOV ES:[DI],AH INC DL JMP SHORT COLO1 COL: POP AX RET DECOLOR:PUSH AX MOV DL,BL MOV DH,4 DCOLO1: CALL RAMCUR MOV AH,0FH MOV AL,ES:[DI] CMP AL,'|' JE DCOL INC DI MOV ES:[DI],AH INC DL JMP SHORT DCOLO1 DCOL: POP AX RET SCALA: MOV DL,BL SUB DL,2 CMP DL,8 JNB SCALA0 MOV DL,67 SCALA0: MOV DH,4 CALL RAMCUR MOV AL,ES:[DI] CMP AL,'|' JE SCALA1 DEC DL JMP SHORT SCALA0 SCALA1: INC DL RET ;/---------------------------------------------------------------------------\ ;| Registro Out della parallela | ;\---------------------------------------------------------------------------/ PARAL_0378H: PUSH DX MOV DX,0378H OUT DX,AL POP DX RET PARAL_037AH: PUSH DX PUSH AX MOV DX,037AH MOV AL,BL OUT DX,AL POP AX POP DX RET ;/---------------------------------------------------------------------------\ ;| PROCEDURE PER GESTIRE IL DISPLAY LCD | ;\---------------------------------------------------------------------------/ OUT_DATO: PUSH AX CALL OUT_DATO4 CALL Delay__ CALL SWAP ;Inverte i nibble per trasmettere tutto il dato CALL OUT_DATO4 CALL Delay__ POP AX RET OUT_DATO4: PUSH AX PUSH BX ;Parte alta del dato da trasmettere CALL PARAL_0378H MOV BH,00H ;Registro 037AH per il controllo del LCD MOV BL,00001011B ;RS=0, R/W=0 (scrittura), E=0 ;bit2 bit0 bit3 CALL PARAL_037AH CMP CODICE,00H JE OUT0 OR BL,00000100B ;RS alto solo se la la CODICE Š a 0FFH CALL PARAL_037AH OUT0: ;se CODICE=0FFH, RS=1 trasmette un carattere NOP ;se CODICE=00H , RS=0 trasmette un codice AND BL,11110111B ;E alto: modifico il bit3 per trasmettere CALL PARAL_037AH ; il dato NOP NOP NOP OR BL,00001000B CALL PARAL_037AH NOP POP BX POP AX RET SWAP: MOV AH,AL AND AL,0F0H AND AH,0FH SHR AL,1 SHR AL,1 SHR AL,1 SHR AL,1 SHL AH,1 SHL AH,1 SHL AH,1 SHL AH,1 OR AL,AH RET SET_DYS:CALL Delay__ ;Attesa prima di iniziare MOV CODICE,00H ;il dato da trasmettere Š un codice MOV CX,3 SET_D1: MOV AL,00110000B ;8 bit 1 riga matrice 5*7 CALL OUT_DATO4 CALL Delay__ LOOP SET_D1 MOV AL,00100000B ;4 bit 1 riga matrice 5*7 CALL OUT_DATO4 CALL Delay__ ;E' stato usato OUT_DATO4 perchŠ la parte ;bassa Š 00H MOV AL,00101000B ;4 bit 2 riga matrice 5*7 CALL OUT_DATO MOV AL,00001000B ;Display OFF CALL OUT_DATO CALL CLEAR MOV AL,00000110B ;Incrementa il cursore senza shift automatico CALL OUT_DATO MOV AL,00001101B ;Display ON cursore pieno lampeggiante CALL OUT_DATO MOV AL,00010100B ;Muove cursore *******1 CALL OUT_DATO CALL CLEAR RET CLEAR: PUSH AX MOV CODICE,00H MOV AL,00000001B ;Clear display CALL OUT_DATO MOV POSIZ,00H POP AX RET SPAZIO_:PUSH AX MOV AL,' ' CALL PRINT_D POP AX RET PRINT_D:MOV CODICE,0FFH CALL OUT_DATO INC POSIZ CALL GEST_D MOV CODICE,00H MOV AL,POSIZ OR AL,80H CALL OUT_DATO RET RETURN_:PUSH AX MOV CODICE,00H MOV AL,11000000B CALL OUT_DATO MOV POSIZ,40H POP AX RET EXIT: MOV CODICE,00H MOV AL,00001000B CALL OUT_DATO RET LIM_DC: CMP POSIZ,28H JNE LIM_DC1 MOV POSIZ,40H JMP SHORT LIM_DC4 LIM_DC1:CMP POSIZ,68H JNE LIM_DC2 MOV POSIZ,00H JMP SHORT LIM_DC4 LIM_DC2:CMP POSIZ,0FFH JNE LIM_DC3 MOV POSIZ,67H JMP SHORT LIM_DC4 LIM_DC3:CMP POSIZ,3FH JNE LIM_DC4 MOV POSIZ,27H LIM_DC4:RET LIM_D: CMP POSIZ,10H JNE LIM_1 MOV POSIZ,40H JMP SHORT LIM_4 LIM_1: CMP POSIZ,50H JNE LIM_2 MOV POSIZ,00H JMP SHORT LIM_4 LIM_2: CMP POSIZ,0FFH JNE LIM_3 MOV POSIZ,4FH JMP SHORT LIM_4 LIM_3: CMP POSIZ,3FH JNE LIM_4 MOV POSIZ,0FH LIM_4: RET GEST_D: CMP LIMITE,00H JNE GESTD_1 CALL LIM_DC JMP SHORT GESTD_2 GESTD_1:CALL LIM_D GESTD_2:RET CURS_SX:PUSH AX MOV CODICE,00H DEC POSIZ CALL GEST_D MOV AL,POSIZ OR AL,80H CALL OUT_DATO POP AX RET CURS_DX:PUSH AX MOV CODICE,00H INC POSIZ CALL GEST_D MOV AL,POSIZ OR AL,80H CALL OUT_DATO POP AX RET CURS_UP:PUSH AX MOV CODICE,00H CMP DH,13 JE UP1 SUB POSIZ,40H JMP SHORT UP2 UP1: ADD POSIZ,40H UP2: MOV AL,POSIZ OR AL,80H CALL OUT_DATO POP AX RET CURS_DW:PUSH AX MOV CODICE,00H CMP DH,14 JE DW1 ADD POSIZ,40H JMP SHORT DW2 DW1: SUB POSIZ,40H DW2: MOV AL,POSIZ OR AL,80H CALL OUT_DATO POP AX RET BACKS_D: PUSH DX PUSH AX CALL CURS_SX MOV BL,POSIZ PUSH BX MOV CL,62 CMP LIMITE,0FFH JNE BAD3 MOV CL,36 BAD3: CALL GESTLIM MOV AL,ES:[DI] CMP DL,CL JE BAD5 INC DL CMP AL,'°' JNE BAD2 MOV AL,' ' BAD2: PUSH AX MOV AL,POSIZ INC POSIZ CALL GEST_D OR AL,80H MOV CODICE,00H CALL OUT_DATO POP AX MOV CODICE,0FFH CALL OUT_DATO JMP SHORT BAD3 BAD5: MOV CODICE,0FFH MOV AL,' ' CALL OUT_DATO POP BX MOV POSIZ,BL MOV AL,BL MOV CODICE,00H OR AL,80H CALL OUT_DATO POP AX POP DX RET ;***************************************************************************** ; ---------------------------------------------- LCDasm proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- CALL DESKTOP ;screen Tasto: CALL KEYwait CMP AL,00H JE FUNZ CMP AL,RETURN JNE T3 CALL RETU JMP SHORT Tasto T3: CMP AL,BACK JNE T2 CALL BACKS JMP SHORT Tasto T2: CMP AL,SPACE JNE T4 CALL SPAZIO JMP SHORT Tasto T4: CMP AL,ESC_ JNE T1 CALL ESCI T1: CALL CARAT INC DL CALL EVI MOV AH,00H PUSH DX CALL PRINT_D POP DX JMP SHORT Tasto FUNZ: CMP AH,F1_ JE Menu1 CMP AH,FINE JNE FUNZ1 CALL FIN JMP SHORT Tasto FUNZ1: CMP AH,48H JB FUNZ2 CMP AH,50H JA FUNZ2 CALL FRECCE JMP SHORT Tasto FUNZ2: CMP AH,CANC JNE FUNZ3 CALL CANC0 JMP SHORT Tasto FUNZ3: JMP SHORT Tasto Menu1: PUSH DX PUSH SI CALL Menu POP SI POP DX JMP SHORT Tasto LCDasm ENDP _prog ENDS END INIZIO