Reloj Digital Con Displays de 7 Segmentos y PIC 16F84A

February 25, 2022 | Author: Anonymous | Category: N/A
Share Embed Donate


Short Description

Download Reloj Digital Con Displays de 7 Segmentos y PIC 16F84A...

Description

Reloj Digital con Displays de 7 Segmentos y PIC 16F84A En esta oportunidad quiero compartir con ustedes un sencillo reloj basado en un Microcontrolador PIC de la serie 16F84A y usando display ánodo común de 7 segmentos. Adicionalmente usa otros circuitos con la finalidad de expander el número de salidas, tanto  para control como para datos, y de esa forma podemos contar con más displays y más opciones de Configuración. Entre estos circuitos tenemos el conocido 74LS47, de cuál dejaré el esquema mostrando la disposición de sus pines (Figura 1), así como su tabla de verdad (Figura 2). Para mayor información pueden consultar el datasheet de este componente.

Disposición de pines

Tabla de Verdad

Otro circuit usado es el 74LS138, el cuál funcionará como selector de display para realizar el efecto de barrido. No detallaré tampoco a este componente puesto que no es el objetivo de este post, pero si dejaré algunas imágenes, que al igual que las anteriores, nos da una vista rápida de la disposición y el funcionamiento de este integrado.

Disposición de pines

Tabla de Verdad

También dejaré el diagrama de pines de un display de 7 segmentos.

Ahora, una vez conocido el funcionamiento de los componentes individuales, a continuación muestro el diagrama total del reloj, en donde veremos como estos integrados interactuan entre sí para poder obtener nuestro sencillo reloj digital. Las resistencias que van a los displays son de 330Ω (Naranja, Naranja, Marrón) y las que van a los transistores son de 1KΩ (Marrón, Negro, Rojo). Y claro, las resistencias que van a los pulsadores son de 10KΩ (Marrón, Negro, Naranja).

Antes que nada tenemos que conectar los componentes básicos para el funcionamiento del microcontrolador pic, que son las conexiones a tierra y 5 voltios, el reloj de 4MHz y los capacitores.

Luego podemos armar el siguiente diagrama esquemático para tener en funcionamiento a nuestro sencillo Reloj Digital.

Archivos adjuntos del proyecto:

El código está escritor en ensamblador. Pueden usar el mplab para recompilarlo y usarlo de acuerdo a sus necesidades. view plainprint? 1.  __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC 2. LIST P=16F84A 3. INCLUDE 4. 5. M_UNI equ H'1D' ; Registro para las unidades de los minutos. 6. M_DEC equ H'1C' ; Registro para las decenas de los minutos. 7. 8. H_UNI equ H'1F' ; Registro para las unidades de las horas. 9. H_DEC equ H'1E' ; Registro para las decenas de las horas. 10. 11. S_UNI equ H'20' ; Registro para las unidades de los segundos. 12. S_DEC equ H'21' ; Registro para las decenas de los segundos. 13. 14. BARR equ H'1B' ; Registro para almacenar el número de barridos. 15. PAUSE equ H'1A' ; Registro para almacenar el tiempo de barrido. 16. 17. ;Algunas definiciones de registros y pines 18. ;----------------------------------------19. #DEFINE REINICIO PORTA,0 ; Pulsador conectado a RA0. 20. #DEFINE MINUTO PORTA,1 ; Pulsador conectado a RA1. 21. #DEFINE HORA PORTA,2 ; Pulsador conectado a RA2. 22. #DEFINE DISPLAY PORTB ; El display está conectado al Puerto B. 23. 24. ORG 0 25. 26. Inicio 27. bsf STATUS,RP0 ; Acceso al Banco 1. 28. clrf DISPLAY ; Línea del LED configurada como salida. 29. movlw b'00011111' ; Las 5 líneas del Puerto A se configuran como entrada. 30. movwf PORTA 31. bcf STATUS,RP0 ; Acceso al Banco 0. 32. ;Inicialización de Registros 33. ;--------------------------34. clrf S_UNI 35. clrf S_DEC 36. clrf M_UNI 37. clrf M_DEC 38. clrf H_UNI 39. clrf H_DEC 40. clrf BARR 41. ;---------------------------

42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89.

Principal clrf BARR ; Limpiamos el registro de barridos ;Para el botón de reinicio no importa los rebotes ;-----------------------------------------------VerificarPulsadorReset btfss REINICIO ; ¿Pulsador reposo?, ¿Pulsador=1? call InicializarRegistros ;-----------------------------------------------------------------------------;Para el botón de incremento de minutos si importan los rebotes ;-------------------------------------------------------------VerificarPulsadorMinutos btfsc MINUTO ; ¿Pulsador presionado?, ¿(Pulsador)=0? goto VerificarPulsadorHoras ; No vuelve a leerlo call Temporizador ; Espera a que se estabilicen los niveles de tensión. btfsc MINUTO ; Comprueba si es un rebote. goto VerificarPulsadorHoras ; Era un rebote y sale. goto SoloMinutosEnUno ; Salta a la subrutina para incrementar los minutos en 1 ;-----------------------------------------------------------------------------;Para el botón de incremento de horas también importan los rebotes ;----------------------------------------------------------------VerificarPulsadorHoras ;-----------------------------------------------------------------------------btfsc HORA ; ¿Pulsador presionado?, ¿(Pulsador)=0? goto SoloSegundosEnUno ; No vuelve a leerlo call Temporizador ; Espera a que se estabilicen los niveles de tensión. btfsc HORA ; Comprueba si es un rebote. goto SoloSegundosEnUno ; Era un rebote y sale fuera. call SoloHorasEnUno ;-----------------------------------------------------------------------------SoloSegundosEnUno call IncrementarSegundosEnUno Mostrar call ValidarTiempo call Barrido ;-----------------------------------------------------------------------------Fin goto Principal ;-----------------------------------------------------------------------------SoloMinutosEnUno call IncrementarMinutosEnUno goto Mostrar

90. 91. SoloHorasEnUno 92. call IncrementarHorasEnUno 93. goto Mostrar 94. 95. ;************************************* 96. ; Subrutina de Incremento de Registros 97. ;************************************* 98. 99. ;-----------------------------------------------------------------------------100. IncrementarSegundosEnUno 101. incf S_UNI,f ; Incrementa el valor de S_UNI 102. movfw S_UNI ; Carga W con el valor del regustro S_UNI 103. sublw D'10' ; Resta 10 para verificar si S_UNI=10? 104. btfsc STATUS, Z ; Verifica si el resultado fué cero 105. call IncrementarSegundosEnDiez ; Si es cero, entonces acarreamos uno 106. return 107. ;-----------------------------------------------------------------------------108. 109. IncrementarSegundosEnDiez 110. clrf S_UNI ; El acarreo implica limpiar el registro anterior 111. incf S_DEC,f ; Incrementa el valor de S_DEC 112. movfw S_DEC ; Carga W con el valor del regustro S_DEC 113. sublw D'6' ; Resta 6 para verificar si S_UNI=6? 114. btfsc STATUS, Z ; Verifica si el resultado fué cero 115. call IncrementarMinutosEnUno ; Si es cero, entonces acarreamos uno 116. return 117. ;-----------------------------------------------------------------------------118. 119. IncrementarMinutosEnUno 120. clrf S_DEC ; El acarreo implica limpiar el registro anterior 121. incf M_UNI,f ; Incrementa el valor de M_UNI 122. movfw M_UNI ; Carga W con el valor del regustro M_UNI 123. sublw D'10' ; Resta 10 para verificar si S_UNI=10? 124. btfsc STATUS, Z ; Verifica si el resultado fué cero 125. call IncrementarMinutosEnDiez ; Si es cero, entonces acarreamos uno 126. return 127. ;-----------------------------------------------------------------------------128. 129. IncrementarMinutosEnDiez 130. clrf M_UNI ; El acarreo implica limpiar el registro anterior 131. incf M_DEC,f ; Incrementa el valor de M_DEC 132. movfw M_DEC ; Carga W con el valor del regustro M_DEC 133. sublw D'6' ; Resta 6 para verificar si S_UNI=6? 134. btfsc STATUS, Z ; Verifica si el resultado fué cero 135. call IncrementarHorasEnUno ; Si es cero, entonces acarreamos uno 136. return 137. ;------------------------------------------------------------------------------

138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185.

IncrementarHorasEnUno clrf M_DEC ; El acarreo implica limpiar el registro anterior incf H_UNI,f ; Incrementa el valor de H_UNI movfw H_UNI ; Carga W con el valor del regustro H_UNI sublw D'10' ; Resta 6 para verificar si S_UNI=10? btfsc STATUS, Z ; Verifica si el resultado fué cero call IncrementarHorasEnDiez ; Si es cero, entonces acarreamos uno return ;-----------------------------------------------------------------------------IncrementarHorasEnDiez clrf H_UNI ; El acarreo implica limpiar el registro anterior incf H_DEC,f ; Incrementa el valor de H_DEC movfw H_DEC ; Carga W con el valor del regustro H_DEC sublw D'10' ; Resta 6 para verificar si S_UNI=10? btfsc STATUS, Z ; Verifica si el resultado fué cero clrf H_DEC ; Si es cero, entonces acarreamos uno return ;-----------------------------------------------------------------------------;********************************* ; Subrutina de Barrido de Displays ;********************************* ;-----------------------------------------------------------------------------Barrido btfss REINICIO ; ¿Pulsador reposo?, ¿Pulsador=1? call InicializarRegistros incf BARR, f ; Incrementa en 1 el registro de barridos ;Unidades de segundos ;-------------------movlw b'00001111' ; Activamos el primer display movwf DISPLAY ; Movemos el dato al puerto B movf S_UNI,0 ; Mueve M_UNI al registro W iorlw b'00000000' ; Aplicamos la máscara movwf DISPLAY ; Mostramos en el puerto B call Temporizador ; Pausa para establecer niveles de tensión correctamente movlw B'00001111' ; Cargamos el valor adecuado a W para limpiar los registros movwf DISPLAY ; Limpiamos el display para evitar que los dígitos se repitan ;-----------------------------------------------------------------------------;Decenas de segundos movlw b'00011111' ; Activamos el segundo display movwf DISPLAY ; Movemos el dato al puerto B movf S_DEC,0 ; Mueve S_DEC al registro W iorlw b'00010000' ; Aplicamos la máscara movwf DISPLAY ; Mostramos en el puerto B

