;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
');
//-->