;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