/*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 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