# Como programar un pic16f877a como contador



## laurita_22g (Nov 3, 2008)

soy nueva en el mundo de como programar el pic16f877a.. me mandaron hacer un programa que cuente de 1 a 7, utilizando tres swiches y los muestre en un displays.. la verdad no tengo idea de como hacerlo.. se le agradece a quien pueda ayudarme..

*gracias*


----------



## Moyano Jonathan (Nov 3, 2008)

Hola, mirá tenes que ser más específica con lo que necesitas por ejemplo: que función cumple los 3 swiches y en que tipo de display necesitas para tu proyecto .
Despues de eso te puedo ayudar haciendo el programa en C


----------



## Julio Cesar12 (Nov 3, 2008)

Descarga el niple v5 es posible y te ayude a realizar el programa que quieres


----------



## laurita_22g (Nov 9, 2008)

necesito que en el puerto rao y ra1 poner dos swiches y que al pulsar uno se me active todo el puerto b y al pulsar el otro se active todo el puerto d pero no pueden estar ambos activados al mismo tiempo


----------



## Moyano Jonathan (Nov 9, 2008)

hola laurita_22g

acá están 2 posibles soluciones a lo que vos pediste.

espero que te sirva sino comenta


----------



## mecatrodatos (Nov 23, 2008)

He leido tu propuesta en el foro lo que he entendido es que por medio de un dipswiches de tres conectado al puerto A de Ra0 a Ra2 se ilustre los numeros de 1 a 7  en el puerto B o D donde se conecta un display ya sea de anodo comun o castodo comun.

te adjunto el programa fuente de los dos casos en donde se conecte un display de anodo o catodo comum , asi como su simulacion en proteus y el codigo .hex para programar el pic 16f877A, espero que te sirva , el codigo fuente esta comentado para su entendimiento, el programa  realiza el conteo con 4 interruptores leyendolo lo puedes modificar para que realice el conteo segun tu necesidad


----------



## mecatrodatos (Nov 23, 2008)

simulacion proteus adjunta

 Decodificador BCD a 7 segmentos primer caso 

```
;                                                                         
;Mediante los cuatro interruptores conectador a RA0-RA3 se aplica el código BCD de los números
;DEL 0 AL 15 . El programa obtiene el código de 7 segmentos para representar dicho
;número sobre un display de CATODO COMUN común, en el que cada segmento particular se activa mediante
;nivel lógico "0"

List	p=16F877A	;Tipo de procesador
		include	"P16F877A.INC"	;Definiciones de registros internos


		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x05		;Salva el vector de interrupción

Inicio	        clrf 	PORTB		;Borra los latch de salida
		bsf	STATUS,RP0	;Selecciona banco 1
		movlw	b'00000110'
		movwf	ADCON1		;Puerta A  digital
		clrf	TRISB		;Puerta B se configura como salida
		movlw	b'00001111'		
		movwf	TRISA		;Puerta A se configura como entrada
		bcf	STATUS,RP0	;Selecciona banco 0


Loop:		
		movf	PORTA,W		
		andlw	b'00001111'	;Lee las entradas RA0-RA3
		call	Tabla_7_seg	;Convierte el valor a código de 7 segmentos
		movwf	PORTB		;Lo deposita en la puerta de salida para visualizarlo
		goto	Loop


Tabla_7_seg	addwf	PCL,F		;Desplaza al PC tantas posiciones como indique el valor
					;del registro W
		retlw	3Fh        	;Código 7 seg. del dígito 0
		retlw	06h	;Código del 1
		retlw	5Bh	;2
		retlw	4Fh	;3
		retlw	66h	;4
		retlw	6Dh	;5
		retlw	7Dh	;6
		retlw	07h	;7
		retlw   7Fh	;8
		retlw	67h	;9
                retlw   77h     ;10(a)
                retlw   7Ch     ;11(b)
                retlw   39h     ;12(c)
                retlw   5Eh     ;13(d)
                retlw   79h     ;14(e)
                retlw   71h     ;15(f)
                
                
                END
```


