TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: misterweb en 17 de Diciembre de 2017, 19:53:02

Título: SUBRUTINA PARA 8 DIPLAY CONTROLADOS POR EL MAX7219
Publicado 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.


Citar
;***************************************************************************************
; 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.