Está en la página 1de 5

; CARTEL DE LEDS. de 32x8. ; Si las letras son de 8x8, maxima cantidad de letras en el mensaje 31.

; **** Encabezado **** list p=16F628A ; Microcontrolador utilizado.#include P16F628A.inc ; Definicion de registros SFR.__CONFIG _HS_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF & _MCLRE_ON & _BOREN_OFF & _LVP_OFF & _DATA_CP_OFF ;**** Definicion de Variables **** CBLOCK 0x20 ; En esta posicion se declaran los registros de usuario (GPR ) STATUS_Temp ; Registro para guardar temporalmete STATUS W_Temp ; Registro para guardar temporalmete W Banderas ; Registro para almacenar banderas.FilaActual ; Fila Actual a refrescar.PosicionInicial ; Posicion inicial dentro del mensaje a visualizar en el car tel.- (Entre 0 y LargoMsj-1) PosicionEnviar ; Posicion del registro a enviar.CuentaRefrescos ; Cuenta la cantidad de refrescos realizados. LargoCartel ; Guarda largo del cartel.- 32 LargoMsj ; largo del mesaje a visualizar-> Max 249 Bytes.-Para aument ar modificar manejo de tabla.TempH ; Temporal para guardar calculos matemticos.TempL ; Temporal... VelMovimiento ; Para fijar velocidad de movimiento.ENDC Velocidad equ d'4' ; Para fijar velocidad de desplazamiento.kbhit_tiempo equ 0 ; Bandera que indica que han pasado 2ms.kbhit_cuadro equ 1 BData equ 0 BClock equ 1 Strobe equ 2 ;**** Inicio del Microcontrolador **** Reset org 0x00 goto Inicio ; Salto a inicio del programa.;**** Vector de Interrupcion **** org 0x04 goto Inicio_ISR ; Atiendo Interrupcion.;**** Mensaje a Mostrar ***** org 0x05 Mensaje addwf PCL,1 ; Se incrementa el contador del DT 0x38, 0x7C, 0xFE, 0x82, 0x82, 0x82, 0x44, 0x00 DT 0x60, 0xF4, 0x94, 0x94, 0xFC, 0xF8, 0x00, 0x00 DT 0xFC, 0xFC, 0x08, 0x04, 0x04, 0x00, 0x00, 0x00 DT 0x04, 0xFE, 0xFE, 0x84, 0x40, 0x00, 0x00, 0x00 DT 0x78, 0xFC, 0x94, 0x9C, 0x58, 0x00, 0x00, 0x00 DT 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 DT 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 DT 0x78, 0xFC, 0x84, 0x48, 0xFE, 0xFE, 0x00, 0x00 DT 0x78, 0xFC, 0x94, 0x9C, 0x58, 0x00, 0x00, 0x00 DT 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 DT 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 DT 0x78, 0xFC, 0x94, 0x9C, 0x58, 0x00, 0x00, 0x00 DT 0x78, 0xFC, 0x84, 0x48, 0xFE, 0xFE, 0x00, 0x00 DT 0x88, 0x9C, 0x94, 0xF4, 0x64, 0x00, 0x00, 0x00 DT 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 DT 0x8C, 0x9E, 0xFE, 0xFA, 0x62, 0x00, 0x00, 0x00

programa.; C ; a ; r ; t ; e ; l ; Espacio ; d ; e ; Espacio ; l ; e ; d ; s ; Espacio ; S

