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