Advertisement
OscarAHB

Matriz de LED

Sep 21st, 2016
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*16 Renglones Activos en Bajo*/
  2. /* 8 Columnas Activas en Alto*/
  3. .include "m16def.inc" //Se llama la libreria
  4. ;Asignacion de mnemónicos y valores constantes a utilizar durante el programa
  5. .equ ClockCol=3
  6. .equ DatasCol=2
  7. .equ ClockRow=1
  8. .equ DatasRow=0
  9. .equ MatrixPort=PORTA
  10. .equ DDRMat=DDRA
  11. .equ DatasInRAM=0x0060 ;Datos leídos desde la Flash a partir de dirección 0x0060
  12. .equ CharsInRAM=80
  13. .equ columnas=16
  14.  
  15. .org 0
  16. rjmp main
  17.  
  18. ;Dirección a partir de la cual se ejecuta el programa
  19. .org 0x30
  20. main:
  21.  
  22. //Se prepara la pila
  23. ldi r16,HIGH(RAMEND) ;Parte alta
  24. out sph,r16
  25. ldi r16,LOW(RAMEND) ;Parte baja
  26. out spl,r16
  27. clr r16 ;Se limpia r16
  28.  
  29. //Preparamos puerto D como lectura
  30. clr r16
  31. out ddrd, r16
  32. sbi portd, 0 ;Se activa el pull up interno
  33. sbi portd, 1 ;Se activa el pull up interno
  34.  
  35. //Preparamos puerto A como salida
  36. ser r16
  37. out DDRMat,r16
  38.  
  39. //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
  40. poll:
  41. sbic pind,0
  42. rjmp poll
  43. call retardo10ms ;rutina antirebote implementada para eliminación de ruido
  44. sbic pind,0 ;Se asegura que el boton siga oprimido
  45. jmp poll ;No fue oprimido el boton, fue ruido
  46. wait:
  47. sbis pind, 0 ;Checa que se suelte el boton
  48. jmp wait
  49. call retardo10ms ;Termina rutina antirebote
  50. jmp derecha ;Si pind0 es oprimido, salta a etiqueta "derecha" que mostrará el mensaje hacia la derecha
  51.  
  52. sbic pind, 1
  53. rjmp poll
  54. call retardo10ms ;rutina antirebote implementada para eliminación de ruido
  55. sbic pind, 1 ;Se asegura que el boton siga oprimido
  56. jmp poll ;No fue oprimido el boton, fue ruido
  57. wait2:
  58. sbis pind, 1 ;Checa que se suelte el boton
  59. rjmp wait2
  60. jmp izquierda ;Si pind1 es oprimido, salta a etiqueta "izquierda" que mostrará mensaje hacia la izquierda
  61. jmp poll ;Si ninguna acción es realizada, regresa al proceso de polling
  62.  
  63. //Etiqueta derecha va a setear bandera T
  64. derecha:
  65. set
  66. rjmp apuntadorZ
  67.  
  68. //Etiqueta izquierda limpia bandera T
  69. izquierda:
  70. clt
  71.  
  72. //Preparamos apuntador z a Flash
  73. apuntadorZ:
  74. clc
  75. ldi zl, low(mensaje<<1)
  76. ldi zh, high(mensaje<<1)
  77.  
  78. //Preparamos apuntador y a RAM
  79. ldi yl, low(DatasInRAM)
  80. ldi yh, high(DatasInRAM)
  81. ldi r17, CharsInRAM ;Cargamos el valor 80 al registro r17
  82.  
  83. //Carga caracteres a RAM, para eso utiliza SelCols
  84. LoadCharsInRAM:
  85. lpm r16,Z+
  86. COM r16
  87. st Y+,r16
  88. dec r17
  89. brne LoadCharsInRAM
  90. call SelCols
  91.  
  92. //Coloca al sistema a su configuración de inicio
  93. Repetir:
  94. //Verifica si algún botoon es oprimido
  95. /*Como se usan los mismos apuntadores para el recorrido derecha e izquierda,  
  96. no es necesario que termine un proceso para empezar el otro*/
  97.  
  98. sbic pind,0
  99. rjmp Repetir
  100. call retardo10ms ;rutina antirebote implementada para eliminación de ruido
  101. sbic pind,0 ;Se asegura que el boton siga oprimido
  102. jmp Repetir ;No fue oprimido el boton, fue ruido
  103. wait3:
  104. sbis pind, 0 ;Checa que se suelte el boton
  105. jmp wait3
  106. call retardo10ms ;Termina rutina antirebote
  107. jmp der ;Si pind0 es oprimido, salta a etiqueta "derecha" que mostrará el mensaje hacia la derecha
  108.  
  109. sbic pind, 1
  110. rjmp Repetir
  111. call retardo10ms ;rutina antirebote implementada para eliminación de ruido
  112. sbic pind, 1 ;Se asegura que el boton siga oprimido
  113. jmp Repetir ;No fue oprimido el boton, fue ruido
  114. wait4:
  115. sbis pind, 1 ;Checa que se suelte el boton
  116. rjmp wait4
  117. jmp izq ;Si pind1 es oprimido, salta a etiqueta "izquierda" que mostrará mensaje hacia la izquierda
  118. jmp poll ;Si ninguna acción es realizada, regresa al proceso de polling
  119.  
  120. der: set
  121. rjmp Control
  122.  
  123. izq: clt
  124.  
  125. Control:
  126. //Prepara apuntador Y en dirección de RAM, para poder controlar el  mensaje
  127. cbi MatrixPort,DatasCol    
  128. sbi MatrixPort,ClockCol
  129. cbi MatrixPort,ClockCol
  130. ldi yl, low(DatasInRAM)
  131. ldi yh, high(DatasInRAM)
  132. sbi MatrixPort,DatasCol
  133. ldi r18, columnas-1
  134.  
  135. /*Carga a r16 lo que hay en Y, llamando a SendR0Serial (llenado de renglones).
  136. para hacer un retardo de 1ms y envia un pulso para desplazar las columnas.  
  137. Después checa el estado de r18, mientras no sea 0, repetirá el cambio de las  columnas.
  138. Después, checa si r19 (modificado por las rutinas de rotación derecha  e izquierda) es cero,
  139. mandándo de nuevo el proceso a la etiqueta Repetir para iniciar este proceso de nuevo*/
  140. RepiteNumCol:
  141. LD r16,Y+
  142. call SendR0Serial
  143. call retardo1ms
  144. sbi MatrixPort,ClockCol
  145. cbi MatrixPort,ClockCol
  146. dec r18
  147. brne RepiteNumCol
  148. dec r19
  149. brne Repetir
  150.  
  151. //Según sea el estado de bandera T va a rotar a izquierda o derecha
  152. izqDer:
  153. brts RotaMatrixRAM
  154. brtc RotaMatrixIZQ
  155.  
  156. /*Lee datos de apuntador z para saltar a rotaRAM y regresar a Repetir,
  157. lo que permite el cambio de dirección o seguir en la misma, según sea
  158. la acción realizada*/
  159. RotaMatrixRAM:
  160. ldi zl,low(DatasInRAM)
  161. ldi zh,high(DatasInRAM)
  162. call rotaRAM
  163. ldi r19,20
  164. jmp Repetir
  165.  
  166. /*Rotación de la matriz, los apuntadores van por la tabla Mensaje en Flash,
  167. colocando todos los caracteres hasta que r20 (tamaño de cada mensaje) sea 0*/
  168. rotaRAM:
  169. ldi r20,CharsInRAM-1
  170. mov yl, zl
  171. mov yh, zh
  172. ld r16, y+
  173. push r16
  174. cicloRotaRAM:
  175. ld r16,Y+
  176. st Z+,r16
  177. dec r20
  178. brne cicloRotaRAM
  179. pop r16
  180. st Z,r16
  181. ret
  182.  
  183. //Toma datos del apuntador Z y salta a rotaizq, para después regresar a Repetir
  184. RotaMatrixIZQ:
  185. ldi zl, low(0x00b0)  ;recorre al revés los datos
  186. ldi zh, high(0x00b0)
  187. call rotaizq
  188. ldi r19,20
  189. jmp Repetir
  190.  
  191. /*Rota la matriz utilizando los apuntadores por la tabla en Flash hasta que r20
  192. llegue a 0, r20 es tamaño de mensaje. Se utilizan los apuntadores con pre decremento
  193. y van a la izquierda*/
  194. rotaizq:
  195. ldi r20,CharsInRAM
  196. mov yl, zl
  197. mov yh, zh
  198. ld r16, -y
  199. push r16
  200. cicloRotaizq:
  201. ld r16, -y
  202. st -z,r16
  203. dec r20
  204. brne cicloRotaizq
  205. pop r16
  206. st Z,r16
  207. ret
  208.  
  209. //Rutina encargada de hacer el cambio en renglones
  210. SendR0Serial:
  211. ldi r17,8
  212. cicloSendR0Serial:
  213. sbi MatrixPort,DatasRow
  214. rol r16
  215. brcs SendPulse
  216. cbi MatrixPort,DatasRow
  217. SendPulse:
  218. sbi MatrixPort,ClockRow
  219. cbi MatrixPort,ClockRow
  220. dec r17
  221. brne cicloSendR0Serial
  222. ret
  223.  
  224. //Se dezplazan en Columnas para mostrar el mensaje
  225. SelCols:
  226. ldi r17,columnas
  227. sbi MatrixPort,DatasCol
  228. cicloSelCols:
  229. sbi MatrixPort,ClockCol
  230. cbi MatrixPort,ClockCol
  231. dec r17
  232. brne cicloSelCols
  233.  
  234. //Retardos
  235. retardo1ms:
  236. push r16
  237. push r17
  238. ldi r16,133
  239. ciclo1retardo1ms:
  240. ldi r17,20
  241. ciclo2retardo1ms:
  242. dec r17
  243. brne ciclo2retardo1ms
  244. dec r16
  245. brne ciclo1retardo1ms
  246. pop r17
  247. pop r16
  248. RET
  249.  
  250. //Retardo 10ms antirebote en boton
  251. retardo10ms: ldi r16, 104
  252. ciclo1: ldi r17, 255
  253. ciclo: dec r17
  254. brne ciclo
  255. dec r16
  256. brne ciclo1
  257. ret
  258.  
  259. Mensaje:
  260. .db 0b11111111,0b00000001,0b00010001,0b00101001,0b01000111,0b10000000,0b00000000,0b00000000 ; 'R'
  261. .db 0b00000000,0b00111110,0b01000001,0b01000001,0b01000001,0b01000001,0b01000001,0b01000001 ; 'C'
  262. .db 0x00,0x7e,0x09,0x09,0x09,0x7e,0x00,0x00 ; 'A'
  263. .db 0x00,0xfe,0x91,0x91,0xee,0x00,0x00,0x0B ; 'B'
  264. .db 0b11111111,0b10000001,0b10000001,0b10000001,0b10000001,0b10000001,0b10000001,0b11111111 ; Cuadrado
  265. .db 0xc3,0x66,0x24,0xff,0xff,0x24,0x66,0xc3 ; Cruces
  266. .db 0x08,0x14,0x2a,0x5d,0x2a,0x14,0x08,0x00 ; Rombos
  267. .db 0xff,0x80,0xbe,0xa2,0xaa,0xba,0x82,0xfe ; Snake
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement