Autor Tema: manejo display 8x8 con pic  (Leído 1951 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado allweb

  • PIC10
  • *
  • Mensajes: 1
manejo display 8x8 con pic
« en: 21 de Enero de 2016, 13:07:23 »
Estimados Colegas;
Este es mi primer post. Ando jugando un poco con los pic's, como recordando épocas universitarias,ya que siempre es bueno mantenerse fresco para que no se olvide.
Me ha llegado un display 8x8: http://www.ebay.com/itm/5PCS-8x8-3mm-Dot-Matrix-display-Red-LED-Display-Common-Anode-/381374573303?hash=item58cbb22af7:g:D6AAAOSwAL9UkC~J
Haciendo test con un multímetro conseguí el patillaje, el cual detallo: Mirándolo desde el lado de los leds (enfrente) y de izquierda a derecha. Esa es la posición de los pines. C*=columna; F*=fila

C1              C3
F5              C6
F3              F4
C4              C8
F8              F6
C2              F7
F2              C7
F1              C5

Matriz de led's
F1  °  °   °   °   °   °   °   °
F2  °  °   °   °   °   °   °   °
F3  °  °   °   °   °   °   °   °
F4  °  °   °   °   °   °   °   °
F5  °  °   °   °   °   °   °   °
F6  °  °   °   °   °   °   °   °
F7  °  °   °   °   °   °   °   °
F8  °  °   °   °   °   °   °   °
   C1 C2 C3 C4 C5 C6 C7 C8

El puerto B gobierna las filas. F1=PB0; F2=PB1; F3=PB2; .....
El puerto C gobierna la activación de cada columna. C1=PC0; C2=PC1; ......
El reloj usado es 20MHz

Este es el código en ASM.
Código: ASM
  1. ;-------------------------------------------------------
  2. ;Realizado por          :       allweb
  3. ;IDE                    :       PIKLAB 0.16.2
  4. ;Sistema Operativo      :       DEBIAN 8
  5. ;Compilador             :       GPUTILS
  6. ;Hardware Programador   :       Pickit2 - ICSP
  7. ;Software programador   :       pk2cmd
  8. ;PIC                    :       16f873A
  9. ;Cristal                :       20MHz
  10. ;
  11. ;Programa que controla matriz de LED's 8x8
  12. ;Se define PORTB como salida y control de las filas
  13. ;Se define PORTC como salida y control de la columnas
  14. ;Palabra a mostrar: HOLA
  15. ;-------------------------------------------------------
  16.     #include <p16f873a.inc>
  17.  
  18.     __config 0x3f32
  19. ; -----------------------------------------------------------------------
  20. ;Variables usadas
  21. CONTA1  EQU     0x21
  22. CONTA2  EQU     0x22
  23. CONTA3  EQU     0x23
  24. AUX1    EQU     0x24
  25. TEMP1   EQU     0x25
  26. TEMP2   EQU     0x26
  27. ; -----------------------------------------------------------------------
  28. ; Declaración DEFINES
  29. #DEFINE C1      PORTC,0
  30. #DEFINE C2      PORTC,1
  31. #DEFINE C3      PORTC,2
  32. #DEFINE C4      PORTC,3
  33. #DEFINE C5      PORTC,4
  34. #DEFINE C6      PORTC,5
  35. #DEFINE C7      PORTC,6
  36. #DEFINE C8      PORTC,7
  37.  
  38. ; -----------------------------------------------------------------------
  39. ;Colocación del programa
  40.       ORG       0
  41.       GOTO      INICIO
  42.       ORG       5
  43. ; -----------------------------------------------------------------------
  44. ;Comienzo del programa
  45. INICIO
  46.       BSF       STATUS,RP0      ; vamos al Banco 1 para configurar los puertos
  47.       BCF       STATUS,RP1
  48.       CLRF      TRISB           ;limpiamos TRISB, osea PORTB como salidas para las filas
  49.       CLRF      TRISC           ;limpiamos TRISB, osea PORTC como salidas para las columnas
  50.       BCF       STATUS,RP0      ; regresamos al banco 0
  51.       MOVLW     d'1'            ;VALOR DE LA RAPIDEZ ENTRE COLUMNAS EN ms
  52.       MOVWF     TEMP1           ;REGISTRA LA RAPIDEZ ENTRE COLUMNAS
  53.       MOVLW     d'100'          ;VALOR DE LA RAPIDEZ ENTRE LETRA Y LETRA EN ms
  54.       MOVWF     TEMP2           ;REGISTRA LA RAPIDEZ ENTRE LETRA Y LETRA
  55.  
  56. EJECUCION
  57. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  58.       MOVF      TEMP2,0
  59.       MOVWF     AUX1
  60. LETRA_H
  61. ; COLUMNA 1
  62.       MOVLW     0xFF
  63.       MOVWF     PORTB
  64.       MOVLW     0XFE
  65.       MOVWF     PORTC
  66.       MOVF      TEMP1,0
  67.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  68. ;COLUMNA 2
  69.       MOVLW     0xFF
  70.       MOVWF     PORTB
  71.       MOVLW     0XFD
  72.       MOVWF     PORTC
  73.       MOVF      TEMP1,0
  74.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  75. ;COLUMNA 3
  76.       MOVLW     0x18
  77.       MOVWF     PORTB
  78.       MOVLW     0XFB
  79.       MOVWF     PORTC
  80.       MOVF      TEMP1,0
  81.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  82. ;COLUMNA 4
  83.       MOVLW     0x18
  84.       MOVWF     PORTB
  85.       MOVLW     0XF7
  86.       MOVWF     PORTC
  87.       MOVF      TEMP1,0
  88.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  89. ;COLUMNA 5
  90.       MOVLW     0x18
  91.       MOVWF     PORTB
  92.       MOVLW     0XEF
  93.       MOVWF     PORTC
  94.       MOVF      TEMP1,0
  95.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  96. ;COLUMNA 6
  97.       MOVLW     0x18
  98.       MOVWF     PORTB
  99.       MOVLW     0XDF
  100.       MOVWF     PORTC
  101.       MOVF      TEMP1,0
  102.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  103. ;COLUMNA 7
  104.       MOVLW     0xFF
  105.       MOVWF     PORTB
  106.       MOVLW     0XBF
  107.       MOVWF     PORTC
  108.       MOVF      TEMP1,0
  109.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  110. ;COLUMNA 8
  111.       MOVLW     0xFF
  112.       MOVWF     PORTB
  113.       MOVLW     0X7F
  114.       MOVWF     PORTC
  115.       MOVF      TEMP1,0
  116.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  117. ;;;;;REPETICION DE LETRA
  118.       DECFSZ    AUX1,1
  119.       GOTO      LETRA_H
  120. ;;;;;APAGA FILAS Y COLUMNAS
  121.       CLRF      PORTB
  122. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  123.       MOVF      TEMP2,0
  124.       MOVWF     AUX1
  125. LETRA_O
  126. ; COLUMNA 1
  127.       MOVLW     0x3C
  128.       MOVWF     PORTB
  129.       MOVLW     0XFE
  130.       MOVWF     PORTC
  131.       MOVF      TEMP1,0
  132.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  133. ;COLUMNA 2
  134.       MOVLW     0x7E
  135.       MOVWF     PORTB
  136.       MOVLW     0XFD
  137.       MOVWF     PORTC
  138.       MOVF      TEMP1,0
  139.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  140. ;COLUMNA 3
  141.       MOVLW     0xC3
  142.       MOVWF     PORTB
  143.       MOVLW     0XFB
  144.       MOVWF     PORTC
  145.       MOVF      TEMP1,0
  146.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  147. ;COLUMNA 4
  148.       MOVLW     0xC3
  149.       MOVWF     PORTB
  150.       MOVLW     0XF7
  151.       MOVWF     PORTC
  152.       MOVF      TEMP1,0
  153.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  154. ;COLUMNA 5
  155.       MOVLW     0xC3
  156.       MOVWF     PORTB
  157.       MOVLW     0XEF
  158.       MOVWF     PORTC
  159.       MOVF      TEMP1,0
  160.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  161. ;COLUMNA 6
  162.       MOVLW     0xC3
  163.       MOVWF     PORTB
  164.       MOVLW     0XDF
  165.       MOVWF     PORTC
  166.       MOVF      TEMP1,0
  167.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  168. ;COLUMNA 7
  169.       MOVLW     0x7E
  170.       MOVWF     PORTB
  171.       MOVLW     0XBF
  172.       MOVWF     PORTC
  173.       MOVF      TEMP1,0
  174.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  175. ;COLUMNA 8
  176.       MOVLW     0x3C
  177.       MOVWF     PORTB
  178.       MOVLW     0X7F
  179.       MOVWF     PORTC
  180.       MOVF      TEMP1,0
  181.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  182. ;;;;;REPETICION DE LETRA
  183.       DECFSZ    AUX1,1
  184.       GOTO      LETRA_O
  185. ;;;;;APAGA FILAS Y COLUMNAS
  186.       CLRF      PORTB
  187.       MOVF      TEMP2,0
  188.       MOVWF     AUX1
  189. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  190. LETRA_L
  191. ; COLUMNA 1
  192.       MOVLW     0xFF
  193.       MOVWF     PORTB
  194.       MOVLW     0XFE
  195.       MOVWF     PORTC
  196.       MOVF      TEMP1,0
  197.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  198. ;COLUMNA 2
  199.       MOVLW     0xFF
  200.       MOVWF     PORTB
  201.       MOVLW     0XFD
  202.       MOVWF     PORTC
  203.       MOVF      TEMP1,0
  204.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  205. ;COLUMNA 3
  206.       MOVLW     0xC0
  207.       MOVWF     PORTB
  208.       MOVLW     0XFB
  209.       MOVWF     PORTC
  210.       MOVF      TEMP1,0
  211.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  212. ;COLUMNA 4
  213.       MOVLW     0xC0
  214.       MOVWF     PORTB
  215.       MOVLW     0XF7
  216.       MOVWF     PORTC
  217.       MOVF      TEMP1,0
  218.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  219. ;COLUMNA 5
  220.       MOVLW     0xC0
  221.       MOVWF     PORTB
  222.       MOVLW     0XEF
  223.       MOVWF     PORTC
  224.       MOVF      TEMP1,0
  225.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  226. ;COLUMNA 6
  227.       MOVLW     0xC0
  228.       MOVWF     PORTB
  229.       MOVLW     0XDF
  230.       MOVWF     PORTC
  231.       MOVF      TEMP1,0
  232.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  233. ;COLUMNA 7
  234.       MOVLW     0xC0
  235.       MOVWF     PORTB
  236.       MOVLW     0XBF
  237.       MOVWF     PORTC
  238.       MOVF      TEMP1,0
  239.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  240. ;COLUMNA 8
  241.       MOVLW     0xC0
  242.       MOVWF     PORTB
  243.       MOVLW     0X7F
  244.       MOVWF     PORTC
  245.       MOVF      TEMP1,0
  246.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  247. ;;;;;REPETICION DE LETRA
  248.       DECFSZ    AUX1,1
  249.       GOTO      LETRA_L
  250. ;;;;;APAGA FILAS Y COLUMNAS
  251.       CLRF      PORTB
  252.       MOVF      TEMP2,0
  253.       MOVWF     AUX1
  254. LETRA_A
  255. ; COLUMNA 1
  256.       MOVLW     0xFC
  257.       MOVWF     PORTB
  258.       MOVLW     0XFE
  259.       MOVWF     PORTC
  260.       MOVF      TEMP1,0
  261.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  262. ;COLUMNA 2
  263.       MOVLW     0xFE
  264.       MOVWF     PORTB
  265.       MOVLW     0XFD
  266.       MOVWF     PORTC
  267.       MOVF      TEMP1,0
  268.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  269. ;COLUMNA 3
  270.       MOVLW     0x13
  271.       MOVWF     PORTB
  272.       MOVLW     0XFB
  273.       MOVWF     PORTC
  274.       MOVF      TEMP1,0
  275.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  276. ;COLUMNA 4
  277.       MOVLW     0x13
  278.       MOVWF     PORTB
  279.       MOVLW     0XF7
  280.       MOVWF     PORTC
  281.       MOVF      TEMP1,0
  282.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  283. ;COLUMNA 5
  284.       MOVLW     0x13
  285.       MOVWF     PORTB
  286.       MOVLW     0XEF
  287.       MOVWF     PORTC
  288.       MOVF      TEMP1,0
  289.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  290. ;COLUMNA 6
  291.       MOVLW     0x13
  292.       MOVWF     PORTB
  293.       MOVLW     0XDF
  294.       MOVWF     PORTC
  295.       MOVF      TEMP1,0
  296.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  297. ;COLUMNA 7
  298.       MOVLW     0xFE
  299.       MOVWF     PORTB
  300.       MOVLW     0XBF
  301.       MOVWF     PORTC
  302.       MOVF      TEMP1,0
  303.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  304. ;COLUMNA 8
  305.       MOVLW     0xFC
  306.       MOVWF     PORTB
  307.       MOVLW     0X7F
  308.       MOVWF     PORTC
  309.       MOVF      TEMP1,0
  310.       CALL      DELAY_1ms       ; LLAMAR A LA RUTINA DE 1 mseg. que multiplicado por 1 dan 1ms
  311. ;;;;;REPETICION DE LETRA
  312.       DECFSZ    AUX1,1
  313.       GOTO      LETRA_A
  314. ;;;;;APAGA FILAS Y COLUMNAS
  315.       CLRF      PORTB
  316. ;;;;;Espera 1 segungo para repetir la palabra HOLA
  317.        MOVLW    d'250'
  318.        CALL     DELAY_1ms
  319.        MOVLW    d'250'
  320.        CALL     DELAY_1ms
  321.        MOVLW    d'250'
  322.        CALL     DELAY_1ms
  323.        MOVLW    d'250'
  324.        CALL     DELAY_1ms
  325. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  326. ;
  327.       GOTO      EJECUCION
  328. ;
  329. DELAY_1ms
  330.         MOVWF   CONTA3
  331.         MOVLW   d'4'
  332.         MOVWF   CONTA2
  333.         MOVLW   d'250'
  334.         MOVWF   CONTA1
  335.         NOP
  336.         DECFSZ  CONTA1,F        ;DECREMENTA UNA UNIDAD EL VALOR DE CONTA1 Y ALMACENALO EN F = CONTA1
  337.         GOTO    $-.2
  338.         DECFSZ  CONTA2,F        ;DECREMENTA UNA UNIDAD EL VALOR DE CONTA2 Y ALMACENALO EN F = CONTA2
  339.         GOTO    $-.6
  340.         DECFSZ  CONTA3,F        ;DECREMENTA UNA UNIDAD EL VALOR DE CONTA3 Y ALMACENALO EN F = CONTA3
  341.         GOTO    $-.10
  342.         RETURN
  343. END

Está demasiado largo para sólo mostrar la palabra HOLA. Cómo ṕodría optimizarlo?. Por ejemplo si tendría que displayar la palabra: ALLA. Tendría que poner 2 veces el código que displaya las palabras A y L. Alguna recomendación alguien que haya trabajado con estos tipos de matriz.
No uso ninún registro de desplazamiento ni nada. Todo directamente conectados la matriz y el pic.
Este es el video de la matriz funcionando con el pic 16f873A
https://www.dropbox.com/s/63l38f8ovl5gnls/20160121_001224.mp4?dl=0

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:manejo display 8x8 con pic
« Respuesta #1 en: 21 de Enero de 2016, 20:53:20 »
Primero que nada vasa ocupar bastante memoria con tablas. Para cada letra.

Con respecto a optimizarlo un poco es simple...

Comenza por crear una rutina de mostrar todos los leds.. es decir que haga un barrido de todos los leds, algo mas "ejemplificador" seria

- Poner en W la letra a enviar. Llamar a una tabla para que indique el comienzo de la tabla de esa letra (puntero).
- Apagar C8, tomar el valor de base de la letra ( puntero ) y tomar el dato de ahi para ubicarlo en el puerto,Encender C1
- Apagar C1, incrementar el valor del puntero y tomar el dato de ahi para ubicarlo en el puerto,Encender C2
- Apagar C2, incrementar el valor del puntero y tomar el dato de ahi para ubicarlo en el puerto,Encender C3

O podrias tener un registro que tenga el valor inicial como:

0000 0001

E ir rotandolo, si repetis eso varias veces ya tenes lo de arriba realizado. Observa que es un incrementar + tomar dato + ponerlo en el puerto + rotar , preguntar si se completo toda la vuelta y listo. Se puede repetir varias veces en caso que se necesite. Este codigo imagino que debe andar en unas 20 lineas como maximo o un poco mas tal ves

El tema de las tablas es un poco mas complejo. Ya que cada letra dispondra como maximo de 8 bytes para cada una. Supongamos la H ( y en la memoria de programa, no se si lo soporta ese PIC a esto ), Esta es la seccion MAS LARGA DE TODAS, 1 linea por letra que quieras representar

Otras letras ....
LetraH: db 0x00, 0xFF, 0x08, 0x08, 0x08, 0x08, 0xFF, 0x00
Otras letras ....

Finalmente podrias hacer un conversor de ASCII a tu tabla por asi decirlo. Supongamos que tenes la letra 'A' (0x41) y que vos solamente creaste desde el 0, las maysuculas, sin signos ni minuscula es decir de 0x30 a 0x5A.

como la anterior tabla comienza desde 0x30, primero pregunto que este en los margenes lo que se pasa por W (0x30 a 0x5A), luego si es correcto procedo a restarlo 0x30 Y luego lo multiplico por 8 ( es decir roto 3 veces a la izquierda ), eso me va a dar el desplazamiento. Y conociendo la direccion de comienzo de la tabla + ese desplazamiento, es decir del caracter '0' que es 0x30 + desplazamiento encontras la direccion de inicio, ahora solo queda leerlo 8 veces y mostrarlo.
Esta conversion te deberia llevar como mucho 20 lineas maximo creo.

Y obviamente te vas a tener que crear una funcion que lea la direccion del puntero y lo devuelva en W por ejemplo. El largo va a depender del tipo de PIC.

Espero que resuelva tus problemas, lamentablemente no voy a estar con acceso a internet dentro de unos dias, cuando vuelva respondo a tus preguntas si es que nadie lo hizo antes.


 

anything