Te explico donde es que estas equivocado. Y despues te digo como es que lo deberias hacer de alli vas a tener que buscar informacion sobre com acceder a las tablas.
pero al quitarle el EQU D'#', me asigna valores a las posiciones de la matriz mayores a 20
CBLOCK/ENDC y EQU hacen lo mismo, "asignan" un numero a la palabra, pero... no es lo que vos te imaginas como asignar. En el micro vos tenes la memoria RAM, la cual tiene ciertas direcciones que podes usar, apartir de la direccion 0x20 del banco 0, podes guardar tus "variables", lo que suelen hacer y explican al enseñarte ASM es que usas CBLOCK o EQU para darle un nombre a esa direccion de la RAM. entonces suponete que tenes:
o que es lo mismo que :
(Cblock me ahorra el tener escribir uno por uno los valores)
Esto me va a permitir usar F0 como nombre para guardar sobre la memoria RAM, al hacer:
por ejemplo, el compilador al momento de compilar reemplaza el F0 por 0x20, quedando:
El resultado es poner a 0, el lugar de la RAM en la direccion 0x20. Ahora que ocurre si F0 es 9 como vos queres y haces eso, vas a terminar poniendo a 0 el contenido de la direccion 0x9 o 9 decimal que es lo mismo, y es un registro que afecta al funcionamiento del PIC. Y seguramente esto NO es lo que queres. Vos lo que queres es esto:
F0 EQU 0x20
MOVLW D'9'
MOVWF F0
Ahora si,, mi F0 esta ubicado en la direccion 0x20 (lugar de la RAM para mis datos) y le estoy poniendo el valor 9 decimal dentro.
Espero que notes la diferencia. Que para poner un numero DENTRO de una posicion de la RAM, el micro debe realizarlo.
Pero cargar la RAM con TODOS los valores va a ser absurdo... Ya que estos valores no van a cambiar con el tiempo.
Entonces por que ponerlos en la RAM?, por que no ponerlos en la FLASH, si total no van a cambiar ( a no ser que le programes otros numeros. Y aca es donde usamos una tabla:
INFO_MATRIZ: ; Numero de Filas y numero de columnas
DT 5,D'10'
DATA_MATRIZ: ; La matriz
DT 2,2,3,4,4,5,6,7,8,9
DT 2,1,0,6,4,5,6,7,8,0
DT 1,1,1,1,1,1,1,1,1,1
DT 3,4,4,5,6,7,5,8,8,9
DT 2,5,6,7,8,9,0,2,3,5
Esto va a hacer que esos datos se guarden en la FLASH como si fueran instrucciones RETLW, ejemplo si ves la FLASH en la direccion de INFO_MATRIZ verias algo asi:
RETLW 0x5
RETLW 0xA ; 10 decimal
Para tomar los datos, vas a tener que usar un CALL y sumarle a tu contador de programa la diferencia, por ejemplo si quisiera entrar a la primer fila, primer columna, deberia hacer el CALL a DATA_MATRIZ y alli sumarle al PCL (ADDWF vas a ver) un valor de 0, si quisiera la segunda columna y la primera fila, le debo sumar 1 al PCL. En fin, busca informacion sobre tablas, esto te va a permitir hacer un loop, en el cual puedas revisar fila a fila. Y podrias tambien usar la RAM para ir almacenando las columnas.
Si observas tambien inclui el numero de filas y de columnas en OTRA tabla, esto es porque te va a servir tambien para hacer los loops para determinar cual es el mas grande de cada fila y columna.
Resumiendotelo:
- Aprende como acceder a una tabla
- Crea un loop inicialmente que pase por la primer fila nomas. (Te va a ser util el numero de columnas)
- Luego creas un loop mas grande que pase por cada fila, (Aca te va a ser util el numero de filas)
- Mostras el resultado en tu display. El tema es que numero vas a mostrar acá, ya que vas a tener un mayor en las columnas y un mayor en las filas.