DT 0x7C, 0xFC, 0x80, 0x80, 0xFC, 0xFC, 0x00, 0x00 ; u DT 0xFE, 0xFE, 0x10, 0x38, 0x64, 0xC4, 0x80, 0x00 ; k DT 0x04, 0x8C, 0xB8, 0x70, 0x30, 0x08, 0x04, 0x00 ; y DT 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ; Espacio DT 0x82, 0xC1, 0xA1, 0x91, 0xCE, 0x00, 0x00, 0x00 ; 2 DT 0x80, 0x86, 0x85, 0x89, 0x71, 0x00, 0x00, 0x00 ; 5 DT 0xC0, 0x3C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 ; / DT 0x81, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00 ; 1 DT 0x7E, 0x81, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00 ; 0 DT 0xC0, 0x3C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 ; / DT 0x7E, 0x81, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00 ; 0 DT 0x8E, 0x91, 0x51, 0x71, 0x1E, 0x00, 0x00, 0x00 ; 9 DT 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ; Espacio ;**** Programa principal **** Inicio ;---- Configuraciones ---bsf STATUS,RP0 ; Banco 1.movlw 0xF8 movwf TRISA ;eeeeesss movlw 0x00 movwf TRISB ;ssssssss movlw 0xDF movwf OPTION_REG ; Pull-Up deshabiltado, , Timer0|interno, 1:1 bcf STATUS,RP0 ; Banco 0.movlw 0x07 ; Configuro Comparador Analogico movwf CMCON ; V1in-=GND, V1in+=GND, C1out=Off| V2in-=GND, V2in+=GND, C2 out=Off clrf PORTA clrf PORTB movlw 0x4D movwf T2CON ; Timer2: Pre=1:4, Post=1:10 movlw movwf movlw movwf movlw movwf clrf clrf movlw movwf movlw movwf clrf bsf bsf bcf bsf bsf Bucle btfss goto bcf call goto Velocidad ; Cargamos velocidad de desplazamiento.VelMovimiento d'32' ; Cargamos largo del cartel.LargoCartel d'232' ; Cargamos largo del mensaje.LargoMsj PosicionInicial Banderas 0x01 FilaActual 0x08 CuentaRefrescos PIR1 ; Limpiamos Banderas STATUS,RP0 ; Banco 1.PIE1,TMR2IE ; Habilitamos interrupcion por Timer2 STATUS,RP0 ; Banco 0.INTCON,GIE ; Habilitacion general de interrupciones INTCON,PEIE ; Habilitacion de interrupciones Perifericas Banderas,kbhit_tiempo $-1 Banderas,kbhit_tiempo ActualizarCartel Bucle ; Se espera a que pasen 2 ms.; Se actuliza fila del cartel.-

