;IK1WJQ ASSEMBLER 51 - OROLOGIO MULTIFUNZIONE CON AT89C2051                                          
     ;4 DIGIT 7 SEG. LED, USO P1.0 - P1.7 (SEG A - G) E DP
     ;CON CODICI CARATTERI ALFANUMERICI (ESCLUSO X E W)
     ;P3.1 ALLARME, (P3.0 = SELEZIONE) (P3.7 = MODO)
     ;P3.2 - P3.5 = ABILITAZIONE A1 - A4 (BC208C) USO DI X E F0

        ORE  EQU  16  ;USO OROLOGIO
        MIN  EQU  17
        SEC  EQU  18
        MSEC EQU  19  ;CON TIMER 1 16 HZ CLOCK
        DAT1 EQU  20  ;RAM USO DATI DISPLAY
        DAT2 EQU  21  ;4 DIGIT
        DAT3 EQU  22
        DAT4 EQU  23
        DTL1 EQU  24  ;COMPLEMENTI PER TIMER 1
        DTH1 EQU  25  ;RICARICA 16 BIT
        SECT EQU  26  ;USO PER CONTATEMPO
        MINT EQU  27
        MEMS EQU  28  ;MEMORIA AUSILIARIA
        MEMM EQU  29  ;SECONDI MINUTI
        DISP EQU  30  ;MEMORIA DISPLAY
        TMIN EQU  31  ;MEMORIA X TIMER
        TORE EQU  32  ;ESTERNO
        ALRM EQU  33  ;STATO ALLARME E BIT 7 CONTA INDIETRO
        GIOR EQU  34  ;DATI 
        MESE EQU  35  ;CALENDARIO
        ANNO EQU  36
        ISEC EQU  37  ;CONTEGGIO ALL'INDIETRO
        IMIN EQU  38
        ITEM EQU  39

           ORG    0000H
                  AJMP INI

           ORG    001BH         ;TIMER 1 OROLOGIO
                  MOV TL1,DTL1  ;RICARICA T1
                  MOV TH1,DTH1
                  JB F0,ACSEC
                  JB PSW.1,AOROL
                  RETI

         AOROL:   AJMP OROL
         ACSEC:   MOV ACC,ALRM   ;TEST CONTA ALL'INDIETRO
                  JB ACC.7,ADSEC
                  AJMP CSEC
         ADSEC:   AJMP DSEC

           INI:   MOV P3,#129  ;P3.0, P3.7 = 1
                  MOV P1,#255  ;DISPLAY SPENTO
                  MOV SP,#99
                  MOV ALRM,#0   ;DIS CONTA INDIETRO
                  MOV PSW,#2    ;ATTIVA OROLOGIO
                  MOV TMOD,#17  ;T1, T0 = 16 BIT  
                  SETB PT1      ;PRIORITA' T1 INT
                  MOV ACC,#46   ;T1 = 62510  16 HZ
                  CPL A         ;COMPLEMENTO X -
                  MOV DTL1,ACC  ;CONTEGGIO IN AVANTI
                  MOV ACC,#244
                  CPL A
                  MOV DTH1,ACC
                  MOV ACC,DISP
                  ANL A,#254    ;CONTROLLO ACCENSIONE
                  JZ INI2
                  MOV ORE,#0    ;ZERO TEMPO SE MEMORIA
                  MOV MIN,#0    ;SPORCA
                  MOV SEC,#0
                  MOV GIOR,#1   ;AZZERA DATA
                  MOV MESE,#1
                  MOV ITEM,#0   ;AZZERA CONTEGGIO INDIETRO
                  MOV ANNO,#00  ;ANNO 2000
                  MOV TORE,#24  ;DISAB. TIMER ALLARME
                  MOV TMIN,#0
           INI2:  MOV DPTR,#MSG7;PART
                  ACALL SMSG
                  INC SEC       ;AGGIUSTA SECONDI
                  SETB EA
                  SETB ET1      ;PREPARA TIMER 1
           INI1:  SETB TR1
                  MOV DISP,#0   ;OROLOGIO VISIBILE
          PRLX:   MOV ACC,#10000101B
                  ORL A,ALRM
                  MOV P3,ACC         ;1 DIGIT
                  MOV P1,DAT1        ;SCANSIONE  CONTINUA
                  ACALL RIT0         ;1 MSEC RITARDO
                  CLR P3.2
                  SETB P3.3
                  MOV P1,DAT2        ;2 DIGIT
                  ACALL RIT0
                  CLR P3.3
                  SETB P3.4
                  MOV P1,DAT3        ;3 DIGIT
                  ACALL RIT0
                  CLR P3.4           ;4 DIGIT
                  SETB P3.5
                  MOV P1,DAT4
                  ACALL RIT0
                  CLR P3.5
                  JNB P3.7,FUNZ      ;CHIAMA FUNZIONI
                  AJMP PRLX          ;SCANSIONE 250 HZ

           RIT0:  PUSH ACC        ;1 MSEC. RITARDO
                  MOV A,#248
           PAU0:  NOP
                  NOP
                  DJNZ ACC,PAU0
                  POP ACC
                  RET

           RIT3:  PUSH B          ;RITARDO 6 MSEC
                  MOV B,#6
                  AJMP PAU1
           RIT1:  PUSH B          ;0,256 SEC RITARDO
                  MOV B,#0
           PAU1:  ACALL RIT0
                  DJNZ B,PAU1
                  POP B
                  RET

           RIT2:  PUSH PSW        ;RITARDO 0,76 SEC
                  SETB PSW.3      ;USO BANCO 2
                  MOV R6,#3
           PAU2:  ACALL RIT1
                  DJNZ R6,PAU2
                  POP PSW
                  RET

           RIP1:  CLR P3.1        ;STOP CICALINO
                  XCH A,ALRM
                  CLR ACC.1
                  XCH A,ALRM
                  ACALL RIT2      ;NO DISPLAY
                  AJMP RIPO
            RIP:  AJMP RIP1

           FUNZ:  MOV SECT,SEC     ;AGGIORNA CTEMPO
                  MOV MINT,MIN
                  MOV DISP,#1      ;OROLOGIO INVISIBILE
                  MOV ALRM,#0      ;AZZERA ALLARME E DSEC
                  CLR F0
                  SETB PSW.1       ;CONTATEMPO ATTIVO
                  MOV DPTR,#MSG10  ;MODO
                  ACALL SMSG
                  ACALL RIT2       ;SCELTA FUNZIONI
                  JNB P3.0,AFP     ;CON SELEZIONE
                  AJMP PRLX        ;CONTINUA
           AFP:   ACALL RIT2
                  CLR A
           FUNP:  JB P3.0,FUNP
                  INC A
                  CJNE A,#10,FUN1
                  CLR A
           FUN1:  ACALL DIG1       ;STAMPA 1 - O
                  ACALL RIT2
                  JNB P3.0,FUNP   
                  CJNE A,#1,SV1
                  MOV DPTR,#MSG5   ;OROL
                  MOV DISP,#0      ;ATTIVA DISPLAY
                  ACALL SMSG
                  AJMP INI1        ;ATTIVA OROLOGIO
            SV1:  CJNE A,#2,SV2
                  MOV DPTR,#MSG9
                  ACALL SMSG       ;CONTA SECONDI
                  ACALL ZCONT      ;AZZERA MINT SECT
                  JB P3.0,$        ;ASPETTA PARTENZA
                  MOV MEMS,#0      ;AZZERA MEMORIA AUSILIARIA
                  MOV MEMM,#0
           SCT:   SETB F0          ;TOGLIE STAMPA OROLOGIO
                  CLR PSW.1        ;ATTIVA DISPLAY
                  AJMP INI1
            SV2:  CJNE A,#3,SV3
                  MOV ACC,MEMM     ;VISUALIZZA ULTIMO CSEC
                  ACALL PRINTA
                  MOV ACC,MEMS
                  ACALL PRINTB
                  ACALL RIT2
                  AJMP PRLX
            SV3:  CJNE A,#4,SV4
                  CLR P3.2         ;OROLOGIO ATTIVO
                  MOV DISP,#1      ;NO DISPLAY
                  MOV P1,#255      ;MINIMO ASSORBIMENTO
                  XCH A,ALRM
                  SETB ACC.1       ;PREPARA ALLARME
                  XCH A,ALRM
                  ACALL RIT2
           RIPO:  JNB P3.7,FUNZ    ;CORRENTE < 2,5 MA
                  JNB P3.0,RIP     ;STOP CICALINO
                  MOV PCON,#1
                  AJMP RIPO        ;ASPETTA PULSANTE
            SV4:  CJNE A,#5,SV5
                  ACALL AIMIN      ;CHIAMA SET TEMPO INDIETRO
                  MOV DPTR,#MSG11  ;STEM
                  ACALL SMSG
                  MOV DISP,#0
                  ACALL RIT1
                  ACALL RIT1
                  AJMP SCT         ;CHIAMA PARTENZA TIMER
            SV5:  CJNE A,#6,SV6    ;VISUALIZZA ALLARME
                  MOV ACC,TORE
                  ACALL PRINTA
                  MOV ACC,TMIN
                  ACALL PRINTB
                  ACALL RIT2
                  AJMP PRLX
            SV6:  CJNE A,#7,SV7
                  AJMP ATORE       ;AGGIORNA ALRM
            SV7:  CJNE A,#8,SV8
                  MOV DPTR,#MSG8   ;MNSC
                  ACALL SMSG       ;VISUALIZZA MIN/SEC
          SV8X:   JB P3.0,SV8X     ;OROLOGIO
                  CLR PSW.1
                  SETB F0
                  MOV MINT,MIN
                  MOV SECT,SEC
                  AJMP INI1
            SV8:  CJNE A,#9,AGIOR  ;VISUALIZZA 
                  MOV ACC,GIOR     ;GIORNO E MESE
                  ACALL PRINTA
                  MOV ACC,MESE
                  ACALL PRINTB
                  ACALL RIT2
                  AJMP PRLX

           AIMIN: ACALL RIT2       ;PER CONTEGGIO INDIETRO
                  MOV DAT2,#7      ;T
                  INC ITEM
            IMI1: MOV ACC,ITEM     ;MEMORIA DI PARTENZA
                  CJNE A,#60,IMI2  ;IN MINUTI
                  MOV ITEM,#1
                  MOV ACC,#ITEM
            IMI2: ACALL DIG2
                  JNB P3.7,FIMI
                  JB P3.0,IMI1
                  INC ITEM
                  ACALL RIT1
                  AJMP IMI1
            FIMI: XCH A,ALRM       ;SET CONTA INDIETRO
                  SETB ACC.7
                  XCH A,ALRM
                  DEC ITEM
                  MOV IMIN,ITEM    ;PREPARA CONTATORE
                  MOV ISEC,#60
                  RET

           AGIOR: ACALL RIT2       ;AGGIORNA GIORNO
                  MOV DAT2,#66     ;G
           GIOR1: MOV ACC,GIOR
                  CJNE A,#32,GIOR2
                  MOV GIOR,#1
                  MOV ACC,GIOR
           GIOR2: ACALL DIG2
                  JNB P3.7,AGME
                  JB P3.0,GIOR1
                  INC GIOR
                  ACALL RIT1
                  AJMP GIOR1

           AGME:  ACALL RIT2      ;AGGIORNA MESE
                  MOV DAT2,#72    ;M
           AGME1: MOV ACC,MESE
                  CJNE A,#13,GME2
                  MOV MESE,#1
                  MOV ACC,MESE
          GME2:   ACALL DIG2
                  JNB P3.7,FTMI   ;RITORNA A MODO
                  JB P3.0,AGME1
                  INC MESE
                  ACALL RIT1
                  AJMP AGME1

           ATORE: ACALL RIT2      ;ORE ALLARME
                  MOV DAT2,#9     ;H
           TORE1: MOV ACC,TORE
                  CJNE A,#25,TORE2
                  MOV TORE,#0
                  MOV ACC,TORE
           TORE2: ACALL DIG2
                  JNB P3.7, ATIM
                  JB P3.0,TORE1
                  INC TORE
                  ACALL RIT1
                  AJMP TORE1

           ATIM:  ACALL RIT2       ;MINUTI
                  MOV DAT2,#72     ;M
           TMIN1: MOV ACC,TMIN
                  CJNE A,#60,TMIN2
                  MOV TMIN,#0
                  MOV ACC,TMIN
          TMIN2:  ACALL DIG2
                  JNB P3.7,FTMI
                  JB P3.0,TMIN1
                  INC TMIN
                  ACALL RIT1
                  AJMP TMIN1
          FTMI:   AJMP PRLX

           DIG1:  PUSH ACC         ;SOLO 1 DIGIT
                  MOV DPTR,#NUM    ;DA 0 A 9
                  MOVC A,@A+DPTR
                  SETB P3.2
                  ORL A,#128       ;NO DP
                  MOV P1,ACC
                  POP ACC
                  RET

           DIG2:  PUSH ACC         ;STAMPA LETTERA E 
                  ACALL PRINTB     ;2 DIGIT POSIZ. 3 E 4
                  SETB P3.3
                  MOV P1,DAT2      ;DAT2 = LETTERA
                  SETB P1.7        ;NO DP
                  ACALL RIT3
                  MOV P3,#10010001B
                  MOV P1,DAT3
                  ACALL RIT3
                  MOV P3,#10100001B
                  MOV P1,DAT4
                  ACALL RIT3
                  CLR P3.5
                  POP ACC
                  RET

           AORA:  INC SEC
                  MOV ACC,SEC
                  CJNE A,#60,FORA
                  MOV SEC,#0
                  INC MIN
                  MOV ACC,MIN
                  CJNE A,#60,FORA
                  MOV MIN,#0
                  INC ORE         ;NO CONTROLLO SU ORE
        FORA:     RET

           ZCONT: MOV MINT,#0     ;AZZERA CONTATORI
                  MOV SECT,#0     ;TEMPO
                  RET

           DSEC:  INC MSEC         ;CONTA SEC E MIN
                  MOV ACC,MSEC     ;INDIETRO
                  CJNE A,#16,DSEC3
                  MOV MSEC,#0
                  DEC ISEC
                  ACALL AORA       ;AGGIORNA OROLOGIO
                  JNB P3.0,STOP1   ;FINE CONTEGGIO
                  MOV ACC,ISEC
                  JNZ FMIN
                  MOV ISEC,#60
                  MOV ACC,ALRM
                  JNB ACC.0,DSEC1  ;TEST TEMPO SCADUTO
                  INC IMIN         ;AUMENTA SE NEGATIVO
                  AJMP DSEC2       ;STAMPA NEGATIVO
          DSEC1:  DEC IMIN
                  MOV ACC,IMIN
                  CJNE A,#255,FMIN ;TEST MENO UN MINUTO
                  XCH A,ALRM
                  ORL ACC,#3       ;SETTAGGIO - NEGATIVO
                  XCH A,ALRM       ;E ALLARME
                  MOV IMIN,#0
          DSEC2:  MOV ACC,IMIN
                  ACALL PRINTB          ;SECONDI = MINUTI
                  MOV DAT1,#135         ;T 1 DIGIT
                  MOV DAT2,#10111111B   ; - SEGNO NEGATIVO
          DSEC3:  RETI
                  
           FMIN:  MOV ACC,ALRM
                  JB ACC.0,DSEC2
                  MOV ACC,IMIN
                  ACALL PRINTA
                  MOV ACC,ISEC
                  ACALL PRINTB
                  RETI

          STOP1:  CLR F0               ;FINE DSEC
                  SETB PSW.1
                  MOV MEMS,ISEC        ;MEMORIZZA
                  MOV MEMM,IMIN        ;TEMPO
                  XCH A,ALRM
                  JNB ACC.0,STOP2
                  MOV MEMS,#0          ;FUORI TEMPO SEC = 0
          STOP2:  ANL A,#01111110B     ;AZZERA FLAG
                  XCH A,ALRM
                  RETI

           CSEC:  INC MSEC        ;CONTA SECONDI E MINUTI
                  MOV ACC,MSEC    ;IN AVANTI
                  CJNE A,#16,OROX
                  MOV MSEC,#0     ;AZZERA MINISEC
                  CPL P3.1        ;SEG. IN USCITA OGNI SEC
                  INC SECT
                  ACALL AORA      ;AGGIORNA ORA OROLOGIO
                  JNB P3.0,STOP   ;ESCE CON SELEZ.
                  MOV ACC,SECT    
                  CJNE A,#60,FSEC
                  MOV SECT,#0
                  INC MINT
                  MOV ACC,MINT
                  CJNE A,#60,FSEC
                  ACALL ZCONT      ;AZZERA CONTEGGIO     
          FSEC:   MOV ACC,MINT
                  ACALL PRINTA     ;PREPARA MINT
                  MOV ACC,SECT
                  ACALL PRINTB     ;PREPARA SECT                 
           OROX:  RETI

           STOP:  CLR F0          ;FERMA CSEC
                  SETB PSW.1      ;ATTIVA OROLOGIO
                  CLR P3.1        ;STOP SEGNALE
                  MOV MEMS,SECT   ;MEMORIZZA CSEC
                  MOV MEMM,MINT   
                  RETI

           OROL:  INC MSEC       ;CONTROLLO 1/16 DI SEC.
                  MOV ACC,MSEC   ;TIMER 1
                  CJNE A,#16,OROX
                  MOV MSEC,#0    ;AZZERA MINISECONDI
                  INC SEC        ;CHIAMATO OGNI 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 GIOR
                  MOV ACC,GIOR
                  CJNE A,#32,FORO
                  MOV GIOR,#1
                  INC MESE
                  MOV ACC,MESE
                  CJNE A,#13,FORO
                  MOV MESE,#1
                  INC ANNO
           FORO:  MOV ACC,DISP   ;TEST DISPLAY
                  JNZ ORO3       ;SALTA NO DISPLAY
                  MOV ACC,MIN    ;CONTROLLO ALLARME
                  CJNE A,TMIN,ORO1
                  MOV ACC,ORE
                  CJNE A,TORE,ORO1
                  XCH A,ALRM     ;ATTIVA ALLARME
                  SETB ACC.1
                  XCH A,ALRM
                  AJMP ORO2
           ORO1:  XCH A,ALRM     ;DISATTIVA ALLARME
                  CLR ACC.1      ;CON DISPLAY ACCESO
                  XCH A,ALRM
           ORO2:  MOV ACC,ORE
                  ACALL PRINTA   ;2 DIGIT SX ORE
                  MOV ACC,MIN
                  ACALL PRINTB   ;2 DIGIT DX MIN
                  JNB P3.0,AGO   ;TEST AGGIORNAMENTO
                  RETI

           ORO3:  MOV ACC,MIN      ;NO DISPLAY
                  CJNE A,TMIN,ORO4 ;TEST ALLARME
                  MOV ACC,ORE
                  CJNE A,TORE,ORO4
                  MOV ACC,ALRM
                  JNB ACC.1,ORO4
                  SETB P3.1        ;ATTIVA CICALINO
                  RETI
           ORO4:  CLR P3.1         ;DISATTIVA CICALINO
                  RETI

           AGO:   CLR TR1        ;STOP OROLOGIO
                  ACALL RIT2
                  MOV DAT2,#9    ;H
         AGO1:    MOV ACC,ORE
                  CJNE A,#24,AGO2
                  MOV ORE,#0
                  MOV ACC,ORE
          AGO2:   ACALL DIG2     ;VEDE ORE
                  JNB P3.7,AGM   ;PULSANTE MODO 
                  JB P3.0,AGO1   ;PROSEGUE VAR. MINUTI
                  INC ORE
                  ACALL RIT1
                  AJMP AGO1

           AGM:   ACALL RIT2
                  MOV DAT2,#72   ;M
          AGM1:   MOV ACC,MIN
                  CJNE A,#60,AGM2
                  MOV MIN,#0
                  MOV ACC,MIN
          AGM2:   ACALL DIG2     ;VEDE MINUTI
                  JNB P3.7,ESCE  ;PULSANTE MODO ESCE
                  JB P3.0,AGM1   ;PULSANTE SELEZ. VARIA
                  INC MIN
                  ACALL RIT1
                  AJMP AGM1

          ESCE:   MOV TL1,DTL1    ;PREPARA T1
                  MOV TH1,DTH1
                  MOV MSEC,#0     ;AZZERA MSEC E SEC
                  MOV SEC,#0
                  ACALL RIT1
                  ACALL RIT1
                  SETB TR1        ;ATTIVA T1
                  AJMP FORO       ;RIPRISTINA OROLOGIO

          PRINTA: MOV DPTR,#NUM ;PREPARA STAMPA NUMERICA
                  MOV B,#10     ;CONVERSIONE BIN > BCD
                  DIV AB        ;IN A I IN B II DIGIT
                  MOVC A,@A+DPTR
                  ORL A,#128
                  MOV DAT1,ACC
                  XCH A,B
                  MOVC A,@A+DPTR
                  ORL A,#128
                  MOV DAT2,ACC
                  RET

          PRINTB: MOV DPTR,#NUM  ;STAMPA III E IV DIGIT
                  MOV B,#10
                  DIV AB
                  MOVC A,@A+DPTR
                  MOV DAT3,ACC
                  XCH A,B
                  MOVC A,@A+DPTR
                  ORL A,#128
                  MOV DAT4,ACC
                  RET
                             
           SMSG:  MOV R7,#4       ;PRENDE DATI DA DPTR
                  MOV R0,#DAT1    ;E LI SCRIVE IN
           SM4:   CLR A
                  MOVC A,@A+DPTR  ;DAT1 - DAT4  PER
                  ORL A,#128      ;NO DP
                  MOV @R0,ACC     ;STAMPA SOLO MESSAGGI
                  INC DPTR
                  INC R0
                  DJNZ R7,SM4
                  RET

                     ;0  1   2  3  4  5  6  7  8  9
            NUM:  DB  64,121,36,48,25,18,2,120,0,16

                     ;A B C  D  E F  G  H  I  J
                    ; 8,3,70,33,6,14,66,9,123,113
                     ;K  L  M  N  O  P  Q  R  S  T
                    ; 15,71,72,43,35,12,24,47,18,7
                     ;U  V  W   X   Y  Z
                    ; 99,65,127,127,17,13

           MSG0:  DB  0,0,0,0                     ;.8.8.8.8
           MSG1:  DB  9,127,127,127               ;H
           MSG2:  DB  72,127,127,127              ;M
           MSG3:  DB  36,6,47,35                  ;ZERO
           MSG4:  DB  7,127,127,127               ;T
           MSG5:  DB  35,47,35,71                 ;OROL
           MSG6:  DB  33,8,7,8                    ;DATA
           MSG7:  DB  12,8,47,7                   ;PART
           MSG8:  DB  72,43,18,70                 ;MNSC
           MSG9:  DB  70,18,6,70                  ;CSEC
           MSG10: DB  72,35,33,35                 ;MODO
           MSG11: DB  18,7,6,72                   ;STEM
           
           END