Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*16 Renglones Activos en Bajo*/
- /* 8 Columnas Activas en Alto*/
- .include "m16def.inc" // Incluir las librerías para programación del ATMega16
- .equ ClockCol=3 //
- .equ DatasCol=2
- .equ ClockRow=1
- .equ DatasRow=0
- .equ MatrixPort=PORTA //puerto al que esta conectada la matriz
- .equ MatrixDDR=DDRA
- .equ DatasInRAM=0x0060 //direccion de memoria
- .equ CharsInRAM=80
- .org 0
- jmp main
- .org 0x30
- main:
- ldi r16,HIGH(RAMEND) //declara la pila, parte alta
- out SPH,r16 //puntero a la pila
- ldi r16,LOW(RAMEND) //parte baja
- out SPL,r16 //puntero a la pila
- clr r16 //poner a cero el registro
- out MatrixPort,r16 // sacar lo que hay en r16 por el puerto indicado
- ser r16 //pone todos los bits a 1
- out MatrixDDR,r16 //saca por el puerto
- ;Matrix PORT as OUT
- ldi ZL,Low(Mensaje) //parte baja del mensaje
- ldi ZH,HIGH(Mensaje) //parte alta
- clc
- rol ZL //recorrer a la izquierda lo que hay en el registro (ultimo bit va al principio)
- rol ZH
- ldi YL,Low(DatasInRAM) //cargar lo que hay en parte baja de ram a direccion de memoria
- ldi YH,HIGH(DatasInRAM) // cargar la parte alta
- ldi r17,CharsInRAM //los caracteres en ram se cargan a r17
- LoadCharsInRAM:
- lpm r16,Z+ //cargar a r17 lo que hay en z y postincrementar
- COM R16 //obtiene complemento a 1
- st Y+,r16 //guarda en y lo que hay en r16 y postincrementa
- dec r17 //reduce el valor de r17 en 1
- brne LoadCharsInRAM //salto si en la direccion indicada hay 0
- Repite:
- call SelectCol0 //en columna 0
- ldi YL,Low(DatasInRAM) //cargar parte baja de direccion indicada
- ldi YH,HIGH(DatasInRAM) //parte alta
- sbi MatrixPort,DatasCol //poner en 1 el bit indicado del registro marcado
- ldi r18,CharsInRAM //carga en r18 lo que hay en la direccion de memoria indicada
- Repite16veces:
- LD r16,Y+ //carga el valor de r16 en y y postincrementa y
- call SendR0Serial //llama a la instruccion sendr0serial
- call retardo1ms //llama a la instrccion retardo
- sbi MatrixPort,ClockCol //poner en 1 el bit indicado del registro marcado
- cbi MatrixPort,ClockCol //poner en 0 el bit indicado del registro marcado
- dec r18 //decrementa el valor de r18
- brne Repite16veces //salta si no se ha llegado al valor de repite16veces
- dec r19 //decrementa el valor de r19
- brne Repite //salta si no se ha llegado al valor de repite
- RotaMatrixRAM:
- ldi ZL,Low(DatasInRAM) //carga a registro la parte baja de direccion
- ldi ZH,HIGH(DatasInRAM) //carga a registro la parte alta de direccion
- call rotaRAM //llama instruccion rotaram
- ldi r19,4 //carga 4 en r19
- jmp Repite //salta a instruccion repite
- rotaRAM:
- ldi r19,CharsInRAM-1 //carga a r19 el valor del registro indicado -1
- MOV YL,ZL //mueve a yl lo que hay en zl
- MOV YH,ZH //mueve a yh lo que hay en zh
- ld r16,Y+ //carga a r16 lo que hay en y y postincrementa
- push r16 //mete r16 a la pila
- cicloRotaRAM:
- ld r16,Y+ //carga en r16 lo que hay en y y postincrementa
- st Z+,r16 // lo que esta en r16 se escribe en z y postincrementa
- dec r19 //decrementa r19
- brne cicloRotaRAM //salta si aun no se ha llegado al valor de ciclorotaram
- pop r16 //saca de la pila r16
- st Z,r16 //escribe lo que hay en r16 en z
- RET
- SendR0Serial:
- ldi r17,8 //escribe un 8 en r17
- rol r16 //recorre los bits de r16, el ultimo va a l primero
- cicloSendR0Serial:
- sbi MatrixPort,DatasRow //poner en 1 el bit indicado del registro marcado
- rol r16 //recorre los bits de r16, el ultimo va a l primero
- bst r16,0 //bandera t se pone en 0
- brts SendPulse
- cbi MatrixPort,DatasRow //pone en 0 el bit indicado en el registro
- SendPulse:
- sbi MAtrixPort,ClockRow //pone en 1 el bit indicado
- cbi MAtrixPort,ClockRow //pone en 1 el bit indicado
- dec r17 //decrementa el valor de r17
- brne cicloSendR0Serial //salta si no se ha llegado al valor
- RET //volver a la pila
- SelectCol0:
- ldi r17,CharsInRAM-1 //guarda en registro
- sbi MatrixPort,DatasCol //se pone en 1 el bit indicado
- cicloSelCol0:
- sbi MAtrixPort,ClockCol
- cbi MAtrixPort,ClockCol
- dec r17
- brne cicloSelCol0
- cbi MatrixPort,DatasCol
- sbi MAtrixPort,ClockCol
- cbi MAtrixPort,ClockCol
- RET
- retardo1ms:
- push r16 //empujar a pila r16
- push r17 //empujar a pila r17
- ldi r16,133 //carga un 133 en r16
- ciclo1retardo1ms:
- ldi r17,20 //carga un 20 en r17
- ciclo2retardo1ms:
- dec r17 //reduce en 1 el valor de r17
- brne ciclo2retardo1ms
- dec r16 //reduce el valor de r16
- brne ciclo1retardo1ms
- pop r17 //sacar de la pila y guardar en r17
- pop r16 //sacar de la pila y guardar en r16
- RET //volver a la pila
- Mensaje: //escribe en una tabla en flash, en las direcciones indicadas
- .DB 0x67,107,109,14,109,107,0x67, 0xff; Arbolito
- .db 0b11100111, 0b11011111, 0b10111001, 0b10111111, 0b10111001, 0b11011111, 0b11100111, 0b11111111 ; :)
- .db 0b11011101, 0b10000000, 0b11011101, 0b10000000, 0b11011101, 0b11111111 ; #
- .db 0b11110111, 0b10010101, 0b11100000, 0b10010101, 0b11110111, 0b11111111 ; humano
- .db 0b10000000, 0b10111110, 0b10100010, 0b10101010, 0b10101110, 0b10100000, 0b11111111, 0b11111111 ; espiral
- .db 0b11000001, 0b10111110, 0b10101110, 0b11000001, 0b10111111, 0b11000000 /* Q*/
- .db 0b10111111, 0b10111111, 0b11000000, 0b11111111/* U*/
- .db 0b10000000, 0b10110110, 0b10110110, 0b10111110, 0b11111111, 0b11111111/*E*/
- .db 0b11000001, 0b10111110, 0b10111110, 0b11000001, 0b11111111, 0b11111111 ;O
- .db 0b10000000, 0b11111001, 0b11100111, 0b10000000, 0b11111111, 0b11111111 ;N
- .db 0b10000000, 0b10111110, 0b11011101, 0b11100011, 0b11111111, 0b11111111 ;D
- .db 0b10000001, 0b11110110, 0b11110110, 0b10000001, 0b11111111, 0b11111111 ;A
- .db 0b11111111, 0b11111111, 0b11111111, 0b11111111
- ;Espacios
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement