Hola que tal? Antes que nada queria agradecerle al foro por haber despertado mi apetito por los PIC
Les cuento sobre mi problema a ver si me pueden ayudar, ya que estuve usando el buscador (alabado sea) pero en este caso no creo haber dado con lo que busco...
En este proyecto necesito que un contador cuente de 0 hasta 1000, y que muestre la cuenta en 4 displays de 7 segmentos. El tiempo que toma en llegar hasta 1000 pueden ser aproximadamente 10 segundos (no es critico el tiempo exacto). Tambien mientras se lleva la cuenta y se muestra en el display (hacer todo en simultaneo es lo que no me sale
), tengo que prender y apagar 6 led a una frecuencia de 1hz.
La cuenta se frena al presionar un boton y dependiendo el numero en que se haya frenado, se habilitan o se deshabilitan ciertos puertos.
Otra complicacion que no puedo superar es que la cuenta no es lineal. Desde 0 a 500 toma un tiempo, 6 segundos supongamos, y de 500 a mil los 4 segundos restantes. Necesito poder jugar con esos valores porque son a
prueba-error...
El bosquejo del programa lo hice con un bucle for que llega hasta 1000, aunque creo que no es el mejor metodo.
Probe usando delay_ms(x) e ir variando x en funcion del numero del contador, cosa que funciona pero me complica q se vean los displays normalmente.
Espero que puedan ayudarme...un saludo!
Les dejo mi humilde codigo, no se rian
#include <16f877a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,NOPUT //ordenes para el programador
#use delay(clock=20000000) //Fosc=2Mhz
#use standard_io(a)
#use standard_io(b)
void main()
{
int16 cont, time;
int digito1, digito2, digito3, digito4;
// 0 1 2 3 4 5 6 7 8 9
int display[10]={0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b};
set_tris_a(0b00001);
set_tris_b(0);
while(input(PIN_A0)==0); //inicio...
for(cont=1; cont<=1000; cont++)
{
digito1=cont%10;
digito2=cont/10;
digito3=cont/100;
digito4=cont/1000;
output_high(PIN_A1);
output_b(display[digito1]);
delay_ms(5);
output_low(PIN_A1);
output_high(PIN_A2);
output_b(display[digito2]);
delay_ms(5);
output_low(PIN_A2);
output_high(PIN_A3);
output_b(display[digito3]);
delay_ms(5);
output_low(PIN_A3);
output_high(PIN_A4);
output_b(display[digito4]);
delay_ms(5);
output_low(PIN_A4);
if((cont>=0)&&(cont<=100))
time=200;
if((cont>100)&&(cont<=200))
time=180;
if((cont>200)&&(cont<=300))
time=160;
if((cont>300)&&(cont<=400))
time=140;
if((cont>400)&&(cont<=500))
time=120;
if((cont>500)&&(cont<=600))
time=100;
if((cont>600)&&(cont<=700))
time=80;
if((cont>700)&&(cont<=800))
time=60;
if((cont>800)&&(cont<=900))
time=40;
if((cont>900)&&(cont<=1000))
time=20;
delay_ms(time);
}
}