jueves, 6 de junio de 2013

PRACTICA 4 INTERRUPCIONES PIC16F877A


/*practica 4. un programa que permita mediante sensores y interrupciones en el
microcontrolador, permita contabilizar la entrada/salida de los productos del
refrigerador de una tienda, tres leds indicaran el estado del refrigerador
(capacidad maxima de llenado: 20 productos) y dos display que permitan visualizar
el numero de productos contenidos.
1:cuando se ingrese mercancia el display incrementara su cuenta
2:cuando algun cliente retire mercancia el display decrementara su cuenta
3:los estados de capacidad del refrigerador
led rojo=lleno, led verde=refrigerador vacio, led amarillo=con mercancia adentro
*/
void led(int producto); //funcion para estados del refrigerador
void interrupt();        //interupciones
const unsigned int DIGITO[] = // constantes para display
{
0x3F, //Código del dígito 0
0x06, //Código del dígito 1
0x5B, //Código del dígito 2
0x4F, //Código del dígito 3
0x66, //Código del dígito 4
0x6D, //Código del dígito 5
0x7D, //Código del dígito 6
0x07, //Código del dígito 7
0x7F, //Código del dígito 8
0x6F, //Código del dígito 9
};
void verdisplay(int producto);//funcion para visualizas valores display
int producto,num;
void main() {
     ADCON1=7;   //digital
     TRISB=0b00001111;    //entradas
     TRISC=0;
     TRISD=0;
     INTCON=0b10110000;    //configuracion de interupciones trm0 y rb0
     OPTION_REG=0b1101000; //configuracion de cada interupcion
   
       while(1)
       {
       led(producto);
       verdisplay(producto);
       TMR0=255;
       }
}
void interrupt()      //vector de interupciones
{
     if(INTCON.INTF==1)    //comprebacion si la interupcion es por RB0
     {
     producto=num++;
     INTCON.INTF=0;       //limpiamos la bandera
     if(producto==20)
     {
      producto=20;
      num=20;    }
     }
     else  {               //en este caso si no fue por RB0 la interupcion
     producto=num--;       //es por TMR0
     INTCON.T0IF=0;        //limpiamos la bandera
     if(producto==0)
     producto=0;
     }
}
void led(int producto)     //funcion para visualisar los estados del refrigerador
{
     if(producto>0)   //led amarillo
     PORTB.RB6=1;     //con productos en su interios
     else
     PORTB.RB6=0;
     if(producto==20)
     {PORTB.RB7=1;    //LED ROJO
     PORTB.RB6=0;}    //lleno
     else
     PORTB.RB7=0;
     if(producto==0)   //VACIO
     PORTB.RB5=1;     //LED VERDE
     else
     PORTB.RB5=0;
}
void verdisplay (int producto)
{
int U,D;
D=producto/10; //primer numero
U=(producto-D*10); //segundo numero
PORTC=DIGITO[D]; //valor decenas
PORTD=1;         //ENCENDEMOS
Delay_ms(30);
PORTD=0;
PORTC=DIGITO[U]; //valor unidades
PORTD=2;         //ENCENDEMOS
Delay_ms(30);
PORTD=0;
}

archivos y simulacion
http://www.mediafire.com/?sxqnmw9l40xmzlg

No hay comentarios.:

Publicar un comentario