Professional Documents
Culture Documents
h>
///
libreria para el manejo del pic16f877a
#use delay(clock=4000000)
///
declara la frecuencia del
cristal
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT
#byte
#byte
#byte
#byte
#byte
#byte
#byte
#byte
#byte
void SUMAR(){
if(minutos<59){
minutos++;}
if(minutos>59)
{minutos==0;
horas++;
}
if(horas>12)
{horas==0;
if(am=1){
am==0;
pm==1;
if(pm=1)
{am==1;
pm==0;}
}
}
}
void t5ms()
{
tmr0==(236);
while(tmr0<254)
{tmr0++;
}
}
void MinutosU()
{
//Transformar los minutos para su presentacin: Unidad
minutosBCD=Dec2Bcd(minutos);
//Transforma de binario a BCD.
unidades=0b1111&minutosBCD;
//Sacar las unidades.
decenas=0b11110000&minutosBCD;
//Sacar las decenas.
decenas=decenas>>4;
//Desplazar 4 bits a la
derecha.
PORTD=Bin2_7seg(unidades);
//Unidades al puerto D.
}
void MinutosD()\
{
//Transformar los minutos para su presentacin:
minutosBCD=Dec2Bcd(minutos);
//Transforma de binario a BCD.
unidades=0b1111&minutosBCD;
decenas=0b11110000&minutosBCD;
decenas=decenas>>4;
derecha.
PORTD=Bin2_7seg(decenas);
}
void HoraU()
{
//Transformar las horas para su presentacin:
horasBCD=Dec2Bcd(horas);
//Transforma de binario a BCD.
unidades=0b1111&horasBCD;
//Sacar las unidades.
decenas=0b11110000&horasBCD;
//Sacar las decenas.
decenas=decenas>>4;
//Desplazar 4 bits a la
derecha.
PORTD=Bin2_7seg(unidades);
//Unidades al puerto D.
}
Void HoraD()
{
//Transformar las horas para su presentacin:
horasBCD=Dec2Bcd(horas);
//Transforma de binario a BCD.
unidades=0b1111&horasBCD;
//Sacar las unidades.
decenas=0b11110000&horasBCD;
//Sacar las decenas.
decenas=decenas>>4;
//Desplazar 4 bits a la
derecha.
if (decenas==1)
PORTD=Bin2_7seg(decenas);
//Decenas al puerto D.
if (decenas==2)
PORTD=0x3B;
//Formar el nmero "2".
if (decenas==0) PORTA=0;
//Apagar las decenas cuando
valgan cero.
}
void TIME1()
{
while(aux1<49)
{
aux1++;
}
aux1==0;
void PRE(){
void BARRIDO()
{
PIN_E0==(1); // Seleccionamos el
PIN_E1==(0); // Minutos > Decena
PIN_E2==(0); // Hora > Unidad
PIN_A3==(0); // Hora > Decena
MinutosU();
t5ms();
PIN_E0==(0); // Seleccionamos el
PIN_E1==(1); // Minutos > Decena
PIN_E2==(0); // Hora > Unidad
PIN_A3==(0); // Hora > Decena
MinutosD();
t5ms();
PIN_E0==(0); // Seleccionamos el
PIN_E1==(0); // Minutos > Decena
PIN_E2==(1); // Hora > Unidad
PIN_A3==(0); // Hora > Decena
HoraU();
t5ms();
PIN_E0==(0); // Seleccionamos el
PIN_E1==(0); // Minutos > Decena
PIN_E2==(1); // Hora > Unidad
PIN_A3==(0); // Hora > Decena
HoraD();
t5ms();
}
void main ()
{
// Los transistores estan en el puerto E y el que falta en RA3
setup_adc_ports(NO_ANALOGS);
set_tris_a(0b00100011); // RA0: Inicio o parado del reloj. RA1:
Reseteo. Alarma. RA5: 2 Puntos a 1Hz
set_tris_b(0b00000001); // RB0 boton para configurar y activar alarma
set_tris_c(0b11111111); // teclado matricial
set_tris_d(0b00000000); // horas/minutos
set_tris_e(0b000);
OPTION_REG=0b01010111;
//Pull ups habilitados.Timer0 como
temporizador. //Prescaler asignado al Timer0. Prescaler 1:256.
INTCON=0b10010000;
while(true){
PIN_A5==(1);
TIME1();
PIN_A5==(0);
if(bit_test(porta,0))
{
SUMAR();
}
if(bit_test(porta,1))
{
minutos==0;
horas==1;
unidades==0;
decenas==1;
}
}
}
INTERRUPCION
count_1++; //Contador usado para mostrar los datos en los displays. Cada
incre//mento se hace en 4ms.
if (count_1==150) count_1=30; //Solo se muestran 4 displays y el punto
switch (count_1){ // Permite seleccionar display que activara y valor que
//mostrara el display seleccionado.
case 30: // Activaremos primer display y mostramos valor de
"display_1"
display_port=0b00000001;
display_data=display_1;
DISPLAY(display_data,display_port);//Llamada a funcion
break;
case 60: // Activamos segundo display y mostramos valor de "display_2"
display_port=0b00000010;
display_data=display_2;
DISPLAY(display_data,display_port);//Llamada a funcion
break;
case 90: // Activamos tercer display y mostramos valor de "display_3"
display_port=0b00000100;
display_data=display_3;
DISPLAY(display_data,display_port);//Llamada a funcion
break;
case 120: // Activamos cuarto display y mostramos valor de "display_4"
display_port=0b00001000;
display_data=display_4;//Llamada a funcion
DISPLAY(display_data,display_port);
break;
}
}
}
//-------------------------RUTINA PRINCIPAL------------------------------------void main(){
OPTION_REG = 0b10000100; //PS=100 (Bit_0,1,2) Prescaler select 1:32
//PSA=0 (Bit_3) Prescaler asigned to TMRO module
//TOCS=0 (Bit_5) Internal Clock (CLKO)
ADCON1=0X06;
//Configurar IOs como digitales
TRISA=0X00;
//Puerto_C como salida. Habilitacion de los displays
TRISD=0X00;
TRISB=0X00;
//Puerto_D como salida. Bus de datos para los displays
PORTA=PORTB=PORTD=0X00; //Inicializar con los puertos apagados
TMR0=6;
// Temporizador T0 cuenta de 6 a 255
INTCON=0b10100000;
// Habilitar interrupcin por TMR0
// TMROIE=1 (Bit_5), Enable TMRO interrupt
// GIE=1 (Bit_7), Enable Global interrupts
while(1) {
minutes_bin=3;
seconds_bin=5;
BIN_7SEG(minutes_bin,seconds_bin);
}
}