segundo caso 


```
;Decodificador BCD a 7 segmentos
;                                                                         
;Mediante los cuatro interruptores conectador a RA0-RA3 se aplica el código BCD de los números
;DEL 0 AL 15 . El programa obtiene el código de 7 segmentos para representar dicho
;número sobre un display de ánodo común, en el que cada segmento particular se activa mediante
;nivel lógico "0"

List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos


		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x05		;Salva el vector de interrupción

Inicio	        clrf 	PORTB		;Borra los latch de salida
		bsf	STATUS,RP0	;Selecciona banco 1
		movlw	b'00000110'
		movwf	ADCON1		;Puerta A  digital
		clrf	TRISB		;Puerta B se configura como salida
		movlw	b'00001111'		
		movwf	TRISA		;Puerta A se configura como entrada
		bcf	STATUS,RP0	;Selecciona banco 0


Loop:		
		movf	PORTA,W		
		andlw	b'00001111'	;Lee las entradas RA0-RA3
		call	Tabla_7_seg	;Convierte el valor a código de 7 segmentos
		movwf	PORTB		;Lo deposita en la puerta de salida para visualizarlo
		goto	Loop


Tabla_7_seg	addwf	PCL,F		;Desplaza al PC tantas posiciones como indique el valor
					;del registro W
		retlw	b'11000000'	;Código 7 seg. del dígito 0
		retlw	b'11111001'	;Código del 1
		retlw	b'10100100'	;2
		retlw	b'10110000'	;3
		retlw	b'10011001'	;4
		retlw	b'10010010'	;5
		retlw	b'10000010'	;6
		retlw	b'11111000'	;7
		retlw	b'10000000'	;8
		retlw	b'10011000'	;9
                retlw   b'10100000'     ;10(a)
                retlw   b'10000011'     ;11(b)
                retlw   b'11000110'     ;12(c)
                retlw   b'10100001'     ;13(d)
                retlw   b'10000100'     ;14(e)
                retlw   b'10001110'     ;15(f)
                
                END
```


----------



## gemetzelgott (Nov 23, 2008)

Aqui esta un pequeño codigo en C, espero que esto sea lo que estas buscando.


```
#include <16f877a.h>
#use delay (clock=20000000)
#byte porta=5 
#byte portd=8
#byte portb=6     /*SE DEFINEN LOS PUERTOS Y LOS PINES DEL MICRO*/
#bit ra0=5.0
#bit ra1=5.1

void main()
{
 set_tris_a(255);
 set_tris_d(0);
 set_tris_b(0);      /*SE DEFINE LAS ENTRADAS Y LAS SALIDAS*/
 portd=0;
 portb=0;
 while(1)
 {
  if (ra0==0){       /*PREGUNTA SI ESTA PULSADO EL BOTON DE RA0*/
  portb=255;
   delay_ms(20);
   if (ra0==0)
   portd++;          /*IMCREMETA EL PUERTO*/
    if (portd>7)     /*SI EL PUERTO ES MAYOR A 7 VUELVE A CERO*/
     portd=0;
   while(ra0==0)     /*SISTEMA ANTIREBOTE*/
   {
   }
  }
  if (ra1==0){       /*PREGUNTA SI ESTA PULSADO EL BOTON DE RA1*/
   portd=255;
   delay_ms(20);
   if (ra1==0)
   portb++;          /*IMCREMETA EL PUERTO*/
    if (portb>7)     /*SI EL PUERTO ES MAYOR A 7 VUELVE A CERO*/
     portb=0;        
   while(ra1==0)     /*SISTEMA ANTIREBOTE*/
   {
   }
 } 
 }
}                    /*FIN*/
```


Adjunto te envío unas imágenes de la simulación, ya que el archivo en proteus no lo pude subir.


----------



## laurita_22g (Ene 26, 2009)

muchas gracias a todos por su ayuda me fue muy útil.


----------

