# Cómo manejar 4 led 7 segmentos con un pic ?



## juanfrj (Ago 16, 2006)

Cordial saludo
agradeceria que alguien me dijera como mostrar un numero de 4 digitos, utilizando solo 4 o 7 lineas de un puerto de un pic con 4 displays de 7 segmentos,
que es lo que hay que hacer?
muchas gracias
juan fernando


----------



## leo_programer (Ago 16, 2006)

que mas juan?, fijese

es lo mas breve del mundo, eso se llama multiplexacion, bueno, no creo que sea una palabra valida pero bueno, en todo caso, los cuatro displays de 7 segmentos van conectados todos al mismo puerto, y ahora pues... depende, si son displays de anodo comun, entonces lo conectas al emisor de un 2n3904, o sea, cuatro 2n3904 van conectados a los displays, desde su emisor, sus colectores van a vcc, y lo que son sus cuatro bases, van a cuatro patas mas del micro, eso si es indispensable, ahora bien, eso es el hardware.
el software es lo mas breve del mundo tambien, no se pueden mostrar todos los datos al mismo tiempo, toca multiplexarlos, so, tienes cuatro variables con el valor de cada uno de los digitos, comienza primero colocando cada salida de los displays en cero, colocas el primer numero, ya sea la unidad, en el puerto del micro, y activas el transistor de la unidad, espera que se yo, 10ms, descativas el transistor de la unidad, pones en el puerto la decena, y activas el transistor de la decena, espera 10ms y sigue sucesivamente con el resto, el tiempo que quiera que se vea el numero de cutro digitos, espera que valla a la casa, busco un programa que hace eso, hecho por mi, y lo posteo, para que se de una idea, en resumen:

un puerto para el numero,
cuatro patas de otro puerto para los cuatro displays,
desactivas todos los displays,
poner el primer digito en el puerto,
activa el primer display,
espera como 10 ms(tambien se puede con 30ms, o 33, pero se veran los displays tilitando),
desactiva el display,
pone el segundo digito,
activa el segundo display,
espera,
desactiva,
etc...

eso es multiplexacion, entre menos tiempo espere entre cada display mejor, el ojo humano no nota la diferencia, y pareciera que todos estuvieran al mismo tiempo, cualquier cosa me avisa, cuidese...


----------



## ben99 (Ago 16, 2006)

yo he utilizado transistores 3904 para comandar display de anodo comun asi:

la base> salida del puerto para comandar lo display
el emisor> se conecta a vcc
el colector> se conecta a comun de los display
PARA DOS DISPLAY
VISUALIZACION  
	MOVF	UNIDAD,W
	CALL	TABLA
	BCF	PORTA,4
                BSF          PORTB,7
	MOVWF	PORTB
	CALL	RETARDO
	BSF	PORTA,4
	MOVF	DECENAS,W
	CALL	TABLA
	MOVWF	PORTB
	BCF	PORTB,7
	CALL	RETARDO
	BSF	PORTB,7	
	RETURN


----------



## leo_programer (Ago 16, 2006)

en teoria, por que no lo he probado asi, sirve, asi es como es, aqui mando una imagen con el esquematico, no encontre el codigo, cuidense...


----------



## juanfrj (Ago 17, 2006)

listo, muchas gracias por todo, al fin lo puse a funcionar y todo perfecto.
suerte


----------



## alejitox20 (Jul 28, 2009)

ola buenas quisiera saber como puedo hacer un contador ascendente/descendente de 0 a 999 usando un pic16f84a o un 628 cualquiera de los dos me sirve por que teng una idea pero no se si sera cierta..-...primero quisiera darle un pulso de entrada que me active todo el proceso noc si puedo hacerlo asi.... : introduzco un valor binario por ejemplo 00000000 y lo que ago es incrementarlo hasta que me llegue al 999 en decimal obvio eso lo leera como hex....aaam necesito usar 4 displays.....pero luego de tenerlo a 999 como hago para que el micro sepa que llego a su final y debe retroceder? y en la parte del descenso lo podria decrementar ese valor.............bueno mas o menos es la idea que tengo pero noc me podrian dar una mano con eso se les agradeceria......


----------



## rivale (Feb 6, 2010)

Hola alejitox, primero, para que necesita cuatro displays si solo vas a ocupar 3, depende de en que estes programando, si programas en C solo nedcesitas un if para saber si llego al final y luego lo envias a una funcion que lo decremente.


----------



## trokbknm (Feb 3, 2014)

Bueno estoy desarrollando una práctica, la cual consiste en mover el mensaje HOLA letra por letra en displays de 7 segmentos cátodo común desarrolle los siguientes programas en MPLAB pero pues no funcionan y no detecto el problema 

VERSIÓN 1 CON TABLAS


```
list        p=16f886    ; list directive to define processor
    #include    <p16f886.inc>   ; processor specific variable definitions


    __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
    __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V

RESET_VECTOR    CODE    0x0000 ; processor reset vector
    nop
    goto    start              ; go to beginning of program

INT_VECTOR      CODE    0x0004 ; interrupt vector location


MAIN_PROG	CODE 0X05       
	TABLA
	ADDWF PCL
	RETLW B'00000000'
	RETLW B'00000000'
	RETLW B'00000000'
	RETLW B'00000000'
	RETLW B'00000000'
	RETLW B'00000000'
	RETLW B'00110111'
	RETLW B'01111110'
	RETLW B'00001110'
	RETLW B'01110111'
	RETLW B'00000000'
	RETLW B'00000000'
	RETLW B'00000000'
	RETLW B'00000000'
	RETLW B'00000000'
	RETLW B'00000000'
	
	GOTO PROG

	DATOS
	MOVLW D'1'
	MOVWF 0X50
	MOVLW D'2'
	MOVWF 0X21
	MOVLW D'3'
	MOVWF 0X22
	MOVLW D'4'
	MOVWF 0X23
	MOVLW D'5'
	MOVWF 0X24
	MOVLW D'6'
	MOVWF 0X25
	RETURN
	
	INCREMENTO
	INCFSZ 0X50
	INCFSZ 0X21
	INCFSZ 0X22
	INCFSZ 0X23
	INCFSZ 0X24	
	INCFSZ 0X25
	RETURN


;SUBRUTINA 
	
	TIME
	MOVLW D'5'
	MOVWF 0X26
	TIME1
	MOVLW D'200'
	MOVWF 0X27
	TIME2 NOP
	DECFSZ 0X27
	GOTO TIME2
	DECFSZ 0X26
	GOTO TIME1
	RETURN

start
	MOVLW 0X20
	MOVWF STATUS
	CLRF TRISA
	CLRF TRISC
	MOVLW 0X60
	MOVWF STATUS
	CLRF ANSEL
	CLRF ANSELH
	CLRF STATUS
	PROG
	CALL DATOS

	PROG1
	MOVLW D'10'
	MOVWF 0X30
	PROG2
	MOVLW B'11011111'
	MOVWF PORTA
	MOVFW 0X25
	CALL TABLA
	MOVWF PORTB
	CALL TIME

	MOVLW B'11101111'
	MOVWF PORTA
	MOVFW 0X24
	CALL TABLA
	MOVWF PORTB
	CALL TIME

	MOVLW B'11110111'
	MOVWF PORTA
	MOVFW 0X23
	CALL TABLA
	MOVWF PORTB
	CALL TIME

	MOVLW B'11111011'
	MOVWF PORTA
	MOVFW 0X22
	CALL TABLA
	MOVWF PORTB
	CALL TIME

	MOVLW B'11111101'
	MOVWF PORTA
	MOVFW 0X21
	CALL TABLA
	MOVWF PORTC
	CALL TIME

	MOVLW B'11111110'
	MOVWF PORTA
	MOVFW 0X50
	CALL TABLA
	MOVWF PORTB
	CALL TIME
	DECFSZ 0X30
	GOTO PROG2
	CALL INCREMENTO	
	GOTO PROG1

    END
```

VESIÓN 2 UTILIZANDO INSTRUCCIONES BSF Y BCF


