TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: misterweb en 17 de Diciembre de 2017, 19:53:02
-
De los multiples circuitos que venden para Arduino uno es un panel de 8 display controlados por el MAX7219,
y aunque he visto en este foro distintas subrutinas para controlar el MAX7219, que yo sepa no he encontrado ninguna que controle en concreto este modulo, asi que me anime a hacerla.
Animo a la gente que programe a construir subrutinas para circuitos que estan en principio construidos para Arduino, por que a parte de ser muy gratificante hacerlo uno mismo, el control del circuito es mucho mayor que si recibimos una libreria a la que por lo general no tenemos acceso.
Por otro lado, el tamaño del codigo en ensamblador por lo general suele ser mucho menor y mas rapido, como es el caso que de esta que habiendola echo de forma apresurada, ocupa menor espacio que una libreria de los arduinos.
Bueno aqui dejo solo la libreria y debajo el enlace para bajarsela, decir que esta probada y funcionando.
;***************************************************************************************
; Title: 8 DISPLAYS CONTROL CON EL MAX7219
; Autor: Mr_Electronico
; version: 1.0
; Fecha: 10/12/2017
; Este programa creado para controlar el modulo que venden de 8 display controlados por el MAX7219
; Para ser controlado por el PIC 18F4520 pero puede ser llevado facilmente a otro tipo pic o microcontrolador.
;
; EL DISPLAY PARA ADMITE SOLO CARACTERES ASCII POR LO CUAL LOS CARACTERES NUMERICOS HAY QUE CONVERTIRLOS HA ASCII
;
; LOS CARACTER ASCII QUE SOLO ADMITE SON : 0,1,2,3,4,5,6,7,8,A,B,C,D,E,F,G,H,I,J,L,M,N,O,P,Q,R,S,T,U,V
; NO ADMITE EL CARACTER K - LO PONDRA COMO APAGADO EL DISPLAY NI LOS CARACTERES W,Y,X,Z
;
; DEBIDO A LA LIMITACION DEL DISPLAY LOS CARACTERES NO SE MUESTRAN TAL CUALES EN ALGUNOS CASO ASI SE MOSTRARAN
; El I = 1 j = _| M=N= |-| O=o R = |- U=V = |_|
;
;
; PARA IMPRIMIR CUALQUIER DIGITO EN EN UN DISPLAY :
;
; MOVLW 04
; MOVWF DISP ; PARA INDICAR QUE QUEREMOS IMPRIMIR EL DISPLAY 4
; MOVLW 'N' ; CARGAMOS EL CARACTER QUE QUEREMOS QUE APAREZCA EN EL DISPLAY EN ESTE CASO N
; CALL SEND_DISPLAY ; Y INMEDIATAMENTE LLAMAMOS A LA FUNCION SEND_DISPLAY
; INMEDIATAMENTE NOS MOSTRARA EL CARACTER N EN LA POSICION 4 DEL DISPLAY.
;
; PARA BORRAR TODOS LOS DISPLAYS INVOCAREMOS A LA FUNCION
; CLEAR DISPLAY
;
; *********** IMPORTANTE*********************
; PARA INICIALIZAR TOD EL DISPLAY HAY QUE LLAMAR A LA FUNCION INIT_DISPLAY
; HAY QUE HACERLO AL PRINCIPIO SI NO NO ARRANCA EL DISPLAY.
;*************************************************************************************************************
#DEFINE DIN PORTD,2 ; DEFINE PUERTO LINEA DIN
#DEFINE LOAD PORTD,1 ; DEFINE PUERTO LINEA LOAD
#DEFINE CLK PORTD,0 ; DEFINE PUERTO LINEA CLK*/////
; DEFINICION MEMORIA DE REGISTROS DE DATOS
CBLOCK 0x30
ADDRES ; REGISTRO DE DIRECCIONES
DATOS ; REGISTRO DE DATOS.
NUMDISPLAY ; DISPLAYS QUE QUEREMOS QUE ESTEN ENCENDIDOS VER SUBRUTINA..
DISPLAYNUM ; DISPLAY QUE QUEREMOS METERLE EL DATO.
INTENSITY ; PARA INDICAR QUE NIVEL DE INTENSIDAD QUEREMOS DE 0h A 0Fh EN HEXADECIMAL.
TEMP1 ; REGISTRO PARA DATOS TEMPORALES
TEMP2 ; REGISTRO PARA DATOS TEMPORALES
DELAY ; REGISTROS PARA HACER EL RETARDO.
DELAY1 ; REGISTROS PARA HACER EL RETARDO.
DELAY2 ; REGISTROS PARA HACER EL RETARDO.
DECODENUM ; REGISTRO PARA DECODIFICACION NUMEROS.
DISP ; VALOR NUMERICO EN DISPLAY 1
ptr_pos ; PUNTERO DE LA TABLA
ENDC
TABLADIR equ 0x02000 ; Comienzo de la tabla donde iran almacenados datos de conversion a 7 segementos para display
;
;==============================================================================
; INICIALIZA DISPLAY PARA QUE EMPIECE A FUNCIONAR.
; LO DEJA CON TODOS LOS DISPLAY APAGADOS Y SOLO EL PRIMERO PUESTO CON
; VALOR NUMERICO 0 "-------0" SIENDO - APAGADO
; AQUI SE PUEDE MODIFICAR SI QUEREMOS OTRO VALOR DE INICIO POR DEFECTO.
;==============================================================================
INIT_DISPLAY
MOVLW 01h
MOVWF INTENSITY ; CARGA REGISTRO INTENSIDA A LA MITAD
MOVLW 07h ;
MOVWF NUMDISPLAY ; ELIGE QUE FUNCIONEN LOS 8 DISPLAYS
MOVLW 0h ;
MOVWF DECODENUM ; NO DECODIFIQUES LOS NUMERO.
MOVLW 0Ch ; FIJA EL DISPLAY EN FUNCIONAMIENTO.
MOVWF ADDRES
MOVLW 01h
MOVWF DATOS
CALL SEND_DATA ; ENVIA LOS DATOS
MOVLW 0Ah ; FIJA INTENSIDAD LUMINOSOSA A LA MITAD.
MOVWF ADDRES
MOVFF INTENSITY,DATOS
CALL SEND_DATA ; ENVIA LOS DATOS
MOVLW 0Bh ; FIJA EL NUMERO DE DISPLAYS A 8.
MOVWF ADDRES
MOVFF NUMDISPLAY,DATOS
CALL SEND_DATA ; ENVIA LOS DATOS
MOVLW 09h ; SIN DECODFICACION DE LOS NUMEROS.
MOVWF ADDRES
MOVFF DECODENUM,DATOS
CALL SEND_DATA ; ENVIA LOS DATOS
CALL CLEAR_DISPLAY
; SI SE QUISIERA EL EL DISPLAY INICIARA TODOS APAGADOS MENOS EL PRIMERO CON
; EL NUMERO 0 DEJARIAMOS LAS SIGUENTES LINEAS.
;MOVLW 01h
;MOVWF DISP
;MOVLW '0' ; FIJA DISPLAY 1 CON EL NUMERO 0
;CALL SEND_DISPLAY ;ENVIDA LOS DATOS PARA SACAR A DISPLAY.
RETURN
;==============================================================================
; ENVIA LOS 8 DIGITOS AL DISPLAY.
; LOS DATOS SE DEBEN ALMACENAR PREVIEMANETE EN LOS REGISTROS DE DISP1 A DISP8.
;==============================================================================
SEND_DISPLAY
CALL CONVERT_ASC_7SEG ; ENVIA EL CARACTER HEX PARA CONVERTIRLO A 7 SEGMENTOS.
MOVWF DATOS ; Y CARGA EL VALOR EN DATOS.
MOVFF DISP,ADDRES
CALL SEND_DATA
RETURN
;==============================================================================
; ENVIA LOS 16 BITS AL REGISTRO DE DIRECCIONES DEL MAX7219.
; 8 DE DIRCCIONES Y 8 DE DATOS.
;==============================================================================
SEND_DATA
BCF LOAD ; PON A CERO LA LINEA LOAD CARGA DE DATOS.
MOVLW 08h
MOVWF TEMP1 ; MUEVELO PARA INICIAR LA CUENTA DE ENVIO 8 DATOS
SEND_ADDRES ; APARTIR DE AQUI ENVIA LOS 8 BITS DE DIRECCION
BTFSC ADDRES,7 ; CHEQUEA LA POSICION 7 DEL REGISTRO ADRRES Y SI ES CERO SALTA
BSF DIN ; PON A UNO LINEA PORTD,RD2 (DATOS) DE SALIDA
BTFSS ADDRES,7 ; CHEQUEA LA POSICION 7 DEL REGISTRO ADRRES Y SI ES UNO SALTA
BCF DIN ; PON A CERO LINEA PORTD,RD2 (DATOS) DE SALIDA
CALL DELAY_TEMP
BSF CLK ; EN EL FLANCO DE SUBIDA SE CARGA EL DATO EN EL REGISTRO
CALL DELAY_TEMP
BCF CLK ; VUELVE A PONER A CERO CLK
RLNCF ADDRES ; ROTA UNA POSICION A LA IZQUIERDA REGISTRO ADDRES
DECFSZ TEMP1,F
BRA SEND_ADDRES
RLNCF ADDRES ; VUELVE A DEJAR EL REGISTRO DE ADDRESS COMO ESTABA
MOVLW 08h
MOVWF TEMP1 ; MUEVELO PARA INICIAR LA CUENTA DE ENVIO 8 DATOS
SEND_DATA2 ; APARTIR DE AQUI ENVIA LOS 8 BITS DE DATOS
BTFSC DATOS,7 ; CHEQUEA LA POSICION 7 DEL REGISTRO DATOS Y SI ES CERO SALTA
BSF DIN ; PON A UNO LINEA PORTD,RD2 (DATOS) DE SALIDA
BTFSS DATOS,7 ; CHEQUEA LA POSICION 7 DEL REGISTRO DATOS Y SI ES UNO SALTA
BCF DIN ; PON A CERO LINEA PORTD,RD2 (DATOS) DE SALIDA
CALL DELAY_TEMP
BSF CLK ; EN EL FLANCO DE SUBIDA SE CARGA EL DATO EN EL REGISTRO
CALL DELAY_TEMP
BCF CLK ; VUELVE A PONER A CERO CLK
RLNCF DATOS ; ROTA UNA POSICION A LA IZQUIERDA REGISTRO DATOS
DECFSZ TEMP1,F
BRA SEND_DATA2
RLNCF DATOS ; VUELVE A DEJAR EL REGISTRO DE DATOS COMO ESTABA
BSF LOAD ; PON LA LINEA LOAD A 1
RETURN
;*****************************************************************************
; BORRRA TODOS LOS DIPLAYS DEJANDOLOS APAGADOS
;
;*****************************************************************************
CLEAR_DISPLAY
MOVLW 08h ; LOS DEMAS DISPLAYS APAGADOS.
MOVWF TEMP2
LAZO
CLRF DATOS
MOVFF TEMP2,ADDRES
CALL SEND_DATA
DECFSZ TEMP2,F
BRA LAZO
;ENVIDA LOS DATOS PARA SACAR A DISPLAY.
RETURN
;*****************************************************************************
; CONVERSOR DE CARACTER DE LETRA O NUMERIOCO A CODIGO 7 SEGMENTOS
; A
; -----
; F| |B
; | G |
; -----
; E| |C
; | D |
; ----- EL PUNTO HABRA QUE AÑADIRSELE FUERA DE ESTA SUBRUTINA.
;*****************************************************************************
CONVERT_ASC_7SEG
MOVWF TEMP1
MOVLW 3Ah
SUBWF TEMP1,W
BTFSC STATUS,N
BRA salida
MOVLW 07h
SUBWF TEMP1,F
salida
MOVLW 30h
SUBWF TEMP1,F
MOVFF TEMP1,ptr_pos
CALL leer_tabla
RETURN
;*****************************************************************************
; TEMPORIZADOR QUE SE PODRA VARIAS SEGUN LA VELOCIDAD DEL MICROCONTROLADOR
; ESTE ESTA PUESTO DE UNA FORMA ALEATORIA
; EL MAX7219 VA A UNA FRECUENCIA DE 10 MHZ, LO QUE EN PRINCIPIO MARCA UNA
; VELOCIDAD DE RELOJ DE 100 nS CON ESTE RETARDO LE TIEMPO SUFICIENTE.
;*****************************************************************************
DELAY_TEMP
MOVLW D'05'
MOVWF DELAY
DELAY_LOOP
DECFSZ DELAY, F
GOTO DELAY_LOOP
RETURN
;----------------------------------------------------------------------------------------------
; leer_tabla = Subrutina que carga la memoria ram con la tabla apuntada por ptr_pos
;----------------------------------------------------------------------------------------------
leer_tabla
movlw 0h ; Carga direccion super alta de tabla de memoria flash
movwf TBLPTRU
movlw 20h
movwf TBLPTRH ; Carga direccion alta de tabla de memoria flash
movlw 0h
movwf TBLPTRL ; Carga direccion baja de tabla de memoria flash
movf ptr_pos,W
addwf TBLPTRL,F ; Carga la fila de 16 posiciones que queremos leer.
leer_proximo_caracter
tblrd*
movf TABLAT, W ; Consigue dato
return
;----------------------------------------------------------------------------------------------
; la tabla de datos
;----------------------------------------------------------------------------------------------
org TABLADIR ; TABLA CON DATOS DEL CONVERSION NUMERICO DISPLAY
DATA 0x067E,0x796D,0x5B33,0x705F,0x737F,0x1F77,0x3D4E,0x474F; NUMEROS 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
DATA 0x375F,0x3806,0x0E00,0x1515,0x671D,0x0573,0x465B,0x1C1C; CARACTERES G,H,I,J,--K OMITIDA- L,M,N,O,P,Q,R,S,T,U,V
TABEND
END
El enlace:
http://www.mediafire.com/file/rg5j5mfqmjiyyiq/MAX7219_SUBRUTINA.asm (http://www.mediafire.com/file/rg5j5mfqmjiyyiq/MAX7219_SUBRUTINA.asm)
Saludos.