;************************************************************************** ;**** Rutina de servicio de Interrupcion **** Inicio_ISR ;---- Guardado de registro W y STATUS ---movwf W_Temp ; Copiamos W a un registro Temporario swapf STATUS,W ; Invertimos nibles de STATUS movwf STATUS_Temp ; Guardamos STATUS en un registro temporal ;---- Interrupciones ---btfsc PIR1,TMR2IF ; Interrupcion por Timer2? goto ISR_TIMER2 ; Si, se trata interrupcion ;............................. Fin_ISR ;---- Restauramos los valores de W y STATUS ---swapf STATUS_Temp,W movwf STATUS swapf W_Temp,f swapf W_Temp,W retfie ;....................... ISR_TIMER2 ; Tratamiento de Interrupcion decfsz CuentaRefrescos,1 ; Se refrescaron las 8 filas (Momento adecuado p ara realizar algun cambio.-) goto SetBandera ; No, seguimos.. decfsz VelMovimiento,1 ; Si, ya pasaron 16ms x VelMovimiento? goto RecargarData ; No, seguimos... movlw Velocidad ; Recargamos Velocidad movwf VelMovimiento incf PosicionInicial ; Si, incrementamos PosicionInicial para efectua r "movimiento" movfw LargoMsj ; Verificamos si ya se llego al final del Mensaj e.subwf PosicionInicial,0 btfss STATUS,Z goto RecargarData ; No, seguimos.. clrf PosicionInicial ; Si, reseteamos PosicionInicial.RecargarData movlw 0x01 movwf FilaActual movlw 0x08 movwf CuentaRefrescos SetBandera bsf Banderas,kbhit_tiempo ; Indicamos que han pasado 2 ms, y es necesa rio actualizar.bcf PIR1,TMR2IF ; Borramos bandera goto Fin_ISR ;....................... ;************************************************************************* ActualizarCartel ; Es (PosicionInicial + LargoCartel <= LargoMsj)? clrf TempH ; Borramos Byte alto de variable de 16bits tempo ral.bcf STATUS,C ; Aseguramos que el carry sea 0 :P movfw PosicionInicial ; Sumamos PosicionInicial + largoCartel.addwf LargoCartel,0 ; Y lo guardamos en W.movwf TempL ; Cargamos el resultado bajo en variable tempora l.btfsc STATUS,C ; y si hay carry incrementamos registro alto del resultado temporal.incf TempH ; (Esto se da porque el resultado es mayor a 255

) btfsc TempH,0 ; Es mayor a 255? goto $+4 ; (Solo lo hacemos as porque LargoMsj debe ser me nor o igual a 255) movfw TempL ; No es mayor a 255, verficamos Byte bajo.subwf LargoMsj,0 btfss STATUS,C goto DividoEnDosPartes ; Es mayor... ;**************************************************************************** ; Es menor... ; Hay que de la posicion actual sumar el largo de leds y despues comenzar a actualizar el cartel.movfw TempL ; Cargamos posicion de donde comenzar a cargar mensa je.movwf PosicionEnviar CicloEnvio call EnviaBit ; Se envia bits actual del byte seleccionado.decf PosicionEnviar,1 ; Se decrementa direccionador del byte a enviar. movfw PosicionInicial ; Es igual a la posicion inicial de donde se com ienza a visualizar mensaje?? subwf PosicionEnviar,0 btfss STATUS,Z ; goto CicloEnvio ; No, seguimos con el siguiente byte.goto Efectivizamos ; Ahora se habilitar Strobe para efectivizar los cambios y activaremos la Fila correspondiente.;****************************************************************************** ; Es mayor... DividoEnDosPartes ;(LargoMsj - PosicionInicial): movfw PosicionInicial subwf LargoMsj,0 movwf TempL ; Guardamos resultado de la resta en registro te mporal.;[LargoCartel - (LargoMsj - PosicionInicial)]: movfw TempL subwf LargoCartel,0 movwf PosicionEnviar ; Guardamos desde donde comenzamos a enviar disminuy endo hasta 1... CicloEnvio_1 call EnviaBit ; Se envia bits actual del byte seleccionado.decf PosicionEnviar,1 ; Se decrementa direccionador del byte a enviar. movlw 0x00 subwf PosicionEnviar,0 ; Es igual a 0x00?? btfss STATUS,Z goto CicloEnvio_1 ; Enviamos Segunda parte.movfw LargoMsj movwf PosicionEnviar CicloEnvio_2 call EnviaBit ; Se envia bits actual del byte seleccionado.decf PosicionEnviar,1 ; Se decrementa direccionador del byte a enviar. movfw PosicionInicial ; Es igual a la posicion inicial de donde se com ienza a visualizar mensaje?? subwf PosicionEnviar,0 btfss STATUS,Z

goto CicloEnvio_2 ; No, seguimos con el siguiente byte.goto Efectivizamos ; Ahora se habilitar Strobe para efectivizar los cambios y activaremos la Fila correspondiente.;******************************************************************************* ***** EnviaBit decf PosicionEnviar,0 ; Cargamos posicion en W del byte a visualizar.call Mensaje ; Cargamos en W el byte actual a refrescar.andwf FilaActual,0 ; Hacemos ByteActual (AND) FilaActual para deter minar el bit a enviar.subwf FilaActual,0 ; [ByteActual(AND)FilaActual] - FilaActual, si e sto es cero el bit a enviar es 1, sino 0.bcf PORTA,BData ; Primero cargamos un 0.btfsc STATUS,Z ; La operacion anterior es 0? bsf PORTA,BData ; Si, cargamos un 1 en el bit bsf PORTA,BClock ; Generamos clock.nop ; demora bcf PORTA,BClock ;.. return ;.......................................................... Efectivizamos movlw 0xFF ; Descactivamos todas las filas.movwf PORTB bsf PORTA,Strobe ; Efectivizamos los datos en los registros de de splazamiento.nop bcf PORTA,Strobe comf FilaActual,0 ; Complementamos FilaActual para activar Fila ac tual a refrescar.movwf PORTB bcf STATUS,C ; rlf FilaActual,1 ; Rotamos Fila actual para proxima actualizacion .return end

También podría gustarte