;MATRIZ GRAFICA DE LEDS ;AUTOR JUAN ANDRES CASTAÑO WELGOS ;welgos@telesat.com.co patulink@usa.net ;PEREIRA NOVIEMBRE DE 1999 ;PROHIBIDA LA REPRODUCCION TOTAL O PARCIAL DE ;ESTE PROGRAMA SIN LA DEBIDA AUTORIZACION INCLUDE "c:\P16F84.INC" LIST P=16F84 __CONFIG B'11111111110001' ;protecciones off, powerup timer on, WDT off, XT ;-------------------------------------------------------------------------- RATA_DE_MULTIPLEXACION EQU H'50' RATA_DE_DIBUJO EQU H'20' ALTURA_PANTALLA EQU H'08' ANCHO_PANTALLA EQU H'08' ;-------------------------------------------------------------------------- ; asignacion de RAM en el banco 0 (0Ch-4Fh) ContaRetardo EQU H'0C' RetDibujo EQU H'0D' Screen0 EQU H'10' Screen1 EQU H'18' RataDibu EQU H'44' BallDY EQU H'45' BallDX EQU H'46' BallY EQU H'47' BallX EQU H'48' TempDibu EQU H'49' ContaDibu EQU H'4A' MultiplexRata EQU H'4B' Scratch0 EQU H'4C' Scratch1 EQU H'4D' Scratch2 EQU H'4E' Scratch3 EQU H'4F' ;-------------------------------------------------------------------------- ORG 0 PowerOn BSF STATUS,RP0 MOVLW H'00' MOVWF TRISB ;configura todos los bits del PORTB como salidas MOVWF TRISA ;configura todos los bits del PORTA como salidas MOVLW B'11010111' ;Turn off PORTB pullups, prescaler del TMR0, 1:256 MOVWF OPTION_REG ;------------------------------------------------------------ BCF STATUS,RP0 MOVLW RATA_DE_MULTIPLEXACION MOVWF MultiplexRata MOVLW RATA_DE_DIBUJO MOVWF RataDibu ;------------------------------------------------------------ MOVLW H'03' MOVWF BallX MOVLW H'00' MOVWF BallY MOVLW H'01' MOVWF BallDX MOVWF BallDY ;------------------------------------------------------------ CALL ShowVersion MOVLW H'10' CALL RepitaDibujo ;------------------------------------------------------------ LAZO BCF STATUS,RP0 MOVLW RATA_DE_MULTIPLEXACION MOVWF MultiplexRata MOVLW RATA_DE_DIBUJO MOVWF RataDibu ;------------------------------------------------------------ CALL cekitLogo MOVLW H'10' CALL RepitaDibujo MOVLW H'40' CALL RepitaRotUp ;------------------------------------------------------------ CALL ShowCarita MOVLW H'10' CALL RepitaDibujo CALL BlankScreen MOVLW H'04' CALL RepitaDibujo CALL ShowSkull MOVLW H'10' CALL RepitaDibujo ;------------------------------------------------------------ MOVLW RATA_DE_DIBUJO / 2 MOVWF RataDibu MOVLW H'00' CALL RepitaBola MOVLW RATA_DE_DIBUJO MOVWF RataDibu ;------------------------------------------------------------ GOTO LAZO ;-------------------------------------------------------------------------- ; SUBRUTINA MUSTRA EL MISMO DIBUJO [W] ;-------------------------------------------------------------------------- RepitaDibujo MOVWF Scratch0 RFLoop CALL DisplayDibujo DECFSZ Scratch0,1 GOTO RFLoop RETLW 0 ;-------------------------------------------------------------------------- ; SUBRUTINA Rota HACIA ARRIBA [W] VECES ;-------------------------------------------------------------------------- RepeatRotUp MOVWF Scratch2 RRULoop CALL RotaUp CALL DisplayDibujo DECFSZ Scratch2,1 GOTO RRULoop RETLW 0 ;-------------------------------------------------------------------------- ; SUBRUTINA Repita el rebota de la bola [W] veces ; ENTRADA W = número de repeticiones ;-------------------------------------------------------------------------- RepitaBola MOVWF Scratch2 RBLLoop CALL UpdateBall CALL DisplayDibujo DECFSZ Scratch2,1 GOTO RBLLoop RETLW 0 ;-------------------------------------------------------------------------- ; SUBRUTINA Retardo corto para la multiplexación ;-------------------------------------------------------------------------- ShortDelay MOVF MultiplexRata,0 MOVWF ContaRetardo SDelayLoop NOP NOP NOP NOP DECFSZ ContaRetardo,1 GOTO SDelayLoop RETLW 0 ;-------------------------------------------------------------------------- ; SUBRUTINA muestra el dibujo por un intervalo corto ;-------------------------------------------------------------------------- DisplayDibujo MOVF RataDibu,0 MOVWF RetDibujo DFOuterLoop MOVLW ALTURA_PANTALLA MOVWF ContaDibu MOVLW H'01' ;fila 0 (bottom) MOVWF TempDibu ; MOVLW Screen0 + ALTURA_PANTALLA ;Localiza la cima del screen MOVWF FSR DFLoop MOVLW B'00000000' MOVWF PORTA DECF FSR,1 MOVF INDF,0 MOVWF PORTB MOVLW B'00000001' MOVWF PORTA MOVF TempDibu,0 MOVWF PORTB MOVLW B'00000010' MOVWF PORTA RLF TempDibu,1 BCF TempDibu,0 CALL ShortDelay MOVLW B'11111111' MOVWF PORTB MOVLW B'00000001' MOVWF PORTA MOVLW B'00000000' MOVWF PORTB MOVLW B'00000010' MOVWF PORTA DECFSZ ContaDibu,1 GOTO DFLoop DECFSZ RetDibujo,1 GOTO DFOuterLoop RETLW 0 ;-------------------------------------------------------------------------- ; SUBRUTINA mustra la bola en posicion actual y actualiza ; BallX, BallY, BallDX y BallDY. ;-------------------------------------------------------------------------- UpdateBall CALL BlankScreen MOVLW Screen0 MOVWF FSR MOVF BallY,0 ADDWF FSR,1 MOVLW B'01111111' MOVWF TempDibu MOVF BallX,0 MOVWF Scratch1 INCF Scratch1,1 UBLoop DECF Scratch1,1 BTFSC STATUS,Z GOTO UBLDone BSF STATUS,C RRF TempDibu,1 GOTO UBLoop UBLDone MOVF TempDibu,0 MOVWF INDF ; actualizar posiciion de la bola MOVF BallDX,0 ADDWF BallX,1 MOVF BallDY,0 ADDWF BallY,1 ; actualizar velocidadde la bola al chocar contra la pared MOVLW ANCHO_PANTALLA - 1 SUBWF BallX,0 BTFSS STATUS,Z GOTO NoXRBounce XBounce COMF BallDX,1 ;BallDX = -BallDX INCF BallDX,1 GOTO TestYBounce NoXRBounce MOVLW H'00' SUBWF BallX,0 BTFSC STATUS,Z GOTO XBounce TestYBounce MOVLW ALTURA_PANTALLA - 1 SUBWF BallY,0 BTFSS STATUS,Z GOTO NoYBBounce YBounce COMF BallDY,1 ;BallDY = -BallDY INCF BallDY,1 GOTO YBDone NoYBBounce MOVLW H'00' SUBWF BallY,0 BTFSC STATUS,Z GOTO YBounce YBDone RETLW 0 ;-------------------------------------------------------------------------- ; carita ;-------------------------------------------------------------------------- ShowCarita ; MOVLW B'00111100' MOVLW B'11000011' MOVWF Screen0 MOVWF Screen0+H'7' ;MOVLW B'01000010' MOVLW B'10111101' MOVWF Screen0+H'1' MOVWF Screen0+H'6' ; MOVLW B'10100101' MOVLW B'01011010' MOVWF Screen0+H'2' ; MOVLW B'10000001' MOVLW B'01111110' MOVWF Screen0+H'3' ; MOVLW B'10100101' MOVLW B'01011010' MOVWF Screen0+H'4' ; MOVLW B'10011001' MOVLW B'01100110' MOVWF Screen0+H'5' RETLW 0 ;-------------------------------------------------------------------------- ; SUBRUTINA screen buffer (8x16 pix ; :-) ;-------------------------------------------------------------------------- cekitLogo MOVLW B'10001000' MOVWF Screen0 MOVWF Screen0+H'4' MOVLW B'11101110' MOVWF Screen0+H'1' MOVWF Screen0+H'3' MOVLW B'11001110' MOVWF Screen0+H'2' MOVLW B'11111111' MOVWF Screen0+H'5' MOVLW B'11010110' MOVWF Screen0+H'6' MOVWF Screen0+H'A' MOVLW B'11011010' MOVWF Screen0+H'7' MOVWF Screen0+H'9' MOVLW B'11011100' MOVWF Screen0+H'8' MOVLW B'11111111' MOVWF Screen0+H'B' MOVLW B'11000111' MOVWF Screen0+H'C' MOVLW B'11101111' MOVWF Screen0+H'D' MOVWF Screen0+H'E' MOVWF Screen0+H'F' CALL DisplayDibujo RETLW 0 ;-------------------------------------------------------------------------- ; SUBRUTINA ;-------------------------------------------------------------------------- RotaUp MOVLW (ALTURA_PANTALLA * 2) - 1 MOVWF Scratch0 MOVLW Screen0+1 MOVWF FSR MOVF Screen0,0 MOVWF Scratch1 RULoop MOVF INDF,0 DECF FSR,1 MOVWF INDF INCF FSR,1 INCF FSR,1 DECFSZ Scratch0,1 GOTO RULoop MOVF Scratch1,0 MOVWF Screen0+(ALTURA_PANTALLA * 2) - 1 RETLW 0 ;-------------------------------------------------------------------------- ; SUBRUTINA ;-------------------------------------------------------------------------- ShowVersion MOVLW B'01011111' MOVWF Screen0 MOVWF Screen0+H'1' MOVLW B'10111111' MOVWF Screen0+H'2' MOVLW B'11111111' MOVWF Screen0+H'3' MOVLW B'01111011' MOVWF Screen0+H'4' MOVLW B'01110101' MOVWF Screen0+H'5' MOVWF Screen0+H'6' MOVLW B'01011011' MOVWF Screen0+H'7' RETLW 0 ;-------------------------------------------------------------------------- ; SUBRUTINA ;-------------------------------------------------------------------------- BlankScreen MOVLW Screen0 MOVWF FSR MOVLW ALTURA_PANTALLA * 2 MOVWF Scratch0 MOVLW B'11111111' BSLoop MOVWF INDF INCF FSR,1 DECFSZ Scratch0,1 GOTO BSLoop RETLW 0 ;-------------------------------------------------------------------------- ; SUBRUTINA LIMPIA MEMORIA DE VIDEO ;-------------------------------------------------------------------------- LightScreen MOVLW Screen0 MOVWF FSR MOVLW ALTURA_PANTALLA * 2 MOVWF Scratch0 MOVLW B'00000000' LSLoop MOVWF INDF INCF FSR,1 DECFSZ Scratch0,1 GOTO LSLoop RETLW 0 END