Transcript
Page 1: (ASM-pic16f84a) Display 7 segmentos anodo comun + 7447 + pic16f84a

D:\Display7anodocomun-7447-PIC.asm

;*******************************************************************;* Nombre : Display7seg-7447-Pulsador.ASM *;* Autor : JeysonMG *;* Notas : - En un display de 7segmentos se muestra la cantidad *;* de veces que es oprimido un pulsador. *;* - Contador de 0 a 9. Reinicia en 0 *;* - Se hace uso de un 7447 para conectar el PIC *;* con el display (ánodo común) *;* *;* - Configuracion Pull-Up *;* *;* O +5v *;* | *;* < *;* R = 1Kohm > *;* < *;* | *;* |----------------o RA4 *;* | *;* | o *;* Pulsador |-| *;* | o *;* | *;* _____ OBS: *;* ___ Bajo esta configuración, cuando es *;* _ pulsado, envia un 0 lógico al PIC *;* *;*******************************************************************

; PIC ---- 7447 -------- > Display; --------------------; RB0 | A; RB1 | B; RB2 | C; RB3 | D

; Pulsador ---> RA4

__config _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC list p=16f84a #include <p16f84a.inc> cblock 0x0C ; A partir de esta direccion Variable_usada_para_retardo0 ; es la memoria RAM del usuario Variable_usada_para_retardo1 endc #define Pulsador PORTA,4 ; Pulsador en RA4 ORG 0x00Inicio bsf STATUS,RP0 ; Se accede a banco de memoria 1

bsf TRISA,.4 ; Configuramos RA4 como entrada clrf TRISB ; RB<7:0> config como salidasbcf STATUS,RP0 ; Se accede a banco de memoria 0clrf PORTB ; PORTB inicia en 0

1

Page 2: (ASM-pic16f84a) Display 7 segmentos anodo comun + 7447 + pic16f84a

D:\Display7anodocomun-7447-PIC.asm

Principal btfsc Pulsador ; ¿Pulsador=0? goto Principal ; Falso. Entonces, vuelvo a preguntar ; Si pulsador=0, hago un retardo de 100ms y vuelvo a preguntar ; con el fin de eliminar los "rebotes" call Retardo_100ms btfsc Pulsador ; ¿Pulsador=0? goto Principal

; Ahora bien, eliminado el rebote, preguntamos si el valor actual ; de PORTB es igual a 9. Si fuese así, reinicio PORTB en 0.; Caso contrario, incremento el contenido de PORTB

movlw .9 ; Cargamos en W el valor de 9subwf PORTB,W ; W = PORTB-W

; Si el resultado de la resta es 0, el bit Z del registro STATUS; se hace igual a 1, asi que preguntamos cual es su estado luego; de la operacion anterior.

btfss STATUS,Z ; ¿Z = 1?goto Incrementar ; Falso. Voy a etiq. "Incrementar"clrf PORTB ; Si Z=1. Reinicio PORTB en 0goto Preguntar ; Y voy directo a "Preguntar"

Incrementar incf PORTB,F ; PORTB=PORTB+1 ; Preguntamos si ya hemos soltado el pulsador. Si no hacemos esto ; PORTB incrementará varias veces, cuando a tu parecer, solo has ; oprimido el pulsador una sola vez....Preguntar btfss Pulsador ; ¿Pulsador=1? goto Preguntar ; Falso. Significa que no he soltado ; el pulsadorentonces vuelvo a preguntar.

; Si pulsador=1 significa que ya solte el pulsador, ; y regreso a Principal

goto Principal; Subrutina de Retardo_100ms:

Retardo_100ms: movlw .110

movwf Variable_usada_para_retardo0 movlw .181

movwf Variable_usada_para_retardo1 goto $+1

decfsz Variable_usada_para_retardo1, 1 goto $-2 decfsz Variable_usada_para_retardo0, 1 goto $-6

goto $+1 goto $+1 goto $+1 return

END ; Directiva para indicar que termina el programa ; Lo que esté despues no forma parte del programa

2