El barrido se realiza utilizando tablas guardadas en la FLASH que se utiliza para prender las filas, para las columnas se prende y se apaga cada columna despues de cierto tiempo en un orden sea hacia la derecha o a la izquierda según queramos.
Para prender se hace con transistores para limitar la corriente, pero en este caso de simulación utilizamos nots.
Circuito a utilizar:
Código:
* Created: 13/06/2015 9:32:18
*
Author: cdtoap
*/
.def tempo=r16
.def conta=r17
.def aux=r18
.cseg
.org 0x00
;Definicion de puertos
;*********************************************************
ldi tempo,$7F
out ddra,tempo
ldi tempo,$1F
out ddrb,tempo
ldi tempo,$00
out ddrc,tempo
out ddrd,tempo
ldi tempo,$FF
out
porta,tempo
out
portb,tempo
out
portc,tempo
out
portd,tempo
in tempo,mcucr
andi tempo,$EF
out mcucr,tempo
;********************************************************
inicio:
ldi zh,high(tabla<<1);cargamos
la direccion de la tabla
ldi zl,low(tabla<<1)
ldi conta,5; como son 5
columnas cargamos con 5
ldi aux,0b11111110;
cargamos un valor referencial para prender las columnas
salto:
ldi tempo,0b11111111;
mantenemos apagadas las columnas
out portb,tempo
lpm tempo,z+; obtenemos el
valor de cada columna
ori tempo,0b10000000;
aseguramos el pull-up
out porta,tempo; sacamos el
valor de las filas
out portb,aux; prendemos
las columnas
call retardo; esperamos un
tiempo
ldi tempo,0b11111111;
apagamos las columnas
out portb,tempo
sec
rol aux; movemos el valor
para prender la siguiente columna
ori aux,0b11100000;
aseguramos pull-up
dec conta ; decrementamos
el numero de columna
brne salto; vamos a la
siguiente columna
rjmp inicio; si acabo repetimos el proceso
;Tabla de la flash con la letra C precargada
tabla:
.db
0b11111111,0b11000001
.db
0b11000001,0b11000001
.db
0b11000001,0b11000001
.db 0b11000001,0b11000001
;retardo para cada columna
retardo:
push r16
ldi r16,255
Retardo_01:
dec r16
brne retardo_01
pop r16
ret
No hay comentarios.:
Publicar un comentario