Este es el programa de un cronómetro, con reinicio y pausa, implementado en un Atmega164p, los el tiempo se muestra en un display de 8 segmentos x4.
|
Circuito |
/*
* cronometro.c
*
* Created: 10/03/2016 8:43:06
* Author: Toshiba Satellite
*/
#include
#define F_CPU 1000000UL
#include
#include
unsigned char u,d,c,m;
int contador,segundo; //por q va hasta 9999
unsigned char display[10]={0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,0b01101101,0b01111101,0b000000111,0b01111111,0b01101111};
void configurar(void);
int main(void)
{
configurar();
while(1)
{
u=segundo%10;
m=segundo/1000;
c=(segundo-m*1000)/100;
d=(segundo-m*1000-c*100)/10;
PORTA=display[u];
PORTC=0b11111110;
_delay_ms(5);
PORTC=255; //apagar
PORTA=display[d];
PORTC=0b11111101;
_delay_ms(5);
PORTC=255;
PORTA=display[c];
PORTC=0b11111011;
_delay_ms(5);
PORTC=255;
PORTA=display[m];
PORTC=0b11110111;
_delay_ms(5);
PORTC=255;
}
}
void configurar(void)
{
//configuracion de puertos
DDRA=255;//salida
DDRC=255;
//configuracion de timer
TCCR0A=0b00000010;
OCR0A=38;
TCCR0B=0b00000000;
TIMSK0=0b00000010;
TIFR0=TIMSK0; //bajando banderas
//configuracionde interrupciones externas
EICRA=0b00101010;
EIMSK=0b00000111;
EIFR=0b00000111;//solo para simulacion
sei();
}
//interrupcion por comparacion del timer 0
ISR(TIMER0_COMPA_vect)
{
contador++;
if (contador>100)
{
segundo++;
contador=0;
}
}
//INTERRUPCIONES EXTERNAS
//pausa
ISR(INT0_vect)
{
TCCR0B=0b00000000;
}
//arrancar
ISR(INT1_vect)
{
TCCR0B=0b00000100;
}
//reinicio
ISR(INT2_vect)
{
segundo=0;
}
//
No hay comentarios.:
Publicar un comentario