186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233.

call Temporizador ; Pausa para establecer niveles de tensión correctamente movlw B'00011111' ; Cargamos el valor adecuado a W para limpiar los registros movwf DISPLAY ; Limpiamos el display para evitar que los dígitos se repitan ;-----------------------------------------------------------------------------;Unidades de minutos movlw b'00101111' ; Activamos el tercer display movwf DISPLAY ; Movemos el dato al puerto B movf M_UNI,0 ; Mueve M_UNI al registro W iorlw b'00100000' ; Aplicamos la máscara movwf DISPLAY ; Mostramos en el puerto B call Temporizador ; Pausa para establecer niveles de tensión correctamente movlw B'00101111' ; Cargamos el valor adecuado a W para limpiar los registros movwf DISPLAY ; Limpiamos el display para evitar que los dígitos se repitan ;-----------------------------------------------------------------------------;Decenas de minutos movlw b'00111111' ; Activamos el cuarto display movwf DISPLAY ; Movemos el dato al puerto B movf M_DEC,0 ; Mueve M_UNI al registro W iorlw b'00110000' ; Aplicamos la máscara movwf DISPLAY ; Mostramos en el puerto B call Temporizador ; Pausa para establecer niveles de tensión correctamente movlw B'00111111' ; Cargamos el valor adecuado a W para limpiar los registros movwf DISPLAY ; Limpiamos el display para evitar que los dígitos se repitan ;-----------------------------------------------------------------------------;Unidades de horas movlw b'01001111' ; Activamos el quinto display movwf DISPLAY ; Movemos el dato al puerto B movf H_UNI,0 ; Mueve M_UNI al registro W iorlw b'01000000' ; Aplicamos la máscara movwf DISPLAY ; Mostramos en el puerto B call Temporizador ; Pausa para establecer niveles de tensión correctamente movlw B'01001111' ; Cargamos el valor adecuado a W para limpiar los registros movwf DISPLAY ; Limpiamos el display para evitar que los dígitos se repitan ;-----------------------------------------------------------------------------;Decenas de horas movlw b'01011111' ; Activamos el sexto display movwf DISPLAY ; Movemos el dato al puerto B movf H_DEC,0 ; Mueve M_UNI al registro W iorlw b'01010000' ; Aplicamos la máscara movwf DISPLAY ; Mostramos en el puerto B call Temporizador ; Pausa para establecer niveles de tensión correctamente movlw B'01011111' ; Cargamos el valor adecuado a W para limpiar los registros movwf DISPLAY ; Limpiamos el display para evitar que los dígitos se repitan ;-----------------------------------------------------------------------------;Verificar barrido movfw BARR ; carga W con el número de barridos sublw D'50' ; Resta 50 para comparar si es igual a 50 btfsc STATUS, Z ; Verifica si el resultado fué 0, o sea si BARR=50?

234. return ; Se completó el número de barridos 235. goto Barrido 236. ;-----------------------------------------------------------------------------237. 238. ValidarTiempo 239. movfw H_UNI ; Carga el registro W con el valor del registro H_UNI 240. sublw D'4' ; Resta 4 para verificar si es que el valor de W=4? 241. btfsc STATUS, Z ; Verifica si el resultado fué cero 242. goto ValidarHora ; Ahora llamamos al subrutina para verificar el siguiente dígito d e la hora 243. return 244. ;-----------------------------------------------------------------------------245. 246. ValidarHora 247. movfw H_DEC ; Carga el registro W con el valor del registro H_DEC 248. sublw D'2' ; Resta 2 para verificar si es que el valor de W=2? 249. btfsc STATUS, Z ; Verifica si el resultado fué cero 250. goto InicializarRegistros ; Al llamar a esta subrutina quiere decir que la hora=24, lo cuál implica un reinicio 251. return 252. ;-----------------------------------------------------------------------------253. 254. InicializarRegistros 255. clrf S_UNI 256. clrf S_DEC 257. clrf M_UNI 258. clrf M_DEC 259. clrf H_UNI 260. clrf H_DEC 261. return 262. ;-----------------------------------------------------------------------------263. 264. Temporizador 265. movlw D'255' ; w = 50 decimal 266. movwf PAUSE ; K = w 267. 268. Kloop 269. decfsz PAUSE,f ; K = K - 1 , salta a la siguiente instrucción si es cero. 270. goto Kloop 271. return 272. ;-----------------------------------------------------------------------------273. 274. END ; Fin del programa.

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF