InicioTaringaMultiplexar con PIC 16f877a display 7SEG

Multiplexar con PIC 16f877a display 7SEG

Taringa1/29/2010
Hola taringueros, este es mi primer post espero que les sea de interes
********************************************************************************************

Hace poco tiempo que cacharreo con estos microcontroladores, y buscando ejemplos para multiplexar en asembler no consegui mucha informacion, bueno improvisemos me dije y este fue el resultado.

Utilice el PIC 16f877a, tres display de siete segmentos de katodo comun. La idea es utilizar el canal analogo AN0 para leer una señal de voltage proporcionada con algun sensor, luego convertir el dato de binario puro a BCD y finalmente convertirlo a codigo display 7seg para sacarlo por el puerto B controlando el encendido de los display con el puerto C.

Para comenzar el programa
se define los controles de los display y tambien la entrada analoga unos registros de trabajo a travez de la directriz CBLOK /ENDC y se hace una macros para controlar el cambio de bancos como se ve enseguida.




#define DISPLAY1 PORTC, 2
#define DISPLAY2 PORTC, 3
#define DISPLAY3 PORTC, 4
#define MEDIDA PORTA, 0

;**************************************************************************************
;**************************************************************************************
CBLOCK 20H
UNI ;Usados para manejar los datos a mostrar en los display
DEC
CEN
tiempo1 ;Usados para temporizar
tiempo2
DATO1
DATO2
DATO3
mayor
BUFFER
ADDR
MEN
BUFFER1
ENDC


;*********************************************************************************************
;*******************************MACROS DE CONTROL DE BANCOS***********************************
BANK0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM

BANK1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK2 MACRO
BCF STATUS,RP0
BSF STATUS,RP1
ENDM

BANK3 MACRO
BSF STATUS,RP0
BSF STATUS,RP1
ENDM


Seguido de esto se configuran los puertos, puerto A como entradas AN0 canal analogo, puertos B,C,D como salidas y se enciende el conversor A/D.

BANK1
MOVLW b'11001110'
MOVWF ADCON1
movlw b'00011111' ;Configura puerto A
movwf TRISA
clrf TRISB ;Puerto B completo como salidas
clrf TRISC ;Puerto C completo como salidas
clrf TRISD
BANK0 ;Pasa a página 0
movlw b'01000001' ;Enciende y configura el convertidor A/D
movwf ADCON0



Bueno el inicio se limpian los registros UNI,DEC,CEN, se inicia el muestreo y espera que termine la convercion una vez termina se lee el resultado en el registro ADRESL y se guarda el dato en el registro BUFFER para luego trabajar con el en las subrutinas

INICIO
CLRF UNI
CLRF DEC
CLRF CEN


CICLO BSF ADCON0,GO_DONE ;Inicia la conversión A/D
BTFSC ADCON0,GO_DONE ;Espera que termine de convertir
goto $ -1

BANK1 ;Pasa a página 1 (para acceder a los ocho bits bajos del resultado)
MOVFW ADRESL ;Resultado de conversión -> W
BANK0 ;Pasa a página 0
MOVWF BUFFER

BANK0 ;Pasa a página 0
CALL BIN8_BCD3
CALL VISUALIZA
GOTO INICIO



Esta es la subrutina que convierte el dato de binario a BCD, esta la encontre en interne pero le hice una pequeña modificacion al final para obtener cada dato para cada display, inicialmente la subrutina entrega el codigo de la siguiente manera en niblee de mayor peso en DATO1 y los otros dos en DATO2. Ej: para 123, en DATO1 tendriamos '0000 0001' y en DATO2 '0010 0011' , lo que hice es pasar Dato1 a CEN y pasar el niblee alto de dato2 a DEC y el bajo a UNI

BIN8_BCD3
clrf DATO1
clrf DATO2
BCD_HIGH
movlw .100
subwf BUFFER,f
btfss STATUS,C
goto SUMA_100
incf DATO1,f
goto BCD_HIGH
SUMA_100
movlw .100
addwf BUFFER,f
movlw 0x0F
movwf DATO2
BCD_LOW movlw .10
subwf BUFFER,f
btfss STATUS,C
goto SUMA_10
incf DATO2
movlw 0x0F
iorwf DATO2
goto BCD_LOW
SUMA_10 movlw .10
addwf BUFFER,f
movlw 0xF0
andwf DATO2,f
movf BUFFER,w
iorwf DATO2,f
movFW DATO1
MOVWF CEN
MOVLW b'00001111'
ANDWF DATO2,W
MOVWF UNI
SWAPF DATO2,W
ANDLW b'00001111'
MOVWF DEC
RETURN



El codigo en BCD se encontrara guardado en tres registros llamados CEN,DEN,UNI, los cuales al enviarlos atravez de la sigiente tabla son convertidos en codigo para los display

TABLA ADDWF PCL,F
retlw 0X3F ;genera el 0
retlw 0X06 ;genera el 1
retlw 0X5B ;genera el 2
retlw 0X04 ;genera el 3
retlw 0X66 ;genera el 4
retlw 0X6D ;genera el 5
retlw 0X7D ;genera el 6
retlw 0X07 ;genera el 7
retlw 0X7F ;genera el 8
retlw 0X6F ;genera el 9


Esta es la subrutina encargada de visualizar el dato en los display,toma el dato de CEN lo carga en la tabla y lo envia al puertoB enciende display1 o pouertoC,2 durante 1ms y repite la accion para los demas datos.

VISUALIZA MOVFW CEN
CALL TABLA
MOVWF PORTB
BSF DISPLAY1
CALL DELAY300
BCF DISPLAY1
MOVFW DEC
CALL TABLA
MOVWF PORTB
BSF DISPLAY2
CALL DELAY300
BCF DISPLAY2
MOVFW UNI
CALL TABLA
MOVWF PORTB
BSF DISPLAY3
CALL DELAY300
BCF DISPLAY3
RETURN


Esta es la subrutina de retardos la encontre en internet en la cual se carga el valor deseado de ms en W i listo

DELAY300 MOVLW d'1'

DEMORA MOVLW tiempo2 ;Demora tantos milisegundos como valor en w
TOP2 MOVLW d'110'
MOVLW tiempo1
TOP1 NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ tiempo1, 1
GOTO TOP1
DECFSZ tiempo2, 1
GOTO TOP2
RETURN




A continuacion unas imagenes en proteus




la simulacion se ejecuto con proteus, se deben hacer pequeños ajustes dependiendo de la resolucion del sensor a utiluzar ya sea por hardware o por software.


espero sea de su utilidad y agrado

Porfa Comentar, para mejorar!!!!!

Datos archivados del Taringa! original
10puntos
9,683visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
5visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

Autor del Post

a
alvar26🇦🇷
Usuario
Puntos0
Posts2
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.