```
list        p=16f886    
    #include    <p16f886.inc>   

    __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
    __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V
		

RESET_VECTOR    CODE    0x0000 
    nop
    goto    start           

	MAIN_PROG     
	
;SUBRUTINA 1 SEGUNDO
	TIME
	MOVLW D'10'
	GOTO RETARDO_1DECIMA
	RETARDO_1DECIMA
	MOVWF 0X24
	R1DECIMA_BUCLE_EXTERNO2
	MOVLW D'100'
	MOVWF 0X25
	R1DECIMA_BUCLE_EXTERNO
	MOVLW D'249'
	MOVWF 0X26
	R1DECIMA_BUCLEINTERNO
	NOP
	DECFSZ 0X26,F
	GOTO R1DECIMA_BUCLEINTERNO
	DECFSZ 0X25,F
	GOTO R1DECIMA_BUCLE_EXTERNO
	DECFSZ 0X24,F
	GOTO R1DECIMA_BUCLE_EXTERNO2
	RETURN

	start
;CONFIGURACIÓN DE PUERTOS
	
	MOVLW 0X20
	MOVWF STATUS
	CLRF TRISA
	CLRF TRISC
	MOVLW 0X60
	MOVWF STATUS
	CLRF ANSEL
	CLRF ANSELH
	CLRF STATUS
;***********************************************************************************************************************************
;BASE DEL PROGRAMA
	PRINCIPIO_HOLA
	;PARA LETRA "H"
	MOVLW D'1'
	MOVWF 0X30
	MOVLW B'00110111' ;LETRA H
	MOVWF PORTB
	BCF PORTA,RA0
	CALL TIME
	BSF PORTA,RA0
	BCF PORTA,RA1 ;(PREGUNTAR SI LLEGO A 0)
	CALL TIME
	BSF PORTA,RA1
	BCF PORTA,RA2
	CALL TIME
	BSF PORTA,RA2
	BCF PORTA,RA3
	DECFSZ 0X30
	GOTO LETRAO
	;PARA LETRA "O"
	LETRAO	
	MOVLW D'10'
	MOVWF 0X31
	MOVLW B'01111110' ;LETRA O
	MOVWF PORTB
	BCF PORTA,RA0
	CALL TIME
	BSF PORTA,RA1 ;PREGUNTAR SI LLEGO A 0
	CALL TIME
	BSF PORTA,RA1
	BCF PORTA,RA2
	CALL TIME 
	BSF PORTA,RA2
	DECFSZ 0X31
	GOTO LETRAL
	;PARE LETRA "L"
	LETRAL
	MOVLW D'10'
	MOVWF 0X32
	MOVLW B'00001110' ;LETRA L
    MOVWF PORTB
	BCF PORTA,RA0
	CALL TIME
	BSF PORTA,RA0
	BCF PORTA,RA1
	CALL TIME
	BSF PORTA,RA1
	DECFSZ 0X32

	;PARA LETRA "A"
	MOVLW D'10'
	MOVWF 0X33
	MOVLW B'01110111' ;LETRA A
	MOVWF PORTB
	BCF PORTA,RA0
	CALL TIME
	BSF PORTA,RA0
	DECFSZ 0X33
	GOTO PRINCIPIO_HOLA
	END

;ELABORATED BY VIKTROK
```


----------



## D@rkbytes (Feb 6, 2014)

trokbknm dijo:


> Bueno estoy desarrollando una práctica, la cual consiste en mover el mensaje HOLA letra por letra en displays de 7 segmentos cátodo común


Adjunto un ejemplo para mostrar la palabra HOLA en 4 displays de 7 segmentos.
La palabra HOLA va desplazándose de derecha a izquierda sobre los displays.
Para lograr el efecto se utiliza el método de multiplexado.

El programa está escrito para un PIC16F628A pero lo puedes migrar fácilmente al PIC que quieras.
Los displays son de ánodo común pero modificando el programa se pueden usar de cátodo común.
Espero te sirva cómo base para lo que deseas hacer.

Suerte.


----------

