You are on page 1of 8

C:\16f628a\ledmultiplex\ledmultiplex.

asm ;************************************************* ;Programa que muestra los nmeros del 9 al 0 ;de manera descendente en una matriz de 5x7 ;leds mediante multiplexacin. Los nodos (filas) ;estn conectados al puerto B (RB0/RB6) mientras ;que los ctodos (columnas) al puerto A (RA0/RA4). ;La multiplexacin se realiza recorriendo un cero ;por el puerto A y mostrando por el puerto B el ;valor de la columna deseada. ; ;Fecha: 05.01.08 Autor: Jorge A. Bojrquez ;http://micropic.wordpress.com ;************************************************* list include __config cblock w_temp s_temp p_temp num1 num2 num3 num4 num5 NUMERO d1 d2 d3 endc org goto org ISR movwf swapf movwf movfw movwf btfss goto bcf CHECKCOL 1 w_temp STATUS,W s_temp PCLATH p_temp ; ; ; ; ; Guarda W Swap STATUS en W Guarda STATUS Mueve PCLATH a W Guarda PCLATH 0x20 p=16f628a p16f628a.inc 0x3f18

0x00 INICIO 0x04

PIR1,TMR2IF ; Checa si TMR2 interrumpio SAL_ISR ; No, sale de la ISR PIR1,TMR2IF ; Si, borra bandera de interrupcion

C:\16f628a\ledmultiplex\ledmultiplex.asm btfss goto btfss goto btfss goto btfss goto btfss goto UNO1 movlw movwf movf movwf movlw movwf goto UNO2 movlw movwf movf movwf movlw movwf goto UNO3 movlw movwf movf movwf movlw movwf goto UNO4 movlw movwf movf movwf movlw movwf goto UNO5 movlw 0xFF ; 2 0xFF PORTA num4,w PORTB b'11110111' PORTA SAL_ISR ; ; Apaga matriz ;load columns ; Enciende columna 4 0xFF PORTA num3,w PORTB b'11111011' PORTA SAL_ISR ; ; Apaga matriz ;load columns ; Enciende columna 3 0xFF PORTA num2,w PORTB b'11111101' PORTA SAL_ISR ; ; Apaga matriz ;load columns ; Enciende columna 2 0xFF PORTA num1,w PORTB b'11111110' PORTA SAL_ISR ; ; Apaga matriz ;load columns ; Enciende columna 1 PORTA,4 UNO1 PORTA,0 UNO2 PORTA,1 UNO3 PORTA,2 UNO4 PORTA,3 UNO5

C:\16f628a\ledmultiplex\ledmultiplex.asm movwf movf movwf movlw movwf goto SAL_ISR movfw movwf swapf movwf swapf swapf retfie INICIO movlw movwf bsf clrf clrf bcf clrf clrf clrf PORTA ; Apaga matriz num5,w PORTB ;load columns b'11101111' PORTA ; Enciende columna 5 SAL_ISR

p_temp PCLATH s_temp,W STATUS w_temp,F w_temp,W

; Recupera PCLATH ; Recupera STATUS ; Recupera W

0x07 CMCON STATUS,RP0 TRISA TRISB STATUS,RP0 PORTA PORTB NUMERO

; ; ; ; ; ; ; ;

Deshabilita comparadores analogos Cambio al banco 1 Puerto A como salida Puerto B como salida Cambio al banco 0 Apaga todos los LEDs Limpia columna

;************************** ;Configuracin del Timer 2 ;************************** movlw b'00010110' ; Postscaler /4, prescaler /16, TMR2 ON movwf T2CON bsf STATUS,RP0 ; Cambio al banco 1 movlw .10 ; Carga valor del comparador movwf PR2 ;************************** ;Configuracin de interrupciones ;************************** bsf PIE1,TMR2IE ; Habilita interrupcion TMR2 bcf STATUS,RP0 ; Cambio al banco 0 bsf INTCON,PEIE ; Habilita interrupciones de perifericos bsf INTCON,GIE ; Habilita interrupciones globales movlw movwf b'11101111' ; PORTA ; Precarga fila

;******************* ;Programa principal 3

C:\16f628a\ledmultiplex\ledmultiplex.asm ;******************* CARGA_INICIAL movlw .9 movwf NUMERO CICLO call DECOD_TIEMPO call Delay1Sec decfsz NUMERO,f goto CICLO call DECOD_TIEMPO call Delay1Sec goto CARGA_INICIAL

;******************* ;Subrutinas ;******************* DECOD_TIEMPO movf NUMERO,w sublw .9 btfsc STATUS,Z call NUEVE movf NUMERO,w sublw .8 btfsc STATUS,Z call OCHO movf NUMERO,w sublw .7 btfsc STATUS,Z call SIETE movf NUMERO,w sublw .6 btfsc STATUS,Z call SEIS movf NUMERO,w sublw .5 btfsc STATUS,Z call CINCO movf NUMERO,w sublw .4 btfsc STATUS,Z call CUATRO movf NUMERO,w sublw .3 btfsc STATUS,Z call TRES movf NUMERO,w sublw .2 btfsc STATUS,Z

; Mueve NUMERO a W ; Checa si NUMERO es 9 ; NUMERO = 9? ; Mueve NUMERO a W ; Checa si NUMERO es 8 ; NUMERO = 8? ; Mueve NUMERO a W ; Checa si NUMERO es 7 ; NUMERO = 7? ; Mueve NUMERO a W ; Checa si NUMERO es 6 ; NUMERO = 6? ; Mueve NUMERO a W ; Checa si NUMERO es 5 ; NUMERO = 5? ; Mueve NUMERO a W ; Checa si NUMERO es 4 ; NUMERO = 4? ; Mueve NUMERO a W ; Checa si NUMERO es 3 ; NUMERO = 3? ; Mueve NUMERO a W ; Checa si NUMERO es 2 ; NUMERO = 2? 4

C:\16f628a\ledmultiplex\ledmultiplex.asm call movf sublw btfsc call movf sublw btfsc call return NUEVE movlw movwf movlw movwf movlw movwf movlw movwf movlw movwf return OCHO movlw movwf movlw movwf movlw movwf movlw movwf movlw movwf return SIETE movlw movwf movlw movwf movlw movwf movlw movwf movlw movwf return b'00110110' num1 b'01001001' num2 b'01001001' num3 b'01001001' num4 b'00110110' num5 DOS NUMERO,w .1 STATUS,Z UNO NUMERO,w .0 STATUS,Z CERO

; Mueve NUMERO a W ; Checa si NUMERO es 1 ; NUMERO = 1? ; Mueve NUMERO a W ; Checa si NUMERO es 0 ; NUMERO = 0?

b'00000110' num1 b'01001001' num2 b'01001001' num3 b'00101001' num4 b'00011110' num5

b'00000011' num1 b'00000001' num2 b'01110001' num3 b'00001001' num4 b'00000111' num5

C:\16f628a\ledmultiplex\ledmultiplex.asm

SEIS movlw movwf movlw movwf movlw movwf movlw movwf movlw movwf return CINCO movlw movwf movlw movwf movlw movwf movlw movwf movlw movwf return CUATRO movlw movwf movlw movwf movlw movwf movlw movwf movlw movwf return TRES movlw movwf movlw movwf movlw movwf movlw movwf b'00100001' num1 b'01000001' num2 b'01000101' num3 b'01001011' num4 6 b'00111100' num1 b'01001010' num2 b'01001001' num3 b'01001001' num4 b'00110000' num5

b'00100111' num1 b'01000101' num2 b'01000101' num3 b'01000101' num4 b'00111001' num5

b'00011000' num1 b'00010100' num2 b'00010010' num3 b'01111111' num4 b'00010000' num5

C:\16f628a\ledmultiplex\ledmultiplex.asm movlw movwf return DOS movlw movwf movlw movwf movlw movwf movlw movwf movlw movwf return UNO movlw movwf movlw movwf movlw movwf movlw movwf movlw movwf return CERO movlw movwf movlw movwf movlw movwf movlw movwf movlw movwf return b'00111110' num1 b'01010001' num2 b'01001001' num3 b'01000101' num4 b'00111110' num5 b'00000000' num1 b'01000010' num2 b'01111111' num3 b'01000000' num4 b'00000000' num5 b'01000010' num1 b'01100001' num2 b'01010001' num3 b'01001001' num4 b'01000110' num5 b'00110001' num5

Delay1Sec movlw movwf movlw ;1999996 cycles 0x11 d1 0x5D 7

C:\16f628a\ledmultiplex\ledmultiplex.asm movwf movlw movwf Delay1Sec_0 decfsz goto decfsz goto decfsz goto d2 0x05 d3 d1, f $+2 d2, f $+2 d3, f Delay1Sec_0 ;4 cycles (including call) 0x00

retlw END

You might also like