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" //Se llama la libreria
- ;Asignacion de mnemónicos y valores constantes a utilizar durante el programa
- .equ ClockCol=3
- .equ DatasCol=2
- .equ ClockRow=1
- .equ DatasRow=0
- .equ MatrixPort=PORTA
- .equ DDRMat=DDRA
- .equ DatasInRAM=0x0060 ;Datos leídos desde la Flash a partir de dirección 0x0060
- .equ CharsInRAM=80
- .equ columnas=16
- .org 0
- rjmp main
- ;Dirección a partir de la cual se ejecuta el programa
- .org 0x30
- main:
- //Se prepara la pila
- ldi r16,HIGH(RAMEND) ;Parte alta
- out sph,r16
- ldi r16,LOW(RAMEND) ;Parte baja
- out spl,r16
- clr r16 ;Se limpia r16
- //Preparamos puerto D como lectura
- clr r16
- out ddrd, r16
- sbi portd, 0 ;Se activa el pull up interno
- sbi portd, 1 ;Se activa el pull up interno
- //Preparamos puerto A como salida
- ser r16
- out DDRMat,r16
- //Espera en polling a que algún boton sea oprimido, y según sea manda a la etiqueta que despliega mensaje hacia derecha o izquierda
- poll:
- sbic pind,0
- rjmp poll
- call retardo10ms ;rutina antirebote implementada para eliminación de ruido
- sbic pind,0 ;Se asegura que el boton siga oprimido
- jmp poll ;No fue oprimido el boton, fue ruido
- wait:
- sbis pind, 0 ;Checa que se suelte el boton
- jmp wait
- call retardo10ms ;Termina rutina antirebote
- jmp derecha ;Si pind0 es oprimido, salta a etiqueta "derecha" que mostrará el mensaje hacia la derecha
- sbic pind, 1
- rjmp poll
- call retardo10ms ;rutina antirebote implementada para eliminación de ruido
- sbic pind, 1 ;Se asegura que el boton siga oprimido
- jmp poll ;No fue oprimido el boton, fue ruido
- wait2:
- sbis pind, 1 ;Checa que se suelte el boton
- rjmp wait2
- jmp izquierda ;Si pind1 es oprimido, salta a etiqueta "izquierda" que mostrará mensaje hacia la izquierda
- jmp poll ;Si ninguna acción es realizada, regresa al proceso de polling
- //Etiqueta derecha va a setear bandera T
- derecha:
- set
- rjmp apuntadorZ
- //Etiqueta izquierda limpia bandera T
- izquierda:
- clt
- //Preparamos apuntador z a Flash
- apuntadorZ:
- clc
- ldi zl, low(mensaje<<1)
- ldi zh, high(mensaje<<1)
- //Preparamos apuntador y a RAM
- ldi yl, low(DatasInRAM)
- ldi yh, high(DatasInRAM)
- ldi r17, CharsInRAM ;Cargamos el valor 80 al registro r17
- //Carga caracteres a RAM, para eso utiliza SelCols
- LoadCharsInRAM:
- lpm r16,Z+
- COM r16
- st Y+,r16
- dec r17
- brne LoadCharsInRAM
- call SelCols
- //Coloca al sistema a su configuración de inicio
- Repetir:
- //Verifica si algún botoon es oprimido
- /*Como se usan los mismos apuntadores para el recorrido derecha e izquierda,
- no es necesario que termine un proceso para empezar el otro*/
- sbic pind,0
- rjmp Repetir
- call retardo10ms ;rutina antirebote implementada para eliminación de ruido
- sbic pind,0 ;Se asegura que el boton siga oprimido
- jmp Repetir ;No fue oprimido el boton, fue ruido
- wait3:
- sbis pind, 0 ;Checa que se suelte el boton
- jmp wait3
- call retardo10ms ;Termina rutina antirebote
- jmp der ;Si pind0 es oprimido, salta a etiqueta "derecha" que mostrará el mensaje hacia la derecha
- sbic pind, 1
- rjmp Repetir
- call retardo10ms ;rutina antirebote implementada para eliminación de ruido
- sbic pind, 1 ;Se asegura que el boton siga oprimido
- jmp Repetir ;No fue oprimido el boton, fue ruido
- wait4:
- sbis pind, 1 ;Checa que se suelte el boton
- rjmp wait4
- jmp izq ;Si pind1 es oprimido, salta a etiqueta "izquierda" que mostrará mensaje hacia la izquierda
- jmp poll ;Si ninguna acción es realizada, regresa al proceso de polling
- der: set
- rjmp Control
- izq: clt
- Control:
- //Prepara apuntador Y en dirección de RAM, para poder controlar el mensaje
- cbi MatrixPort,DatasCol
- sbi MatrixPort,ClockCol
- cbi MatrixPort,ClockCol
- ldi yl, low(DatasInRAM)
- ldi yh, high(DatasInRAM)
- sbi MatrixPort,DatasCol
- ldi r18, columnas-1
- /*Carga a r16 lo que hay en Y, llamando a SendR0Serial (llenado de renglones).
- para hacer un retardo de 1ms y envia un pulso para desplazar las columnas.
- Después checa el estado de r18, mientras no sea 0, repetirá el cambio de las columnas.
- Después, checa si r19 (modificado por las rutinas de rotación derecha e izquierda) es cero,
- mandándo de nuevo el proceso a la etiqueta Repetir para iniciar este proceso de nuevo*/
- RepiteNumCol:
- LD r16,Y+
- call SendR0Serial
- call retardo1ms
- sbi MatrixPort,ClockCol
- cbi MatrixPort,ClockCol
- dec r18
- brne RepiteNumCol
- dec r19
- brne Repetir
- //Según sea el estado de bandera T va a rotar a izquierda o derecha
- izqDer:
- brts RotaMatrixRAM
- brtc RotaMatrixIZQ
- /*Lee datos de apuntador z para saltar a rotaRAM y regresar a Repetir,
- lo que permite el cambio de dirección o seguir en la misma, según sea
- la acción realizada*/
- RotaMatrixRAM:
- ldi zl,low(DatasInRAM)
- ldi zh,high(DatasInRAM)
- call rotaRAM
- ldi r19,20
- jmp Repetir
- /*Rotación de la matriz, los apuntadores van por la tabla Mensaje en Flash,
- colocando todos los caracteres hasta que r20 (tamaño de cada mensaje) sea 0*/
- rotaRAM:
- ldi r20,CharsInRAM-1
- mov yl, zl
- mov yh, zh
- ld r16, y+
- push r16
- cicloRotaRAM:
- ld r16,Y+
- st Z+,r16
- dec r20
- brne cicloRotaRAM
- pop r16
- st Z,r16
- ret
- //Toma datos del apuntador Z y salta a rotaizq, para después regresar a Repetir
- RotaMatrixIZQ:
- ldi zl, low(0x00b0) ;recorre al revés los datos
- ldi zh, high(0x00b0)
- call rotaizq
- ldi r19,20
- jmp Repetir
- /*Rota la matriz utilizando los apuntadores por la tabla en Flash hasta que r20
- llegue a 0, r20 es tamaño de mensaje. Se utilizan los apuntadores con pre decremento
- y van a la izquierda*/
- rotaizq:
- ldi r20,CharsInRAM
- mov yl, zl
- mov yh, zh
- ld r16, -y
- push r16
- cicloRotaizq:
- ld r16, -y
- st -z,r16
- dec r20
- brne cicloRotaizq
- pop r16
- st Z,r16
- ret
- //Rutina encargada de hacer el cambio en renglones
- SendR0Serial:
- ldi r17,8
- cicloSendR0Serial:
- sbi MatrixPort,DatasRow
- rol r16
- brcs SendPulse
- cbi MatrixPort,DatasRow
- SendPulse:
- sbi MatrixPort,ClockRow
- cbi MatrixPort,ClockRow
- dec r17
- brne cicloSendR0Serial
- ret
- //Se dezplazan en Columnas para mostrar el mensaje
- SelCols:
- ldi r17,columnas
- sbi MatrixPort,DatasCol
- cicloSelCols:
- sbi MatrixPort,ClockCol
- cbi MatrixPort,ClockCol
- dec r17
- brne cicloSelCols
- //Retardos
- retardo1ms:
- push r16
- push r17
- ldi r16,133
- ciclo1retardo1ms:
- ldi r17,20
- ciclo2retardo1ms:
- dec r17
- brne ciclo2retardo1ms
- dec r16
- brne ciclo1retardo1ms
- pop r17
- pop r16
- RET
- //Retardo 10ms antirebote en boton
- retardo10ms: ldi r16, 104
- ciclo1: ldi r17, 255
- ciclo: dec r17
- brne ciclo
- dec r16
- brne ciclo1
- ret
- Mensaje:
- .db 0b11111111,0b00000001,0b00010001,0b00101001,0b01000111,0b10000000,0b00000000,0b00000000 ; 'R'
- .db 0b00000000,0b00111110,0b01000001,0b01000001,0b01000001,0b01000001,0b01000001,0b01000001 ; 'C'
- .db 0x00,0x7e,0x09,0x09,0x09,0x7e,0x00,0x00 ; 'A'
- .db 0x00,0xfe,0x91,0x91,0xee,0x00,0x00,0x0B ; 'B'
- .db 0b11111111,0b10000001,0b10000001,0b10000001,0b10000001,0b10000001,0b10000001,0b11111111 ; Cuadrado
- .db 0xc3,0x66,0x24,0xff,0xff,0x24,0x66,0xc3 ; Cruces
- .db 0x08,0x14,0x2a,0x5d,0x2a,0x14,0x08,0x00 ; Rombos
- .db 0xff,0x80,0xbe,0xa2,0xaa,0xba,0x82,0xfe ; Snake
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement