list p=16f877A ;Comando que indica el Pic usado
include "p16f877A.inc" ;Etiquetas genéricas para el Pic16F877
GUARDA_W EQU 0x20 ;Var para guardar W
GUARDA_STATUS EQU 0x21 ;Var para guardar STATUS
GUARDA_FSR EQU 0x22 ;Var para guardar FSR
GUARDA_PCLATH EQU 0X23 ;VAR PARA GUARDAR PCLATH
GUARDA_OPTION_REG EQU 0X24 ;VAR PARA GUARDAR OPTION_REG
tecla EQU 0X25
indice EQU 0X26
PDel0 EQU 27
PDel1 EQU 28
PDel2 EQU 29
org 0x00 ;Inicio del programa
nop ;Libre (uso del debugger)
goto inicio ;Ir _inicio
org 0x04
goto tt
RETARDO
; Code generated by PDEL ver 1.0 on 05/08/2007 at 11:57:49 p.m.
; Description: Waits 1000000 cycles
;-------------------------------------------------------------
PDelay movlw .14 ; 1 set number of repetitions (C)
movwf PDel0 ; 1 |
PLoop0 movlw .72 ; 1 set number of repetitions (B)
movwf PDel1 ; 1 |
PLoop1 movlw .247 ; 1 set number of repetitions (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) is the time over? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) is the time over? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 cycles delay
PDelL2 clrwdt ; 1 cycle delay
return ; 2+2 Done
tt ;Vector de interrupcion
BTFSS PIR1,5
GOTO _retorno
movwf GUARDA_W ;Guardar W
swapf STATUS,W ;Guardar STATUS
movwf GUARDA_STATUS
swapf FSR,W ;Guardar FSR
movwf GUARDA_FSR
swapf PCLATH,W ;Guardar PCLATH (Pagina de programa)
movwf GUARDA_PCLATH
swapf OPTION_REG,W ;Guardar OPTION_REG (Bancos)
movwf GUARDA_OPTION_REG
goto interrupción ;Ir rutina de interrupcion
inicio
BSF STATUS,RP0 ;IR BANCO 1
BCF STATUS,RP1
CLRF TRISA ;PORTA SALIDA
CLRF TRISB ;PORTB SALIDA
CLRF TRISC ;PORTC SALIDA
CLRF TRISD ;PORTD SALIDA
CLRF TRISE ;PORTE SALIDA
bcf TRISC,6 ;RC6/TX salida, pin de transmisión
bsf TRISC,7 ;RC7/Rx entrada, pin de recepción
movlw d'25' ;2400 baud rate Xtal=4Mhz
movwf SPBRG
bcf TXSTA,BRGH ;Selección de baja velocidad
bcf TXSTA,SYNC ;Modo asíncrono
clrf INTCON ;Deshabilitar interrupciones
clrf PIE1
clrf PIE2
bsf PIE1,RCIE ;Habilita INTR Recepcion Serial
bsf INTCON,PEIE ;Habilita INTR perifericos
bsf INTCON,GIE ;Habilitador general ;de interrupciones
bcf STATUS,RP0 ;Ir banco 0
bcf STATUS,RP1
bsf RCSTA,SPEN ;habilita el puerto serie
bsf STATUS,RP0 ;Ir banco 1
bcf STATUS,RP1
bcf TXSTA,TX9 ;8 bits de datos a transmitir
bsf TXSTA,TXEN ;Activa la transmisión serial TXIF=1
bcf STATUS,RP0 ;Ir banco 0
bcf STATUS,RP1
bcf RCSTA,RX9 ;8 Bits de datos
bsf RCSTA,CREN ;Para Rx Continuo
clrf PORTC ;PORTC=0
bucle goto bucle ;Ir bucle
interrupción ;Rutina de interrupcion
bcf INTCON,PEIE ;Deshabilita INTR perifericos
movf RCREG,W ;Limpia el flag de interrup RCIF =0
movwf tecla
clrf indice
busca_tecla
movfw indice
call _teclas
subwf tecla,W
btfsc STATUS,Z
goto _sigue
incf indice,F
movlw D'6'
subwf indice,W
btfsc STATUS,Z
goto _retorno
goto busca_tecla
_sigue
movf indice,W
call salidas
movfw tecla
movwf TXREG ;Transmitir dato, TXREG = W
_esperatx
btfss PIR1,TXIF ;Espera hasta que transmisión culminó
goto _esperatx ;No, ir _esperatx
_retorno
bsf INTCON,PEIE ;Habilita INTR perifericos
swapf GUARDA_OPTION_REG,W ;Restaurar valor de OPTIO_REG
movwf OPTION_REG
swapf GUARDA_PCLATH,W ;Restaurar valor de PCLATH
movwf PCLATH
swapf GUARDA_FSR,W ;Restaurar valor de FSR
movwf FSR
swapf GUARDA_STATUS,W ;Restaurar valor de STATUS
movwf STATUS
swapf GUARDA_W,1
swapf GUARDA_W,0
retfie
_teclas
addwf PCL,F ;pcl + W >>>> W;El PCL se incrementa con el valor
retlw 'A' ;de W proporcionando;un salto
retlw 'B' ;retorna con valores para PORTC,
retlw 'C'
retlw 'a'
retlw 'b'
retlw 'c'
salidas
addwf PCL,F ;pcl + W >>>> W
goto on_RC0 ;El PCL se incrementa con el valor
goto on_RC1 ;de W proporcionando;un salto
goto on_RC2
goto off_RC0
goto off_RC1
goto off_RC2
on_RC0 bsf PORTC,0
return
on_RC1 bsf PORTC,1
return
on_RC2 bsf PORTC,2
return
off_RC0 bcf PORTC,0
return
off_RC1 bcf PORTC,1
return
off_RC2 bcf PORTC,2
return
END