Questo programma lavora da alcuni anni in una fabbrica, gestisce un dispositivo di allarme che controlla da distante, lo stato di un contatto passo passo. Visualizza la condizione, data e ora su un display 2 x 16 caratteri. Esegue il controllo in riferimento alle fasce orarie lavorative. Fa attirare un relè d'allarme, nel caso il passo passo non fosse nella condizione corretta. Si può manualmente attivare la lettura di dati seriali (RS232) per l'aggiornamento dell'orologio interno. Visto che il programma è completo, con varie gestioni: Timer, seriale, calendario perpetuo, display LCD, conversioni numeriche, ecc. E' di certo utile a livello didattico per capire alcuni dei tanti modi con cui si possono costruire varie routine in assembler 51. ==================================================================== ;PROGRAMMA IN ASSEMBLER 51 DI IK1WJQ - AGGIORNAMENTO FEBBRAIO 2005 ;AT89C2051 CON DISPLAY LCD 2 X 16 COLONNE CONFIG. 4 BIT DATI ;P1.7 - P1.4 DATI 4 BIT, P1.0 CONTROLLO LINEA RELE' PASSO PASSO T.S. ;P1.1 (NON USATO) - P1.2 PULSANTE - P1.3 (NON USATO) ;P3.0 RX DATI SERIALI - P3.1 LED - P3.2 CICALINO ;P3.3 ENB - P3.4 DATI/COMANDO DISPLAY ;P3.5 E P3.7 USCITA RELE' - F0 = 1 RICEZIONE ATTIVA X = OK DATI DTL0 EQU 16 DTH0 EQU 17 MSEC EQU 18 ;1/20 DI SECONDO ORE EQU 19 MIN EQU 20 SEC EQU 21 ANN EQU 22 ;ANNO MES EQU 23 ;MESE GIO EQU 24 ;GIORNO ALL EQU 25 ;STATO ACCENSIONE E ALLARME ATT EQU 26 ;SOMMA ORE MINUTI ALLARME ATTIVO GEN EQU 27 ; 4 BIT BASSI GIORNI - 28 FEB EQU 28 ; 4 BIT ALTI NR GIORNO INIZIO MAR EQU 29 ;LUNEDI = 1 - DOMENICA = 7 APR EQU 30 MAG EQU 31 GIU EQU 32 LUG EQU 33 AGO EQU 34 STT EQU 35 OTT EQU 36 NOV EQU 37 DIC EQU 38 AUS EQU 39 ;AUSILARIO X CALCOLO CALENDARIO DO1 EQU 40 ;COPPIE DOMENICA SABATO SA1 EQU 41 ;NEL MESE MAX 5 DO2 EQU 42 SA2 EQU 43 DO3 EQU 44 SA3 EQU 45 DO4 EQU 46 SA4 EQU 47 DO5 EQU 48 SA5 EQU 49 FMES EQU 50 ;MEMORIA DURATA MESE + 1 MEM EQU 51 ;INIZIO MEMORIA SERIALE 15 BYTE ORG 0000H AJMP INI ORG 000BH ;INT T0 MOV TL0,DTL0 ;20 HZ MOV TH0,DTH0 AJMP OROL ORG 001BH ;INT T1 RETI ORG 0023H ;INT SERIALE CLR RI PUSH ACC MOV ACC,SBUF CLR ACC.7 ;ELIMINA PARITA' CJNE A,#'M',RSA SETB F0 MOV R0,#MEM MOV R7,#15 ;LUNGHEZZA STRINGA RX POP ACC RETI RSA: JNB F0,RITO MOV @R0,ACC ;SCRIVE IN MEMORIA INC R0 ;DIGIT ASCII DJNZ R7,RITO CLR F0 SETB PSW.1 ;RICEZIONE OK RITO: POP ACC RETI INI: MOV P3,#7 ;16+7 - ENB = 0 D/C = 0 MOV P1,#255 MOV SP,#89 ;90 - 127 USO SP MOV PSW,#0 ;BANCO 0 MOV ACC,#255 ;X = 11.059200 CPL A ;T0 = 46800 X 20 HZ MOV DTL0,ACC ;INVERSO IN T0 MOV ACC,#179 CPL A MOV DTH0,ACC MOV SCON,#80 ;8 BIT UART ABILIT. SERIALE MOV PCON,#0 ;VELOCITA' 1/32 CLOCK T1 MOV TMOD,#33 ;T0 = 16 BIT T1 8 BIT AUTORICARICA MOV TH1,#232 ;1200 BIT SEC MOV ALL,#1 ;SET STATO MOV ORE,#0 MOV MIN,#0 MOV SEC,#0 MOV ANN,#0 MOV MSEC,#0 MOV ATT,#0 ACALL RIT1 ;0,2 SEC ACALL ILCD ;INIZIO DISPLAY MOV DPTR,#MSG1 ;CONTROLLO AUTOM. TS ACALL PRINT1 MOV DPTR,#MSG2 ;INIZIO PROGRAMMA ACALL PRINT2 ACALL RIT1 CLR ES ;NO INT SERIALE SETB ET0 ;INT T0 SETB TR1 SETB PT0 ;PRIORITA' T0 SETB EA AGGM: ACALL BIP ;AGGIORNAMENTO MANUALE CLR TR0 ;FERMA T0 MOV DPTR,#MSG10 ;RICEZIONE H:M:S: ACALL PRINT2 SETB ES ;ABILITA INT SERIALE JNB PSW.1,$ ;ASPETTA AGGIORNAMENTO OK CLR ES ;STOP INT SERIALE CLR PSW.1 ;RIF A ZERO ACALL AGGH ;DISPLAY DATA E H:M:S: ACALL PORE ;STAMPA DATA E ORA SETB TR0 ACALL AGG ;CONTROLLO GIORNI FESTIVI CONT: MOV ACC,ORE ;NO CONTROLLO SEGNALE CJNE A,#7,TO1 ;DALLE 7,31 - 7,40 ADD A,MIN ;E 18,01 - 18,10 CLR C MOV B,ACC SUBB A,#48 JNC TO2 MOV ACC,B CLR C SUBB A,#38 JC TO2 AJMP FE7 ;COME 18,02 TO1: CJNE A,#18,TO2 ADD A,MIN CLR C MOV B,ACC SUBB A,#29 JNC TO2 MOV ACC,B CLR C SUBB A,#19 JC TO2 AJMP FE18 ;COME 7,32 TO2: MOV R5,#5 MOV R7,#0 APER: JB P1.0,APEX JNB P1.0,CHIX APEX: ACALL RIT0 DJNZ R7,APER ;APERTO CPL P3.1 ;LAMPEGGIO LED DJNZ R5,APER MOV ACC,ATT CJNE A,#20,CNTA ;SALTA SE SET = GIORNO CLR P3.7 ;ELIMINA DOPO ORE 18,02 AJMP CON2 CHIX: ACALL RIT0 ;CHIUSO RIT 6 SEC DJNZ R7,APER CPL P3.1 ;LAMPEGGIO LED DJNZ R5,APER MOV ACC,ATT CJNE A,#39,CONA ;ALLARME SE NOTTE CLR P3.7 ;ELIMINA DOPO ORE 7,32 AJMP CON2 CNTA: MOV ACC,ALL ;CONTROLLO ALLARME JB ACC.7,CON2 CONA: SETB P3.7 ;ATTIVA ALLARME CON2: ACALL RIT1 ;PER SET ALL JNB P1.2,AAGGM ;CHIAMA AGGIORNAMENTO TEMPO MANUALE JB P1.0,APE1 ;CONTROLLO INGRESSO PER DISPLAY JNB P1.0,CHI1 ;E AGGIORNAMENTO ATT APE1: ACALL RIT1 ;APERTO JB P1.0,APE2 AJMP CONT CHI1: ACALL RIT1 ;CHIUSO JNB P1.0,CHI2 APE2: MOV DPTR,#MSG9 ;STAMPA APERTO ACALL PRINT2 MOV ACC,MIN ;CONTROLLO TEMPO CJNE A,#32,ACONT ADD A,ORE CJNE A,#39,ACONT ;ORE 7,32 MOV ACC,ALL JB ACC.7,ACONT ;NON SETTA ATT CON GIORNO FESTIVO MOV ATT,#39 ;ATT AGGIORNATO ALLE 7,32 AJMP CONT CHI2: MOV DPTR,#MSG8 ;STAMPA CHIUSO ACALL PRINT2 MOV ACC,MIN ;CONTROLLO TEMPO CJNE A,#2,ACONT ADD A,ORE CJNE A,#20,ACONT ;ORE 18,02 MOV ATT,#20 ;ATT AGGIORNATO 18,02 ACONT: AJMP CONT AAGGM: AJMP AGGM FE18: CLR P3.7 ;CHIAMATO ALLE 18,01 MOV ATT,#20 ;COME 18,02 AJMP CONT FE7: CLR P3.7 ;CHIAMATO ALLE 7,31 ACALL SGIO ;ULTIMA VERIFICA ACALL ALRM ACALL SADO ACALL PASQ ;COME 7,32 AJMP CONT TORE: MOV ACC,ALL JB ACC.7,SNO1 ;SALTA SE FESTIVO MOV ACC,ORE ;TEST ORE PER SET STATO CLR C SUBB A,#8 ;ALLARME GIORNO O NOTTE JZ SGIO JC SNOT ;SECONDO I GIORNI FESTIVI MOV ACC,ORE SUBB A,#18 JC SGIO SNOT: MOV ALL,#129 ;FESTIVO COME NOTTE SNO1: MOV ATT,#20 RET SGIO: MOV ALL,#1 ;LAVORATIVO COME GIORNO MOV ATT,#39 RET ALRM: MOV ACC,MES ;CONTROLLO GIORNI FESTIVI CJNE A,#1,AV1 ;SALTA <> GENNAIO MOV ACC,GIO CJNE A,#1,AVX ;1 GENNAIO AJMP SNOT AVX: CJNE A,#6,SGIO ;6 GENNAIO AJMP SNOT AV1: CJNE A,#4,AV2 ;SALTA <> APRILE MOV ACC,GIO CJNE A,#25,SGIO ;25 APRILE AJMP SNOT AV2: CJNE A,#5,AV3 ;SALTA <> MAGGIO MOV ACC,GIO CJNE A,#1,SGIO ;1 MAGGIO AJMP SNOT AV3: CJNE A,#6,AV4 ;2 E 29 GIUGNO MOV ACC,GIO CJNE A,#2,AV3X AJMP SNOT AV3X: CJNE A,#29,SGIO AJMP SNOT AV4: CJNE A,#8,AV5 ;SALTA <> AGOSTO MOV ACC,GIO CJNE A,#15,SGIO ;15 AGOSTO AJMP SNOT AV5: CJNE A,#11,AV6 ;SALTA <> NOVEMBRE MOV ACC,GIO CJNE A,#1,SGIO ;1 NOVEMBRE AJMP SNOT AV6: CJNE A,#12,SGIO ;FINE <> DICEMBRE MOV ACC,GIO CJNE A,#8,AV7 ;8 DICEMBRE AJMP SNOT AV7: CJNE A,#25,AV8 ;25 DICEMBRE AJMP SNOT AV8: CJNE A,#26,SGIO ;26 DICEMBRE AJMP SNOT PAS: RET PASQ: MOV ACC,ANN ;TROVA PASQUETTA CJNE A,#1,PAS2 ;PER OGNI ANNO MOV ACC,MES ;PROG. CHIAMATO INIZIO GIORNO CJNE A,#4,PAS MOV ACC,GIO CJNE A,#16,PAS ;2001 AJMP SNOT PAS2: CJNE A,#2,PAS3 ;2002 MOV ACC,MES CJNE A,#4,PASX MOV ACC,GIO CJNE A,#1,PASX AJMP SNOT PAS3: CJNE A,#3,PAS4 ;2003 MOV ACC,MES CJNE A,#4,PASX MOV ACC,GIO CJNE A,#21,PASX AJMP SNOT PAS4: CJNE A,#4,PAS5 ;2004 MOV ACC,MES CJNE A,#4,PASX MOV ACC,GIO CJNE A,#12,PASX AJMP SNOT PAS5: CJNE A,#5,PAS6 ;2005 MOV ACC,MES CJNE A,#3,PASX MOV ACC,GIO CJNE A,#28,PASX AJMP SNOT PAS6: CJNE A,#6,PAS7 ;2006 MOV ACC,MES CJNE A,#4,PASX MOV ACC,GIO CJNE A,#17,PASX AJMP SNOT PAS7: CJNE A,#7,PAS8 ;2007 MOV ACC,MES CJNE A,#4,PASX MOV ACC,GIO CJNE A,#9,PASX AJMP SNOT PAS8: CJNE A,#8,PAS9 ;2008 MOV ACC,MES CJNE A,#3,PASX MOV ACC,GIO CJNE A,#24,PASX AJMP SNOT PAS9: CJNE A,#9,PASX ;2009 MOV ACC,MES CJNE A,#4,PASX MOV ACC,GIO CJNE A,#13,PASX AJMP SNOT PASX: RET ;NIENTE CONTROLLO RIT0: PUSH ACC ;RITARDO DI 1 MS CLOCK 11,0592 MHZ MOV A,230 PAU: NOP NOP DJNZ ACC,PAU POP ACC RET RITL: PUSH PSW ;RIT X SCRITT.RA LCD SETB PSW.3 ;BANCO 1 60 uSEC MOV R7,#25 DJNZ R7,$ POP PSW RET RIT1: PUSH PSW ;RITARDO 200 * RIT0 SETB PSW.3 MOV R6,#200 PAU2: ACALL RIT0 DJNZ R6,PAU2 POP PSW RET RITH: PUSH PSW ;RITARDO 2 MSEC ANTI STRESS SETB PSW.3 ;DISPLAY MOV R6,#2 AJMP PAU2 LED: CLR P3.1 ;ACCENDE LED ACALL RIT1 SETB P3.1 ;SPEGNE LED RET BIP: PUSH PSW ;0,100 SEC SETB PSW.3 MOV R6,#100 ANL P3,#11111001B PAU3: ACALL RIT0 ;LED E SUONO CONT.RANEO DJNZ R6,PAU3 ORL P3,#00000111B POP PSW AJMP RIT1 OROL: CLR TR0 ;6 CICLI RITARDO X 20 HZ NOP ;= 120 CICLI NOP NOP NOP SETB TR0 PUSH ACC ;SALVA A INC MSEC MOV ACC,MSEC CJNE A,#20,OROX MOV MSEC,#0 INC SEC MOV ACC,SEC CJNE A,#60,FORO MOV SEC,#0 INC MIN MOV ACC,MIN CJNE A,#60,FORO MOV MIN,#0 INC ORE MOV ACC,ORE CJNE A,#24,FORO MOV ORE,#0 INC GIO MOV ACC,GIO CJNE A,FMES,FORK ;CONTROLLO FINE MESE MOV GIO,#1 INC MES ACALL AGG ;AGGIORNA X NUOVO MESE MOV ACC,MES CJNE A,#13,FORO MOV MES,#1 INC ANN FORK: ACALL AGG ;AGGIORNA X ANNO NUOVO E GIORNO FORO: ACALL PORE ;STAMPA DATA ORE MINUTI E SEC OROX: POP ACC ;RIPRENDE A RETI AGG: ACALL ALRM ;AGGIORNAMENTO DI NUOVO ANNO ACALL CALE ;CALENDARIO ACALL SADO ;SABATI E DOMENICHE DEL MESE ACALL PASQ ;CONTROLLO PASQUETTA ACALL TORE ACALL AFME ;AGGIORNA RIF.TO FINE MESE RET ;CALENDARIO PERPETUO CALCOLA INIZIO DI OGNI MESE ;PER OGNI ANNO FINO AL 2009 LUNEDI = 1 DOMENICA = 7 CALE: MOV GEN,#3 ;IMPOSTA GIORNI X - 28 MOV FEB,#0 ;PER I 12 MESI MOV MAR,#3 ;ALL'ACCENSIONE MOV APR,#2 ;DOPO AGG. CALENDARIO MOV MAG,#3 MOV GIU,#2 MOV LUG,#3 MOV AGO,#3 MOV STT,#2 MOV OTT,#3 MOV NOV,#2 MOV DIC,#3 MOV AUS,#2 ;1 = LUNEDI GENNAIO 2001 MOV ACC,ANN DEC ACC JZ AMEX ;SOLO X 2001 MOV R4,ACC AMES: ACALL CMES ;CANCELLA PARTE ALTA MESI ACALL IMES ;CALCOLA INIZIO OGNI MESE DJNZ R4,AMES ;FINO ALL'ANNO IN CORSO AMEX: ACALL NANN ;CALCOLO ANNI BISESTILI ACALL CMES ;ANNO CORRENTE ACALL IMES AJMP MESX ;CHIAMA RICERCA TABELLA SADO: MOV R4,#10 ;NR GIORNI 10 MAX MOV R1,#DO1 ;PUNTA PRIMA DOMENICA SADX: MOV ACC,@R1 ;IN A DATO DI TABELLA JZ SADN ;SE = 0 SALTA CJNE A,GIO,SADN ;CONTROLLA TABELLA AJMP SNOT ;GIORNO FESTIVO TROVATO SADN: INC R1 DJNZ R4,SADX RET IMES: MOV ACC,AUS ;PRIMO GIORNO DI GENNAIO MOV B,ACC MESI: MOV R0,#GEN ;PUNTA MESE GENNAIO MOV R2,#12 ;NR MESI MESE: SWAP A ;METTE SU 4 BIT ALTI ADD A,@R0 MOV @R0,ACC ;SALVA INIZIO MESE BIT ALTI ANL A,#15 ;PRENDE BIT BASSI ADD A,B MOV R3,ACC ;SALVA DATO CLR C SUBB A,#7 JNC MES1 MOV ACC,R3 ;RIPRENDE DATO MES1: JNZ MES2 MOV ACC,#7 MES2: MOV B,ACC INC R0 DJNZ R2,MESE MOV AUS,B ;ULTIMO GIORNO SALVATO RET NANN: MOV ACC,ANN CLR C SUBB A,#8 ;CALCOLO BISESTILE JZ SOM1 ;ANN0 2008 JC NBIS ;DA 2005 A 2007 AJMP SOM2 ;SOLO 2009 NBIS: MOV FEB,#0 RET ;NORMALE SOM1: MOV FEB,#1 ;= 2008 RET SOM2: MOV FEB,#2 ;> 2008 RET CMES: MOV R0,#GEN ;GIORNO 1 GENNAIO MOV R2,#12 MESIX: MOV ACC,@R0 ;CANCELLA PARTE ALTA MESI ANL A,#15 ;PER NUOVO CALCOLO MOV @R0,ACC INC R0 DJNZ R2,MESIX RET MESX: MOV DPTR,#MSG4 ACALL PRINT2 MOV ACC,MES ;CERCA MESE CORRENTE CJNE A,#1,CM2 ;PER RIFERIMENTO TABELLA MOV ACC,GEN ;GIORNI AJMP GIOX CM2: CJNE A,#2,CM3 MOV ACC,FEB AJMP GIOX CM3: CJNE A,#3,CM4 MOV ACC,MAR AJMP GIOX CM4: CJNE A,#4,CM5 MOV ACC,APR AJMP GIOX CM5: CJNE A,#5,CM6 MOV ACC,MAG AJMP GIOX CM6: CJNE A,#6,CM7 MOV ACC,GIU AJMP GIOX CM7: CJNE A,#7,CM8 MOV ACC,LUG AJMP GIOX CM8: CJNE A,#8,CM9 MOV ACC,AGO AJMP GIOX CM9: CJNE A,#9,CM10 MOV ACC,STT AJMP GIOX CM10: CJNE A,#10,CM11 MOV ACC,OTT AJMP GIOX CM11: CJNE A,#11,CM12 MOV ACC,NOV AJMP GIOX CM12: CJNE A,#12,CMX MOV ACC,DIC AJMP GIOX CMX: MOV DPTR,#MSG6 ;MESE SBAGLIATO ACALL PRINT2 RET GIOX: MOV R3,ACC ;CALCOLA SAB/DOM ACALL RIT1 MOV R0,#DO1 ;PUNTA A PRIMA DOMENICA MOV DO5,#0 ;CAMCELLA 5 COPPIA SA/DO MOV SA5,#0 ;A = TAB MESE CORRENTE MOV R2,#3 ;NR SETTIMANE DOPO LA PRIMA ANL A,#240 ;MASCHERA X TROVA SWAP A MOV B,ACC ;B = GIORNO INIZIO MESE MOV ACC,#8 ;7 X SABATO - 8 X DOMENICA CLR C SUBB A,B ;PRIMA DOMENICA DEL MESE MOV @R0,ACC ;IN MEMORIA ACALL SAB ;SUCESSIVO SABATO SOM: INC R0 ADD A,#7 MOV @R0,ACC ;MEMORIZZA SUCESSIVI SAB/DOM ACALL SAB ;FINO A 4 BLOCCHI DJNZ R2,SOM MOV ACC,R3 ;A = MESE - 28 GIORNI ANL A,#15 MOV B,ACC ;SALVATO IN B ADD A,#28 ;TROVA LUNGHEZZA MESE DEC R0 ;PUNTA ULTIMA DOMENICA SUBB A,@R0 ;VEDE SE ULTIMA DEL MESE JC FINE SUBB A,#6 ;CONTROLLA SE CI STA UN SABATO JC FINE ;NON CI STA JZ FINE1 ;CI STA ANCORA UN SABATO MOV ACC,#7 ;CALCOLA ULTIMA DOMENICA ADD A,@R0 INC R0 INC R0 MOV @R0,ACC ;MEMORIZZATA AJMP SAB ;CALCOLA QUINTO SABATO FINE: RET SAB: INC R0 ;PUNTA A SABATO DEC ACC ;SABATO DOMENICA - 1 MOV @R0,ACC ;MEMORIZZATO INC ACC ;A = DOMENICA RET FINE1: MOV ACC,@R0 ;ULTIMA DOMENICA ADD A,#7 INC R0 INC R0 AJMP SAB AFME: MOV ACC,MES ;IMPOSTA FINE MESE + 1 CJNE A,#1,FEX MMX: MOV FMES,#32 ;MESE 31 GIORNI RET FEX: CJNE A,#2,MAX MOV ACC,ANN CJNE A,#4,FE2 BIFE: MOV FMES,#30 ;MESE 29 GIORNI RET FIX: MOV FMES,#29 ;MESE 28 GIORNI RET FE2: CJNE A,#8,FIX AJMP BIFE MAX: CJNE A,#3,APX AJMP MMX APX: CJNE A,#4,MGX MED: MOV FMES,#31 ;MESE 30 GIORNI RET MGX: CJNE A,#5,GIX AJMP MMX GIX: CJNE A,#6,LUX AJMP MED LUX: CJNE A,#7,AGX AJMP MMX AGX: CJNE A,#8,SEX AJMP MMX SEX: CJNE A,#9,OTX AJMP MED OTX: CJNE A,#10,NOX AJMP MMX NOX: CJNE A,#11,DIX AJMP MED DIX: CJNE A,#12,MED AJMP MMX ;INIZIO PROGRAMMA DISPLAY LCD SCOM: ORL A,#15 ;P1.0 - P1.3 = 1 MOV P1,ACC CLR P3.4 ;COMANDO AJMP SLCD SCD: ORL A,#15 ;P1.0 - P1.3 = 1 MOV P1,ACC ;DATO SETB P3.4 SLCD: SETB P3.3 ;ENB = 1 ACALL RITL ;60 uSEC RIT CLR P3.3 ;ENB = 0 RET SCMD: PUSH ACC ;SCRITTURA COMANDO ACALL SCOM POP ACC SWAP A AJMP SCOM SSDATO: PUSH ACC ;SALVA A CON STAMPA ACALL SDATO POP ACC RET SDATO: PUSH ACC ;STAMPA DATO ACALL SCD POP ACC SWAP A AJMP SCD ENB: SETB P3.3 ;ENB = 1 ACALL RIT1 CLR P3.3 ;ENB = 0 RET ILCD: ACALL RIT1 ;INIZIALIZZA DISPLAY CLR P3.4 ;COMANDO LCD MOV P1,#15 ;+ 15 P1.0 - P1.3 = 1 ACALL ENB MOV P1,#47 ;4 BIT DATI 32+15 ACALL ENB ACALL RIT1 MOV P1,#143 ;AZZERA MEMORIA 128 ACALL ENB ;DATI MOV P1,#15 ;0 ACALL ENB MOV P1,#15 ;COMANDO = 12 0 ACALL ENB ;ATTIVA CURSORE MOV P1,#207 ;192 ACALL ENB RET RIGA1: MOV ACC,#128 RIGX: ACALL SCMD ;COMANDO CURSORE RET RIGA2: MOV ACC,#192 AJMP RIGX NOCUR: MOV ACC,#12 ;VISIBILITA' AJMP SCMD ;SI NO CURSORE CURS: MOV ACC,#14 AJMP SCMD CANC1: ACALL RIGA1 ;CANCELLA RIGA 1 CNX: MOV DPTR,#MSG0 ;= 16 SPAZI ACALL PRINT RET CANC2: ACALL RIGA2 ;CANCELLA RIGA 2 AJMP CNX PRINT2: ACALL RIGA2 ;MSG RIGA2 AJMP PRINT PRINT1: ACALL RIGA1 ;MSG RIGA1 PRINT: CLR A ;STAMPA STRINGA MSG MOVC A,@A+DPTR JBC ACC.7,FPRI ;FINE CON DATO + 128 ACALL SDATO INC DPTR ;AVANZA PUNTATORE AJMP PRINT ;CONTINUA FPRI: AJMP SDATO ;ULTIMO CARATTERE MSG0: DB ' ',' '+128 MSG1: DB 'CONT.LLO AUT. T','S'+128 MSG2: DB 'INIZIO PROGRAMM','A'+128 MSG3: DB ' T',':'+128 MSG4: DB 'CALCOLO SAB.DOM','.'+128 MSG5: DB ' OK AGGIORNATO',' '+128 MSG6: DB ' MESE SBAGLIAT','O'+128 MSG7: DB ' ANNO 20','0'+128 MSG8: DB 'CONTATTO CHIUSO',' '+128 MSG9: DB 'CONTATTO APERTO',' '+128 MSG10: DB 'RICEZIONE H:M:S',':'+128 CVD: MOV B,#10 ;CONVERSIONE BIN > 2 DIGIT DIV AB ;ASCII E SUCESSIVA STAMPA ADD A,#48 ACALL SDATO XCH A,B ADD A,#48 AJMP SDATO PORE: ACALL RITH ;ANTI STRESS DISPLAY ACALL RIGA1 ;STAMPA ANNO 1 CIFRA MOV ACC,GIO ACALL CVD ;STAMPA GIORNO MOV ACC,#'/' ACALL SDATO MOV ACC,MES ;STAMPA MESE ACALL CVD MOV ACC,#'/' ACALL SDATO MOV ACC,ANN ;STAMPA ANNO ADD A,#48 ACALL SDATO MOV ACC,#' ' ;SPAZIO ACALL SDATO MOV ACC,ORE ACALL CVD ;STAMPA ORE MOV ACC,#':' ACALL SDATO MOV ACC,MIN ACALL CVD ;STAMPA MINUTI MOV ACC,#':' ACALL SDATO MOV ACC,SEC ;STAMPA SECONDI ACALL CVD AJMP RITH ;RITARDO 2 MSEC CVA: MOV ACC,@R1 ;2 DIGIT ASCII SUBB A,#48 ;CONVERTITI IN UN BYTE MOV B,#10 MUL AB ;R1 PUNTA MEMORIA PUSH ACC ;DECINE INC R1 MOV ACC,@R1 SUBB A,#48 ;UNITA' XCH A,B POP ACC ADD A,B ;TOTALE = A RET AGGH: MOV R1,#MEM+3 ;PUNTA L'ANNO MOV ACC,@R1 CLR C ;1 SOLO DIGIT SUBB A,#48 MOV ANN,ACC INC R1 ;PUNTA MESE ACALL CVA MOV MES,ACC INC R1 ;PUNTA IL GIORNO ACALL CVA MOV GIO,ACC INC R1 ;PUNTA ORE ACALL CVA MOV ORE,ACC INC R1 ;MINUTI ACALL CVA MOV MIN,ACC INC R1 ;SECONDI ACALL CVA MOV SEC,ACC MOV DPTR,#MSG5 ACALL PRINT2 RET END Vai a pagina1