Buenas a todos, es de las primeras veces que escribo en este foro, creo que la tercera. Bueno, estaba yo liado aprendiendo a programar para los PICS y el proyecto que estoi liado ahora es esto de las matrices de Led's, buscando algo de información me topé con este post que lo veo muy interesante.
Bueno lo que vengo ha hacer es a dejaros aqui lo que he hecho hasta ahora por si os puede servir de algo, o si veis alguna modificación que le pueda hacer. El proyecto no esta testeado al 100% (fisicamente), ya que en el ISIS no hay manera y ahora no dispongo ni de leds suficientes ni tiempo para ir a la ciudad para comprarlos.
Parcialmente si esta comprovado y en teoria deberia funcionar.
Adjunto un programa que realice en C# para generar caracteres para la memoria I2C, por defecto vienen unas mayusculas bastante cutres, podeis modificarlas y adjuntar mas caracteres. En el tu escribes la frase que quieras visualizar en la matriz y este te genera el *.hex para el I2C, tambien lleva un pequeño simulador...
El esquema utilizado lo podreis ver dentro del programa en la pestaña ayuda, podreis comprobar que no utilizo registro de desplazamiento sino que uso un multiplexor (es lo que tenia a mano).
Este es el codigo para el Pic16F84a:
;************************************************** MATRIZ LEDS 8X8 ********************************************************************
;
;
;
;ZONA DE DATOS******************************************************************************************************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>
CBLOCK 0x0C
UNO
DOS
TRES
CUATRO
CINCO
SEIS
SIETE
OCHO
Datomov
VarRep
ENDC
Rep EQU .5 ;numero de refrescos antes de solicitar otra columna
;ZONA DE CODIGOS****************************************************************************************************************************
ORG 0
Inicio
bsf STATUS,RP0 ;accedo a banco 1
clrf PORTB ;port b como salida
movlw b'11000' ;del puerto a, los 2 bits altos como entrada
movwf PORTA ;los 3 bajos como salida
bcf STATUS,RP0 ;acces a banc 0
clrf PORTB
clrf PORTA
Puestacero
clrf UNO
clrf DOS
clrf TRES
clrf CUATRO
clrf CINCO
clrf SEIS
clrf SIETE
clrf OCHO
movlw Rep
movwf VarRep
call I2CReset
Principal
movf PORTA,W ;cargo el contenido del puerto a
andlw b'11000' ;me quedo con los dos bits altos
iorlw b'00000' ;dejo los 2bits altos como estaban i cambio los otros 3
movwf PORTA ;resultado a Puerto A
movf UNO,W ;muevo a W el contenido de la variable UNO
call RetardoMOV ;llamo a la subrutina que se encarga de mandar W al pueto B y el tiempo que se mantiene encendido
movf PORTA,W ;desde aqui igual para las demas columnas
andlw b'11000'
iorlw b'00001'
movwf PORTA
movf DOS, W
call RetardoMOV
movf PORTA,W
andlw b'11000'
iorlw b'00010'
movwf PORTA
movf TRES, W
call RetardoMOV
movf PORTA,W
andlw b'11000'
iorlw b'00011'
movwf PORTA
movf CUATRO, W
call RetardoMOV
movf PORTA,W
andlw b'11000'
iorlw b'00100'
movwf PORTA
movf CINCO, W
call RetardoMOV
movf PORTA,W
andlw b'11000'
iorlw b'00101'
movwf PORTA
movf SEIS, W
call RetardoMOV
movf PORTA,W
andlw b'11000'
iorlw b'00110'
movwf PORTA
movf SIETE, W
call RetardoMOV
movf PORTA,W
andlw b'11000'
iorlw b'00111'
movwf PORTA
movf OCHO, W
call RetardoMOV
decfsz VarRep, F ;compruebo si ha hecho los refrescos predefinidos
goto Principal ;si no es asi vuelvo a repetir
;subrutina per passar sa lletre
; AQUI ES DONDE CARGAMOS LOS NUEVOS DATOS
Pasalletre
movlw Rep ;recargamos el refresco
movwf VarRep ;
call Tablas ;llamamos a la memoria I2C para que nos envie el nuevo Byte
movlw b'11111111' ;aqui compruebo si datomov es 11111111, si es asi lo entiendo como final
subwf Datomov,W ;y reinicio la memoria
btfsc STATUS,Z
goto Puestacero
rlf Datomov, F ;Hago rotar el Byte recibido a izquierdas, el bit
rlf UNO, F ;de mayor peso entra en el carry, a continuacion
rlf Datomov, F ;hago rotar la primera variable (el bit de mayor peso lo desecho) y el que
rlf DOS, F ;estaba en el carry entra como bit de menor peso
rlf Datomov, F ;
rlf TRES, F ;Esto lo hago con todas las variables de columnas
rlf Datomov, F
rlf CUATRO, F
rlf Datomov, F
rlf CINCO, F
rlf Datomov, F
rlf SEIS, F
rlf Datomov, F
rlf SIETE, F
rlf Datomov, F
rlf OCHO, F ;ya hemos movido el caracter un punto a la izquierda
goto Principal
;subrutina retardo y mover dato a puerto B
RetardoMOV
movwf PORTB
call Retardo_5ms ;tiempo que permanece encendido cada led,
return
;Aqui leemos un byte de la memoria
Tablas
call I2C_EnviaStart ;enviamos la condicion start de protocolo I2C
movlw b'10100001' ;direccion Memoria en modo lectura
call I2C_EnviaByte ;la enviamos
call I2C_LeeByte ;LEEMOS EL SIGUIENTE BYTE
movwf Datomov ;lo movemos a la variable
call I2C_EnviaStop ;enviamos el Stop
return
;Indica a la memoria I2C desde donde empezar a leer
I2CReset
call I2C_EnviaStart ;enviamos la condicion start de protocolo I2C
movlw b'10100000' ;direccion Memoria en modo escritura
call I2C_EnviaByte ;la enviamos
movlw b'00000000' ;pagina donde empezar a leer/escribir
call I2C_EnviaByte ;la enviamos
movlw b'00000000' ;direccion donde empezar a leer/escribir
call I2C_EnviaByte ;la enviamos
call I2C_EnviaStop ;enviamos el Stop, no queremos escribir
return
INCLUDE<BUS_I2C.INC>
INCLUDE<RETARDOS.INC>
END
Las librerias estan sacadas del libro "Microcontrolador Pic16f84 desarroyo de proyectos" con el que estoy iniciandome.
Espero les guste o les sirva. Tambien agradeceria si algo no lo hago bien o lo que sea (estoi aprendiendo
)
Saludos