Banner publicitario de PCBWay

Como programar un pic16f877a como contador

Estado
Cerrado para nuevas respuestas.
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
 
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
 
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
 
hola laurita_22g

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

espero que te sirva sino comenta
 

Adjuntos

  • posibles_soluciones_843.rar
    15.1 KB · Visitas: 1,051
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
 

Adjuntos

  • display_108.asm
    1.8 KB · Visitas: 626
simulacion proteus adjunta

Decodificador BCD a 7 segmentos primer caso
Código:
;                                                                         
;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

Código:
;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
 
Aqui esta un pequeño codigo en C, espero que esto sea lo que estas buscando.

Código:
#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.
 

Adjuntos

  • conta0_7_193.jpg
    conta0_7_193.jpg
    48.2 KB · Visitas: 312
  • conta0_71_208.jpg
    conta0_71_208.jpg
    47.4 KB · Visitas: 319
  • conta0_72_185.jpg
    conta0_72_185.jpg
    47.6 KB · Visitas: 467
Estado
Cerrado para nuevas respuestas.
Atrás
Arriba