aqui te envio, el codigo de de un cuenta revoluciones que estoy haciendo con un 16f84, los datos son los siguientes:
PORT B
B0 BCD - A
B1 BCD - B
B2 BCD - C
B3 BCD - D
B4 Base del transistor npn bc548 de masa del 1° Display
B5 Base del transistor npn bc548 de masa del 2° Display
B6 Base del transistor npn bc548 de masa del 3° Display
B7 Base del transistor npn bc548 de masa del 4° Display
PORT A
A0 Entrada 1
A1 Entrada 2
Cuando la secuencia de activacion es A0 A1 (los dos en nivel alto)
el contador suma
Cuando la secuencia es al reves el contador resta.
El codigo BCD va a un 4511 que es un decodificador bcd a 7 segmentos y las salidas a,b,c,d,e,f,g,e van a los 4 display a traves de resistencias de 450 ohms, las masas de los display van a 4 bc548, para realizar la multiplexacion.
el codigo en c para pwc es:



//contador.c
include "C:Archivos de programaPiccproyectomio.h"
//ESTADO CONTADOR 7 de diciembre de 2003
//Listo para comenzar rutina BCD
#USE delay (clock=4000000)
//variables de control de giro
int cond_der,cond_izq,izquierda,derecha;
signed int leer_puerto (void);
void main() {
int dato;
signed int unidad ,decena,centena, miles;
int time;
cond_izq=0;
cond_der=0;
izquierda=0;derecha=0;
time=10;
unidad=0;
decena=0;
centena=0;
miles=0;
dato=0;
//seteo de PUERTO_B todo salidas
SET_TRIS_B(0x00);
OUTPUT_B(0);
//seteo de PUERTO_A 3 in 2 out
//ra0 = barrera 1
//ra1 = barrera 2
//ra2 = reset
SET_TRIS_A(0x07);
dato==0;
while(1)
{
//going up
if(unidad==10){decena++;unidad=0;}
if(decena==10){centena++;decena=0;unidad=0;}
if(centena==10){miles++;decena=0;unidad=0;centena=0;}
if(miles==10){miles=0;centena=0;unidad=0;decena=0;}
//going down
if(unidad==11)
{
if(decena==0)
{decena=11;unidad=9;}
else
{decena--;unidad=9;}
}
if(decena==11)
{
if(centena==0)
{centena=11;decena=9;unidad=9;}
else
{
centena--;decena=9;unidad=9;
}
}
if(centena==11)
{
if(miles==0)
{miles=11;centena=9;decena=9;unidad=9;}
else
{
miles--;centena=9;decena=9;unidad=9;
}
}
if(miles==11)
{
miles=9;centena=9;decena=9;unidad=9;
}
/////////////////UNIDAD
if(unidad==0){OUTPUT_B(16);delay_ms(time);}
if(unidad==1){OUTPUT_B(17);delay_ms(time);}
if(unidad==2){OUTPUT_B(18);delay_ms(time);}
if(unidad==3){OUTPUT_B(19);delay_ms(time);}
if(unidad==4){OUTPUT_B(20);delay_ms(time);}
if(unidad==5){OUTPUT_B(21);delay_ms(time);}
if(unidad==6){OUTPUT_B(22);delay_ms(time);}
if(unidad==7){OUTPUT_B(23);delay_ms(time);}
if(unidad==8){OUTPUT_B(24);delay_ms(time);}
if(unidad==9){OUTPUT_B(25);delay_ms(time);}
/////////////////DECENA
if(decena==0){OUTPUT_B(32);delay_ms(time);}
if(decena==1){OUTPUT_B(33);delay_ms(time);}
if(decena==2){OUTPUT_B(34);delay_ms(time);}
if(decena==3){OUTPUT_B(35);delay_ms(time);}
if(decena==4){OUTPUT_B(36);delay_ms(time);}
if(decena==5){OUTPUT_B(37);delay_ms(time);}
if(decena==6){OUTPUT_B(38);delay_ms(time);}
if(decena==7){OUTPUT_B(39);delay_ms(time);}
if(decena==8){OUTPUT_B(40);delay_ms(time);}
if(decena==9){OUTPUT_B(41);delay_ms(time);}
//////////////////CENTENA
if(centena==0){OUTPUT_B(64);delay_ms(time);}
if(centena==1){OUTPUT_B(65);delay_ms(time);}
if(centena==2){OUTPUT_B(66);delay_ms(time);}
if(centena==3){OUTPUT_B(67);delay_ms(time);}
if(centena==4){OUTPUT_B(68);delay_ms(time);}
if(centena==5){OUTPUT_B(69);delay_ms(time);}
if(centena==6){OUTPUT_B(70);delay_ms(time);}
if(centena==7){OUTPUT_B(71);delay_ms(time);}
if(centena==8){OUTPUT_B(72);delay_ms(time);}
if(centena==9){OUTPUT_B(73);delay_ms(time);}
//////////////////MILES
if(miles==0){OUTPUT_B(128);delay_ms(time);}
if(miles==1){OUTPUT_B(129);delay_ms(time);}
if(miles==2){OUTPUT_B(130);delay_ms(time);}
if(miles==3){OUTPUT_B(131);delay_ms(time);}
if(miles==4){OUTPUT_B(132);delay_ms(time);}
if(miles==5){OUTPUT_B(133);delay_ms(time);}
if(miles==6){OUTPUT_B(134);delay_ms(time);}
if(miles==7){OUTPUT_B(135);delay_ms(time);}
if(miles==8){OUTPUT_B(136);delay_ms(time);}
if(miles==9){OUTPUT_B(137);delay_ms(time);}
dato=leer_puerto();
if(dato==1)
unidad+=dato;
if(dato==2)
unidad=decena=miles=centena=0;
if(dato==3)
{
if(unidad==0)
unidad=11;
else
unidad--;
}
delay_ms(10);
//dato++;
//if(dato==5){unidad++;dato=0;}
/*//BUCLE DE PRUEBA
OUTPUT_B(16);//0
delay_ms(500);
OUTPUT_B(17);//8
delay_ms(500);
OUTPUT_B(18);//4
delay_ms(500);*/
}
}
int leer_puerto(void)
{
int full,izq,der,reset;
full=input_a();
izq=full&1;
der=(full&2)>>1;
reset=(full&4)>>2;
/*if(reset)
return(2);
/* if(izq&&!der)
cond_izq=1;
if(der&&!izq)
cond_der=1;
Espero haberte sido de ayuda
Hasta pronto!!
if(cond_der && der && izq)
{
cond_der=0;
return(1);
}
full=input_a();
izq=full&1;
der=(full&2)>>1;
if(cond_izq && der && izq)
{
return(3);
cond_izq=0;
}
else
return(0);*/
if(izq&!der)
izquierda=1;
if(der&!izq)
derecha=1;
if(izq&der&izquierda)
{izquierda=0;return(3);}
if(izq&der&derecha)
{derecha=0;return(1);}
}



y la cabecera que menciona al pcicio es
//mio.h
#include <16F84A.h>
#use delay(clock=4000000)
#fuses RC,NOWDT,NOPROTECT,PUT

