Semplice orologio digitale con ore, minuti e led che lampeggiano ogni secondo, progettato con pic16f84a e til311.
Orologio digitale con PIC16F84A
clicca per ingrandire
Descrizione:
Questo semplice progetto sfrutta il vantaggio che i TIL311 hanno un decoder integrato grazie al quale è sufficiente mandare il dato in codice bcd con 4 bit per ottenere il numero selezionato. inoltre avendo un bit di enable è possibile fare in modo, nonostante le quattro linee dati che vanno ai display siano collegate tutte e quattro insieme, di visualizzare il bunero sul display desiderato. Accendendo e spegnendo i vari display a una velocità non percettibile dall'occhio umano otterremo la visualizzazione dell'ora su tutti i display contemoraneamente. Più precisamente vedremo sui primi due display le ore mentre sugli ultimi due i minuti. Inoltre i led centrali sono programmati in modo che lampeggino una volta al secondo, scandendo così anche i secondi. I tre pulsanti hanno le rispettive funzioni:
pulsante 1: mette in stendby l'orologio
pulsante 2: se l'orologio è in standby, incrementa i minuti per la regolazione
pulsante 3: se l'orologio è in standby, incrementa le ore per la regolazione
PROGRAMMA
Per il funzionamento dell’orologio e stato scritto nella memoria del pic il programma sotto riportato
;Le uscite RA0,RA1,RA2,RA3 sono collegate agli ingressi dati A, B,
;C, D dei TIL311 mentre le uscite RB3,RB4,RB5,RB6 aggiornano con
;il livello basso i display agendo su LS. Gli ingressi RB0, RB1 e RB2
;sono collegati a 3 pulsanti:P0 seleziona e deseleziona la modalità
;impostazione; P1 consente l'avanzamento manuale dei minuti, P2 quello
;delle ore. L'uscita RA4 agisce sui led dei secondi mentre l'uscita
;RB7 spegne il display delle decine delle ore quando è zero.
;
;Clock da 5MHz
;
;-------------------------- DICHIARAZIONI
list p=16F84A
PORT_AEQU05; Assegnano ai registri speciali
PORT_BEQU06;le denominazioni indicate nella
STATOEQU03;prima colonna.
ZEROEQU02
OPTEQU81
INTCONEQU0B
UNI_MIN EQU10; Registro per le unità minuti
DEC_MIN EQU11; Registro per le decine minuti
UNI_ORE EQU12; Registro per le unità ore
DEC_ORE EQU13; Registro per le decine ore
COUNT_1 EQU0C; Registri usati
COUNT_2 EQU0D;nelle routine
COUNT_3 EQU0E;di ritardo
COUNT_4 EQU0F
GOSTART EQU14 ; Registro con i flag B0 e B1
;di ritorno a START
W_TEMPEQU15; Registro W temporaneo
ST_TEMP EQU16; Registro stato temporaneo
;--------------------------
ORG0000; Carica in memoria dall'indirizzo 0000
GOTOINIT; Salta ad INIZIALIZZAZIONE
;-------------------------- SUB INTERRUPT: gestisce l'interrupt
INTORG0004; Carica in memoria dall'indirizzo 004
MOVWFW_TEMP; Salva W in W_TEMP
SWAPFSTATO,0; Salva STATO
MOVWFST_TEMP;in ST_TEMP
CALLDEL_SEC; Ritardo anti-rimbalzo per P0
PULS1BTFSCPORT_B,1; Testa P1 e se non è premuto
GOTOPULS2;salta a PULS2
MOVLW03; Imposta un ritardo
MOVWFCOUNT_3;anti-rimbalzo più breve
CALLLOOP3;per P1
CALLINC_MIN; Incrementa di una unità i minuti
CALLOUT;e li visualizza
PULS2BTFSCPORT_B,2; Testa P2 e se non è premuto
GOTOPULS0;salta a PULS0
MOVLW03; Imposta un ritardo
MOVWFCOUNT_3;anti-rimbalzo più breve
CALLLOOP3;per P2
CALLINC_ORE; Incrementa di una unità le ore
CALLOUT;e le visualizza
PULS0BTFSCPORT_B,0; Testa P0 e se non è premuto
GOTOPULS1;torna a PULS1
CALLDEL_SEC; Ritardo anti-rimbalzo
SWAPFST_TEMP,0; Ripristina ST_TEMP
MOVWFSTATO;in STATUS
SWAPFW_TEMP,1; Ripristina W_TEMP
SWAPFW_TEMP,0;in W
BSFGOSTART,1; Setta il flag B1 di GOSTART
BCFINTCON,1; Azzera il flag INTF di interrupt
BSFINTCON,7; Riabilita l'interrupt generale GIE
ESCIRETFIE; Esce dall'interrupt
;-------------------------- INIZIALIZZAZIONE
INITORG0030; Carica in memoria dall'indirizzo 0030
MOVLWB'00000000'; Linee di PORT_A
TRISPORT_A;come uscite
MOVLWB'00000111'; Linee RB0, RB1, RB2 come ingressi
TRISPORT_B;linee RB3-RB7 come uscite
BSFSTATO,5; Seleziona il banco 1
BCFOPT,6; Interrupt sul fronte di discesa
BCFSTATO,5; Ritorno al banco 0
BSFINTCON,4; Abilita l'interrupt di RB0
CLRFUNI_MIN; Azzera i registri
CLRFDEC_MIN;dei minuti
CLRFUNI_ORE;e delle ore
CLRFDEC_ORE
BSFPORT_B,3; Pone in stato di memoria (latch)
BSFPORT_B,4;i display dei minuti
BSFPORT_B,5;e delle ore
BSFPORT_B,6
BSFINTCON,7; Abilita l'interrupt generale
;-------------------------- MAIN
STARTCLRFGOSTART; Azzera i flag B0 e B1 di GOSTSTART
CALLOUT; Visualizza i registri ore e minuti
CALLDEL_MIN; Introduce il ritardo di 1 min
BTFSCGOSTART,1; Se B1 è 1
GOTOSTART;torna a START, altrimenti
CALLINC_MIN;incrementa i minuti
BTFSCGOSTART,0; Se B0 è 1
GOTOSTART;torna a START, altrimenti
CALLINC_ORE;incrementa le ore
GOTOSTART; Ricomincia da START
;-------------------------- SUB DEL_SEC: genera il ritardo di 0,5 s
;Ritardo=X*Y*Z*5*Tempo in uS di un ciclo macchina (0,8uS per clock di 5MHz)
DEL_SEC MOVLW06H; Variabile X
MOVWFCOUNT_3
LOOP3MOVLW0FAH; Variabile Y
MOVWFCOUNT_2
LOOP2MOVLW53H; Variabile Z
MOVWFCOUNT_1
LOOP1BTFSCGOSTART,1; Controlla B1 e se è 1
GOTOSTART3;esce dalla routine
DECFSZ COUNT_1
GOTOLOOP1
DECFSZ COUNT_2
GOTOLOOP2
DECFSZ COUNT_3
GOTOLOOP3
START3RETURN
;-------------------------- SUB DEL_MIN: genera il ritardo di 1 min
;accendendo e spegnendo i LED dei secondi
DEL_MIN MOVLW3C
MOVWFCOUNT_4
LOOP4BSFPORT_A,4; Accende i LED dei secondi
CALLDEL_SEC
BTFSCGOSTART,1
GOTOSTART4
BCFPORT_A,4; Spegne i LED dei secondi
CALLDEL_SEC
DECFSZ COUNT_4
GOTOLOOP4
START4RETURN
;-------------------------- SUB OUT: fa uscire i registri minuti e ore
;su RA0-RA3 e aggiorna i display con RB3-RB6
OUTMOVFUNI_MIN,0; OUT di unità minuti
MOVWFPORT_A
BCFPORT_B,3;e aggiorna con RB3
BSFPORT_B,3;il display di unità minuti
MOVFDEC_MIN,0; OUT di decine minuti
MOVWFPORT_A
BCFPORT_B,4;e aggiorna con RB4
BSFPORT_B,4;il display di decine minuti
MOVFUNI_ORE,0; OUT di unità ore
MOVWFPORT_A
BCFPORT_B,5;e aggiorna con RB5
BSFPORT_B,5;il diplay di unità ore
MOVLW00; Controlla se DEC_ORE
XORWFDEC_ORE,0;è 0,
BTFSCSTATO,ZERO; Se lo è
GOTOBLANK;salta a BLANK altrimenti
BCFPORT_B,7;non effettua blanking del display
MOVFDEC_ORE,0; OUT di decine ore
MOVWFPORT_A
BCFPORT_B,6;aggiorna con RB6
BSFPORT_B,6;il display di decine ore
GOTORETOUT; Va a RETURN
BLANKBSFPORT_B,7; Abilita il blanking del display dec ore
RETOUTRETURN
;-------------------------- SUB INC_MIN: incrementa unità e decine minuti
INC_MIN INCFUNI_MIN; Incrementa unità minuti
MOVLW0A; Confronta unità minuti
XORWFUNI_MIN,0;con 10 D
BTFSSSTATO,ZERO; Se non è 10 D
GOTOSTART1;salta a START1
CLRFUNI_MIN; Altrimenti azzera unità minuti
INCFDEC_MIN;e incrementa decine minuti
MOVLW06; Confronta decine minuti
XORWFDEC_MIN,0;con 6 D
BTFSSSTATO,ZERO; Se non è 6 D
GOTOSTART1;salta a START1
CLRFDEC_MIN; Altrimenti azzera decine minuti
GOTOEX_INCM;e salta a RETURN
START1BSFGOSTART,0; Attiva il flag B0
EX_INCM RETURN
;-------------------------- SUB INC_ORE: incrementa unità e decine ore
INC_ORE INCFUNI_ORE; Incrementa unità ore
MOVLW02; Confronta decine ore
XORWFDEC_ORE,0;con 2 D
BTFSCSTATO,ZERO; Se decine ore è 2 D
GOTOVENTI;salta a VENTI
MOVLW0A; Altrimenti confronta unità ore
XORWFUNI_ORE,0;con 10 D
BTFSSSTATO,ZERO; Se non è 10 D
GOTOSTART2;salta a RETURN
CLRFUNI_ORE; Altrimenti azzera le unità ore
INCFDEC_ORE;e incrementa le decine ore
GOTOSTART2; Salta a RETURN
VENTIMOVLW04; Confronta unità ore
XORWFUNI_ORE,0;con 4 D
BTFSSSTATO,ZERO; Se non è 4 D
GOTOSTART2;salta a RETURN
CLRFUNI_ORE; Altrimenti azzera unità ore
CLRFDEC_ORE;e decine ore
START2RETURN
END
il parere della community
esprimi il tuo voto
approvi questa pagina?
promo
non sei autenticato, per questo non puoi visualizzare i commenti sulla pagina. Se sei registrato accedi oppure registrati.
difficoltà
costo
informazioni
Questa pagina è stata creata da michelemilani il 09/06/2010 ore 00:30 ultima modifica del 18/06/2010 ore 15:59la pagina è stata visitata 12508 volte
Lo staff di www.grix.it non si assume responsabilità sul contenuto di questa pagina.
Se tu sei l'autore originale degli schemi o progetti proposti in questo articolo, e ritieni che siano stati violati i tuoi diritti, contatta lo staff di www.grix.it per segnalarlo.