Por fin, aquí el código con uso de tablas para mostrar la letra "A" y la "A" invertida o sombreada, perdonadme si es algo largo (soy un poco torpe
), solo teneis que ir poniendo en la tabla el caracter que os dé la gana y cambiar algo en el código sobre el offset para ir mostrando lo que querais (mientras haya memoria claro). El reto siguiente es poner un mensaje desplazandose, usaré tablas para hacerlo. Luego como la memoria de programa del 16F84 no dará mucho de si intentaré colocar los datos en una memoria I2C y acceder a ella por emulación de software del protocolo I2C (por aquí andan algunos ejemplos supongo que serviran).
__CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>
CBLOCK 0x0C
ENDC
EEPROM EQU 0x1C ;registro de control
ALMACEN EQU 0x20 ;aquí se guarda la informacion para llevarla al registro de desplazamiento
CONTADOR EQU 0x21 ;contador 8 bits
REPITE EQU 0x22 ;repetición ciclos en columna
SALIDA EQU 0x23 ;registro para rotación de salida PORTB
PUNTERO EQU 0x24 ;registro para offset
FILA1 EQU 0x25
FILA2 EQU 0x26
FILA3 EQU 0x27
FILA4 EQU 0x28
FILA5 EQU 0x29
FILA6 EQU 0x30
FILA7 EQU 0x31
FILA8 EQU 0x32
VECES EQU 0x33 ;controla nº de veces que se produce un evento
DI EQU 7 ;bit de control
DO EQU 6 ;bit de control
ORG 0X00 ;Inicio del ensamblado desde 00
goto INICIO ;Salto a la primera instruccion
ORG 0X05 ;Ensamblar desde 05
INICIO bsf STATUS,RP0 ;pagina 1
clrf TRISB ;portb salidas
clrf TRISA ;porta salidas
bcf STATUS,RP0 ;pagina 0
clrf PORTB
clrf PORTA
clrf FILA1
clrf FILA2
clrf FILA3
clrf FILA4
clrf FILA5
clrf FILA6
clrf FILA7
clrf FILA8
clrw
;****************************************************************************************************************************
;AQUI HAGO LA LLAMADA A LA TABLA PARA IR SACANDO LOS DATOS Y CARGAR LOS REGISTROS
;****************************************************************************************************************************
RESET clrf PUNTERO ;comienza PUNTERO en 0
movlw D'2' ;cada vez que se hace reset se carga el registro con 2
movwf VECES ;para controlar el nº de veces que se muestra la A y la
;A inversa
CARGA movf PUNTERO,0 ;muevo contenido dígito a W
call TABLA ;llamo a tabla
movwf FILA1 ;y cargo resultado en FILA1
nop
incf PUNTERO,F ;incremento PUNTERO como offset para tabla
movf PUNTERO,0 ;y lo cargo en w
call TABLA ;llamo a tabla
movwf FILA2 ;y cargo resultado en FILA2
nop
incf PUNTERO,F ;incremento PUNTERO como offset para tabla
movf PUNTERO,0 ;y lo cargo en w
call TABLA ;llamo a tabla
movwf FILA3 ;y cargo resultado en FILA3
nop
incf PUNTERO,F ;incremento PUNTERO como offset para tabla
movf PUNTERO,0 ;y lo cargo en w
call TABLA ;llamo a tabla
movwf FILA4 ;y cargo resultado en FILA4
nop
incf PUNTERO,F ;incremento PUNTERO como offset para tabla
movf PUNTERO,0 ;y lo cargo en w
call TABLA ;llamo a tabla
movwf FILA5 ;y cargo resultado en FILA5
nop
incf PUNTERO,F ;incremento PUNTERO como offset para tabla
movf PUNTERO,0 ;y lo cargo en w
call TABLA ;llamo a tabla
movwf FILA6 ;y cargo resultado en FILA6
nop
incf PUNTERO,F ;incremento PUNTERO como offset para tabla
movf PUNTERO,0 ;y lo cargo en w
call TABLA ;llamo a tabla
movwf FILA7 ;y cargo resultado en FILA7
nop
incf PUNTERO,F ;incremento PUNTERO como offset para tabla
movf PUNTERO,0 ;y lo cargo en w
call TABLA ;llamo a tabla
movwf FILA8 ;y cargo resultado en FILA8
call REG
incf PUNTERO,F ;incremento PUNTERO como offset para tabla
movf PUNTERO,0 ;y lo cargo en w
goto CARGA
;****************************************************************************************************************************
;AQUI CARGO LOS REGISTROS LLAMADOS FILA_X EN EL REGISTRO ALMACEN PARA SER SACADOS POR REGISTRO DE DESPLAZAMIENTO
;****************************************************************************************************************************
REG movlw D'60' ;cargo registro con 60 para que se visualize el dato 1 seg
movwf REPITE
MUESTRATE movf FILA1,0
movwf ALMACEN ;registro donde se almacena el dato
call TX
nop
movlw D'254' ;activo fila 1
movwf PORTB
call Retardo_2ms
movlw B'11111111'
movwf PORTB
movf FILA2,0
movwf ALMACEN ;registro donde se almacena el dato
call TX
nop
movlw D'253' ;activo fila 2
movwf PORTB
call Retardo_2ms
movlw B'11111111'
movwf PORTB
movf FILA3,0
movwf ALMACEN ;registro donde se almacena el dato
call TX
nop
movlw D'251' ;activo fila 3
movwf PORTB
call Retardo_2ms
movlw B'11111111'
movwf PORTB
movf FILA4,0
movwf ALMACEN ;registro donde se almacena el dato
call TX
nop
movlw D'247' ;activo fila 4
movwf PORTB
call Retardo_2ms
movlw B'11111111'
movwf PORTB
movf FILA5,0
movwf ALMACEN ;registro donde se almacena el dato
call TX
nop
movlw D'239' ;activo fila 5
movwf PORTB
call Retardo_2ms
movlw B'11111111'
movwf PORTB
movf FILA6,0
movwf ALMACEN ;registro donde se almacena el dato
call TX
nop
movlw D'223' ;activo fila 6
movwf PORTB
call Retardo_2ms
movlw B'11111111'
movwf PORTB
movf FILA7,0
movwf ALMACEN ;registro donde se almacena el dato
call TX
nop
movlw D'191' ;activo fila 7
movwf PORTB
call Retardo_2ms
movlw B'11111111'
movwf PORTB
movf FILA8,0
movwf ALMACEN ;registro donde se almacena el dato
call TX
nop
movlw D'127' ;activo fila 8
movwf PORTB
call Retardo_2ms
movlw B'11111111'
movwf PORTB
decfsz REPITE,1 ;decrementa control salta si vale 0
goto MUESTRATE
decfsz VECES,1 ;controla que se mostró la A y la A inversa, es decir 2 veces
;para poner offset a 0 y empezar desde el principio de la tabla
return
goto RESET ;reset en offset y comienza de nuevo
;****************************************************************************************************************************
;RUTINA TRANSMISIÓN BITS A REGISTRO 74HC164
;****************************************************************************************************************************
TX movlw .8 ;pone 8 en W
movwf CONTADOR ;carga contador con 8
TXLP bcf EEPROM,DO ;a 0 bit DO
btfsc ALMACEN,0 ;mira el bit 7 de ALMACEN y salta si es 0
bsf EEPROM,DO ;a 1 bit DO
call BITOUT
rrf ALMACEN,F ;rota a izquierda ALMACEN
decfsz CONTADOR,F ;decrementa contador si es 0 salta
goto TXLP
return
BITOUT bsf STATUS,RP0 ;pagina 1
movlw 0X00
movwf TRISA ;puerta A salida
bcf STATUS,RP0 ;pagina 0
btfss EEPROM,DO ;mira el bit DO y salta si vale 1
goto BITLOW
bsf PORTA,3 ;pone a 1 DATA
goto CLOCK
BITLOW bcf PORTA,3 ;pone a 0 DATA
;****************************************************************************************************************************
;RUTINA DE TRANSMISIÓN SEÑAL DE RELOJ A REGISTRO 74HC164
;****************************************************************************************************************************
CLOCK bcf PORTA,2 ;pone a 0 CLOCK
nop ;espera 1 micros
nop ;otro
nop ;otro
nop ;otro
bsf PORTA,2 ;pone a 1 CLOCK
nop ;1 micros
return
;****************************************************************************************************************************
;TABLA DONDE SE GUARDA LA INFORMACIÓN A MOSTRAR
;****************************************************************************************************************************
TABLA addwf PCL,F
retlw D'231'
retlw D'195'
retlw D'153'
retlw D'153' ;letra A
retlw D'129'
retlw D'153'
retlw D'153'
retlw D'153'
retlw D'24'
retlw D'60'
retlw D'102'
retlw D'102' ;letra A inversa
retlw D'126'
retlw D'102'
retlw D'102'
retlw D'102'
INCLUDE <RETARDOS.INC> ;subrutinas de control de tiempos de retardo.
END