Professional Documents
Culture Documents
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
LED_ON_OFF.asm
LED_RB0_RB1.asm
CONMUTADOR SOFT.asm
CONMUTADOR HARD.asm
CONTA_MINaMAX.asm
INT EXT.asm
INT RB4_7 INTE.asm
INT RB4_7 PULSA.asm
TMR0.asm
TMR1.asm
TMR1ext.asm
TMR2.asm
SLEEP INT EXT.asm
WATCHDOG.asm
CAPTURA.asm
COMPARA.asm
MULTIPLEX INT EXT 00a99.asm
MULTIPLEX INT EXT 000a999.asm
MULTIPLEX CONTA TMR0.asm
ADC.asm
PWM_AD.asm
EEPROM.asm
RS232.asm
I2C.asm
;---------------------------------------------------------------------; 01 - LED_ON_OFF.asm
; Ciclo de encendido (1 s) y apagado (1 s) de LED conectado en RB0
;---------------------------------------------------------------------LIST P=16F877A
; Tipo de microcontrolador
#INCLUDE <P16F877A.INC> ; Archivo de definiciones
__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
ORG
GOTO
0x00
INICIO
PDel0 EQU
PDel1 EQU
PDel2 EQU
0x70
0x71
0x72
STATUS,RP1
STATUS,RP0
; BANCO 1
;
STATUS,RP1
STATUS,RP0
; BANCO 0
;
BSF
CALL
BCF
CALL
GOTO
PORTB,0
DELAY_1s
PORTB,0
DELAY_1s
CICLO
;
;
;
;
;
CICLO
END
RB0=1
Retardo 1s
RB0=0
Retardo 1s
Salto a CICLO
;---------------------------------------------------------------------; 02 - LED_RB0_RB1.asm
; encendido y apagado de un led en RB2 con
; pulsadores en RB0 (encendido) y RB1 (apagado).
;---------------------------------------------------------------------LIST P=16F877A
; Tipo de microcontrolador
#INCLUDE <P16F877A.INC> ; Archivo de definiciones
__CONFIG 0x3F71
;
__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
ORG
0x00
; Inicio del cdigo
GOTO INICIO
;---------------------------------------------------------------------; *************************** MACROS ***************************
;---------------------------------------------------------------------BANCO_0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANCO_1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************
;---------------------------------------------------------------------INICIO
CLRF PORTB
BANCO_1
MOVLW B'11111011' ; RB2 salida, el resto entradas
MOVWF TRISB
;
BANCO_0
TEST_0
BTFSC PORTB,0
GOTO TEST_1
BSF
PORTB,2
; RB0 es 0?
; si RB0 no es 0 salta a leer RB1
; si RB0 es 0 enciende LED
TEST_1
BTFSC
GOTO
BCF
GOTO
END
;
;
;
;
;
PORTB,1
TEST_0
PORTB,2
TEST_0
RB1 es 0?
si RB1 no es 0 salta a leer RB0
si RB1 es 0 apaga LED
salta a leer RB0
FIN DEL PROGRAMA
__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
PDel0 EQU
PDel1 EQU
0x70
0x71
ORG
0x00
; Inicio del cdigo
GOTO INICIO
;---------------------------------------------------------------------; *************************** MACROS ***************************
;---------------------------------------------------------------------BANCO_0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANCO_1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;--------------------------------------------------------------;
RETARDO DE 20 ms
; Generado con PDEL ver SP r 1.0 el 08/11/2009 Hs 10:27:42 p.m.
; Descripcion: Delay 20000 ciclos
;--------------------------------------------------------------RET_20ms movlw
.21
; 1 set numero de repeticion (B)
movwf
PDel0
; 1 |
PLoop1 movlw
.237
; 1 set numero de repeticion (A)
movwf
PDel1
; 1 |
PLoop2 clrwdt
; 1 clear watchdog
decfsz
PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto
PLoop2
; 2 no, loop
decfsz
PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto
PLoop1
; 2 no, loop
PDelL1 goto
PDelL2
; 2 ciclos delay
PDelL2 clrwdt
; 1 ciclo delay
return
; 2+2 Fin.
;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************
;---------------------------------------------------------------------INICIO
CLRF PORTB
; inicializa PORTB
BANCO_1
MOVLW B'11111011' ; PORTB como entrada excepto RB2
MOVWF TRISB
;
BCF
OPTION_REG, NOT_RBPU
BANCO_0
TEST_0
BTFSC
GOTO
CALL
BTFSC
GOTO
SUELTA_0
BTFSS
GOTO
PORTB,0
TEST_1
RET_20ms
PORTB,0
TEST_0
;
;
;
;
;
PORTB,0
SUELTA_0
GOTO CONMUTA
TEST_1
BTFSC PORTB,1
GOTO TEST_0
CALL
BTFSC
GOTO
SUELTA_1
BTFSS
GOTO
RET_20ms
PORTB,1
TEST_1
PORTB,1
SUELTA_1
GOTO
CONMUTA
CALL
CONMUTA
RET_20ms
MOVLW 0x04
XORWF PORTB,F
GOTO TEST_0
END
;
;
;
;
;
;
PDel0 EQU
PDel1 EQU
0x70
0x71
ORG
0x00
; inicio del cdigo
GOTO INICIO
;---------------------------------------------------------------------; *************************** MACROS ***************************
;---------------------------------------------------------------------BANCO_0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANCO_1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;--------------------------------------------------------------;
RETARDO DE 20 ms
; Generado con PDEL ver SP r 1.0 el 08/11/2009 Hs 10:27:42 p.m.
; Descripcion: Delay 20000 ciclos
;--------------------------------------------------------------RET_20ms movlw
.21
; 1 set numero de repeticion (B)
movwf
PDel0
; 1 |
PLoop1 movlw
.237
; 1 set numero de repeticion (A)
movwf
PDel1
; 1 |
PLoop2 clrwdt
; 1 clear watchdog
decfsz
PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto
PLoop2
; 2 no, loop
decfsz
PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto
PLoop1
; 2 no, loop
PDelL1 goto
PDelL2
; 2 ciclos delay
PDelL2 clrwdt
; 1 ciclo delay
return
; 2+2 Fin.
;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************
;---------------------------------------------------------------------INICIO
CLRF PORTB
; inicializa PORTB
BANCO_1
MOVLW B'11111011' ; PORTB como entrada excepto RB2
MOVWF TRISB
;
BANCO_0
TEST_0
BTFSC PORTB,0
GOTO TEST_1
CALL RET_20ms
BTFSC PORTB,0
GOTO TEST_0
SUELTA_0
BTFSS PORTB,0
;
;
;
;
;
GOTO
SUELTA_0
GOTO CONMUTA
TEST_1
BTFSC PORTB,1
GOTO TEST_0
CALL
BTFSC
GOTO
SUELTA_1
BTFSS
GOTO
RET_20ms
PORTB,1
TEST_1
PORTB,1
SUELTA_1
GOTO
CONMUTA
CALL
CONMUTA
ON
OFF
BTFSC
GOTO
GOTO
BSF
GOTO
BCF
GOTO
END
RET_20ms
PORTB,2
OFF
ON
PORTB,2
TEST_0
PORTB,2
TEST_0
;
;
;
;
;
;
;
;
;
;
;----------------------------------------------------------------------------; 05 - CONTA_MINaMAX.asm
; contador binario en
RB7
RB6
RB5
RB4
RB3
RB2
RB1
RB0
decimal
;
0
0
0
0
0
0
0
0
.0
;
0
0
0
0
0
0
0
1
.1
;
0
0
0
0
0
0
1
0
.2
;
0
0
0
0
0
0
1
1
.3
;
0
0
0
0
0
1
0
0
.4
;
0
0
0
0
0
1
0
1
.5
;
0
0
0
0
0
1
1
0
.6
;
0
0
0
0
0
1
1
1
.7
;
;
0
0
0
0
0
0
0
0
.256=.0
; El cambio de estado del contador cada medio segundo.
;----------------------------------------------------------------------------LIST P=16F877A
; Tipo de microcontrolador
#INCLUDE <P16F877A.INC> ; Archivo de definiciones
__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
ORG
GOTO
0x00
INICIO
CBLOCK 0X70
; Reserva de memoria
MAX,MIN,PDel0,PDel1
ENDC
;---------------------------------------------------------------------; *********************** RETARDO DE .5 s **********************
;---------------------------------------------------------------------RET_.5S movlw
.239
; 1 set numero de repeticion (B)
movwf
PDel0
; 1 |
PLoop1 movlw
.232
; 1 set numero de repeticion (A)
movwf
PDel1
; 1 |
PLoop2 clrwdt
; 1 clear watchdog
PDelL1 goto PDelL2
; 2 ciclos delay
PDelL2 goto PDelL3
; 2 ciclos delay
PDelL3 clrwdt
; 1 ciclo delay
decfsz
PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto
PLoop2
; 2 no, loop
decfsz
PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto
PLoop1
; 2 no, loop
PDelL4 goto PDelL5
; 2 ciclos delay
PDelL5 goto PDelL6
; 2 ciclos delay
PDelL6 goto PDelL7
; 2 ciclos delay
PDelL7 clrwdt
; 1 ciclo delay
return
; 2+2 Fin.
;------------------------------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************
;------------------------------------------------------------------------------------------INICIO
CLRF PORTB
; Inicializa puertos
BANKSEL TRISB
MOVLW B'00000000'
MOVWF TRISB
BANKSEL MIN
; PORTB SALIDA
LOOP
MOVLW .0
MOVWF MIN
;
; MIN = 0
MOVLW .255
MOVWF MAX
;
; MAX = 255
MOVF MIN,W
MOVWF PORTB
; MIN a W
; PORTB = MIN
CICLO
CALL
RET_.5S
MOVF
SUBWF
BTFSS
GOTO
GOTO
MIN,W
MAX,W
STATUS,Z
AUX
LOOP
; W=MIN
INCF
GOTO
END
MIN,F
CICLO
; MIN=MIN+1
;
; FIN DEL PROGRAMA
; MAX - MIN = 0?
; NO
; SI
AUX
CBLOCK
0X70
; Reserva de memoria
W_TEMP,STATUS_TEMP,PCLATH_TEMP,PDel0,PDel1,PDel2
ENDC
ORG
0x00
; Inicio del cdigo
GOTO INICIO
ORG
0x04
; inicio de la interrupcin
GOTO ISR
;---------------------------------------------------------------------; *************************** MACROS ***************************
;---------------------------------------------------------------------BANCO_0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANCO_1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;------------------------------------------------------------;
RETARDO DE 1000 ms
; Generado con PDEL ver SP r 1.0 el 24/11/2009 Hs 08:02:58 a.m.
; Descripcion: Delay 1000000 ciclos
;------------------------------------------------------------DEMORA movlw
.14
; 1 set numero de repeticion (C)
movwf
PDel0
; 1 |
PLoop0 movlw
.72
; 1 set numero de repeticion (B)
movwf
PDel1
; 1 |
PLoop1 movlw
.247
; 1 set numero de repeticion (A)
movwf
PDel2
; 1 |
PLoop2 clrwdt
; 1 clear watchdog
decfsz
PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto
PLoop2
; 2 no, loop
decfsz
PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto
PLoop1
; 2 no, loop
decfsz
PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto
PLoop0
; 2 no, loop
PDelL1 goto PDelL2
; 2 ciclos delay
PDelL2 clrwdt
; 1 ciclo delay
return
; 2+2 Fin.
;---------------------------------------------------------------------; ************* RUTINA QUE ATIENDE INTERRUPCIN ***************
;---------------------------------------------------------------------ISR
PUSH
; Guarda contexto del programa principal
MOVWF W_TEMP
; W a W_TEMP
SWAPF STATUS,W
; Intercambia STATUS y guarda en W
CLRF STATUS
; Al Banco 0
MOVWF STATUS_TEMP
; sin modificar banderas. Guarda STATUS
MOVF PCLATH,W
; si se usan pginas 1,2 y/o 3
MOVWF PCLATH_TEMP
; guarda PCLATH en W
CLRF PCLATH
; pgina 0
BTFSS INTCON,INTF
GOTO POP
MOVLW B'10000000'
XORWF PORTB,F
BCF
;
;
;
;
;
SALIR
INTCON,INTF
POP
MOVF PCLATH_TEMP,W
MOVWF PCLATH
SWAPF STATUS_TEMP,W
original
MOVWF STATUS
; W a STATUS
SWAPF W_TEMP,F
; Intercambia W_TEMP
SWAPF W_TEMP,W
; Intercambia W_TEMP y guarda en W
RETFIE
; Retorno de subrutina de interrupcin
;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************
;---------------------------------------------------------------------INICIO
CLRF PORTB
; Inicializa PORTB
BANCO_1
MOVLW B'00111111' ; RB7-RB6 Salidas, RB0 y el resto entradas
MOVWF TRISB
MOVLW B'10010000' ; GIE=1, INTE=1, INTF=0
MOVWF INTCON
;
BCF
OPTION_REG,NOT_RBPU ; PULLUP PORTB !NO!, por estar usando antireb. por hardware
BANCO_0
BCF
PORTB,6
BCF
PORTB,7
ESPERA
MOVLW
XORWF
CALL
GOTO
END
B'01000000'
PORTB,F
DEMORA
ESPERA
ORG
GOTO
ORG
GOTO
0x00
INICIO
0x04
ISR
W_TEMP
EQU 0x70
; Para guardar registro W
STATUS_TEMP EQU 0x71
; Guardar registro STATUS
PCLATH_TEMP EQU 0X72
; Guardar registro PCLATH
;---------------------------------------------------------------------; *************************** MACROS ***************************
;---------------------------------------------------------------------BANCO_0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANCO_1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;---------------------------------------------------------------------; ************** SUBRUTINA QUE ATIENDE INTERRUPCION **************
;---------------------------------------------------------------------ISR
PUSH
; Guardamos contexto del programa principal
MOVWF W_TEMP
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_TEMP
MOVF PCLATH,W
MOVWF PCLATH_TEMP
CLRF PCLATH
BTFSS INTCON,RBIF
GOTO EXIT
BTFSC
GOTO
BSF
GOTO
PORTB,0
ESUNO
PORTB,0
EXIT
;
;
;
;
PORTB,0
MOVF
PORTB,F
BCF
INTCON,RBIF
ESUNO BCF
EXIT
POP
MOVF PCLATH_TEMP,W
MOVWF PCLATH
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
; Fin de la interrupcin
PORTB,0
ESPERA
ORG
GOTO
ORG
GOTO
0x00
INICIO
0x04
ISR
W_TEMP
EQU 0x70
; Para guardar registro W
STATUS_TEMP EQU 0x71
; Guardar registro STATUS
PCLATH_TEMP EQU 0X72
; Guardar registro PCLATH
;---------------------------------------------------------------------; *************************** MACROS ***************************
;---------------------------------------------------------------------BANCO_0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANCO_1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;---------------------------------------------------------------------; ************** SUBRUTINA QUE ATIENDE INTERRUPCION **************
;---------------------------------------------------------------------ISR
PUSH
; Guardamos contexto del programa principal
MOVWF W_TEMP
SWAPF
STATUS,W
CLRF STATUS
MOVWF STATUS_TEMP
MOVF PCLATH,W
MOVWF PCLATH_TEMP
CLRF PCLATH
BTFSS INTCON,RBIF
GOTO EXIT
TEST_4
BTFSC
GOTO
BTFSC
GOTO
GOTO
OFF_4 BCF
GOTO
ON_4 BSF
PORTB,4
TEST_5
PORTA,0
OFF_4
ON_4
PORTA,0
EXIT
PORTA,0
TEST_5
BTFSC
GOTO
BTFSC
GOTO
GOTO
OFF_5 BCF
GOTO
ON_5 BSF
PORTB,5
TEST_6
PORTA,0
OFF_5
ON_5
PORTA,0
EXIT
PORTA,0
TEST_6
BTFSC
GOTO
BTFSC
GOTO
GOTO
OFF_6 BCF
GOTO
ON_6 BSF
PORTB,6
TEST_7
PORTA,0
OFF_6
ON_6
PORTA,0
EXIT
PORTA,0
TEST_7
BTFSC
GOTO
BTFSC
GOTO
GOTO
OFF_7 BCF
GOTO
ON_7 BSF
PORTB,7
EXIT
PORTA,0
OFF_7
ON_7
PORTA,0
EXIT
PORTA,0
MOVF
PORTB,F
BCF
INTCON,RBIF
EXIT
POP
MOVF PCLATH_TEMP,W
MOVWF PCLATH
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
; Fin de la interrupcin
;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************
;---------------------------------------------------------------------INICIO
CLRF PORTA
; Inicializa PORTA
CLRF PORTB
; Inicializa PORTB
BANCO_1
MOVLW B'11111111'
MOVWF TRISB
; configuramos todo el puerto B como entradas
MOVLW B'00000110'
MOVWF ADCON1
; todos los pin1es analogicos son digitales
BCF
TRISA,0
; configuramos pin RA0 como salida
BCF
OPTION_REG,NOT_RBPU
; Pullup de PORTB habilitados
BANCO_0
BSF
BSF
BCF
BCF
ESPERA
GOTO
END
INTCON,GIE
INTCON,RBIE
INTCON,RBIF
PORTA,0
ESPERA
;---------------------------------------------------------------------; 09 - TMR0.asm
; Ciclo de encendido (1s) y apagado (1s)
; de LED conectado en RB0. Se usa TMR0 para retardo de 1s
;---------------------------------------------------------------------LIST P=16F877A
; Tipo de microcontrolador
#INCLUDE <P16F877A.INC> ; Archivo de definiciones
__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
ORG
GOTO
0x00
INICIO
BANCO_0
CICLO
BSF
CALL
BCF
CALL
GOTO
END
PORTB,0
RET_1S
PORTB,0
RET_1S
CICLO
;
;
;
;
;
;
RB0=1
Retardo
RB0=0
Retardo
Salto a
FIN DEL
1s
1s
CICLO
PROGRAMA
;*************************************************************
; 10 TMR1.asm
; Ciclo de encendido (1s) y apagado (1s) de un LED en RB0.
; Se usa TMR1 para retardo de 1s
; Cargamos TMR1 CON 3036d = 0x0BDC y CONT con 2
; Para un retardo de 500 000 us x 2 = 1 segundo
; ************************************************************
LIST P=16F877A
; Tipo de microcontrolador
INCLUDE P16F877A.INC
; Archivo de definiciones
__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
ORG
GOTO
0x00
INICIO
CALL
GOTO
END
RET_1S
TIME
; Retardo 1s
; Salto a TIME
;*************************************************************
; 11 TMR1ext.asm
; Cargamos TMR1 CON 32867d = 0x8000
; retardo de 1 000 000 us = 1s, para parpadeo LED en RB1
; ************************************************************
LIST P=16F877A
; Tipo de microcontrolador
#INCLUDE <P16F877A.INC> ; Archivo de definiciones
__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
ORG
0x00
; inicio del cdigo
GOTO INICIO
;---------------------------------------------------------------------; *************************** MACROS ***************************
;---------------------------------------------------------------------BANCO_0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANCO_1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;------------------------------------------------------------;
RETARDO DE 1 s
;------------------------------------------------------------RET_1S
BCF
T1CON,TMR1ON
; TMR1 OFF para Precarga
MOVLW 0x00
;
MOVWF TMR1L
; TMR1L=0x00
MOVLW 0x80
;
MOVWF TMR1H
; TMR1H=0x80
BSF
T1CON,TMR1ON
; TMR1 ON despus de la Precarga
FLAG
BTFSS PIR1,TMR1IF
; TMR1IF=1? Hay desbordamiento?
GOTO FLAG
; Si no hay, esperar
BCF
PIR1,TMR1IF
; Si hay, borrar bandera
RETURN
;------------------------------------------------------------;
PROGRAMA PRINCIPAL
;------------------------------------------------------------INICIO
CLRF PORTB
; Inicializa PORTB
BANCO_1
BCF
TRISB,1
;
;
;
;
;
;
;
;
BANCO_0
MOVLW
B'00001110'
;
|||||||+------||||||+-------|||||+--------||||+---------|||+----------||+-----------|+------------+-------------MOVWF
T1CON
BSF
CALL
BCF
CALL
GOTO
END
RB1=1
Retardo 1s
RB1=0
Retardo 1s
Salto a CICLO
FIN DE PROGRAMA
CICLO
PORTB,1
RET_1S
PORTB,1
RET_1S
CICLO
;
;
;
;
;
;
;*********************************************************************
; 12 TMR2.asm
; Cargamos TMR2 con el valor lmite PR2=199
; PRESCALER=4 y POSTSCALER=10
; Para un retardo de 4x10x(199+1)=8000 us y por CONTA(125) = 1 segundo
; ********************************************************************
LIST P=16F877A
; Tipo de microcontrolador
#INCLUDE P16F877A.INC
; Archivo de definiciones
__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
ORG
GOTO
0x00
INICIO
END
CBLOCK 0X70
; Reserva de memoria
W_TEMP,STATUS_TEMP,PCLATH_TEMP,PDel0,PDel1,PDel2,CONTA
ENDC
ORG
0x00
; inicio del programa principal
GOTO INICIO
ORG
0x04
; inicio de la interrupcin
GOTO ISR
;---------------------------------------------------------------------; *************************** MACROS ***************************
;---------------------------------------------------------------------BANCO_0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANCO_1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;---------------------------------------------------------------------; *********************** RETARDO DE 1 s ***********************
;---------------------------------------------------------------------RET_1s 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
;---------------------------------------------------------------------; ************* RUTINA QUE ATIENDE INTERRUPCIN ***************
;---------------------------------------------------------------------ISR
PUSH
; Guarda contexto del programa principal
MOVWF W_TEMP
; W a W_TEMP
SWAPF STATUS,W
; Intercambia STATUS y guarda en W
CLRF STATUS
; Al Banco 0
MOVWF STATUS_TEMP
; sin modificar banderas. Guarda STATUS
MOVF PCLATH,W
; si se usan pginas 1,2 y/o 3
MOVWF PCLATH_TEMP
; guarda PCLATH en W
CLRF PCLATH
; pgina 0
BTFSS INTCON,INTF
; INTF=1?. Si es la interrupcin INT, lee estado RB1
GOTO POP
; NO, restauramos contexto
SALIR
BCF
POP
INTCON,INTF
;
;
;
;
;
MOVF PCLATH_TEMP,W
MOVWF PCLATH
SWAPF STATUS_TEMP,W
al Banco
original
MOVWF STATUS
; W a STATUS
SWAPF W_TEMP,F
; Intercambia W_TEMP
SWAPF W_TEMP,W
; Intercambia W_TEMP y guarda en W
RETFIE
; Retorno de subrutina de interrupcin;--------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************
;---------------------------------------------------------------------INICIO
CLRF PORTB
; Inicializa PORTB
BANCO_1
MOVLW B'01111111'
; RB7 Salida, el resto Entradas
MOVWF TRISB
MOVLW B'10010000'
; GIE=1, INTE=1, INTF=0
MOVWF INTCON
;
BCF
OPTION_REG,NOT_RBPU ; PULLUP PORTB !NO!, por estar usando antireb. por hardware
BANCO_0
SLEEP
CICLO
MOVLW .10
MOVWF CONTA
BCF
PORTB,7
; RB7=0
CALL RET_1s
LOOP
MOVLW B'10000000'
; Mascara en 1 para RB7 de PORTB
XORWF PORTB,F
; Complementa bit 1
CALL RET_1s
DECFSZ CONTA,F
;
GOTO LOOP
; si CONTA no lleg a cero, se vuelve a conmutar RB0
SLEEP
; si CONTA lleg a cero, estado de bajo consumo
GOTO CICLO
END
; FIN DEL PROGRAMA
;************************************************************************************
; 14 - WATCHDOG.asm. Al pulsar RA0, se enciende y apaga LED en RB1 5 veces, cada 1 s
; luego se desborda el WDT y se resetea volviendo al estado inicial
; ***********************************************************************************
LIST P=16F877A
; Tipo de microcontrolador
#INCLUDE <P16F877A.INC> ; Archivo de definiciones
__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_ON & _XT_OSC
ORG
GOTO
0x00
INICIO
BANCO_0
PULSA
LOOP
CLRWDT
BTFSC PORTA,4
GOTO PULSA
DECFSZ CONTA,F
GOTO CICLO
GOTO
BUCLE
BSF
CALL
BCF
CALL
GOTO
PORTB,1
RET_1S
PORTB,1
RET_1S
LOOP
; RB1=1
;
; RB1=0
;
;
GOTO
END
BUCLE
CICLO
BUCLE
;*******************************************************************
; 15 - CAPTURA.asm. TMR1 COMO CONTADOR SINCRONO. SE CAPTURA EL VALOR
; DE TMR1 MEDIANTE CCP1 EN EL FLANCO DE SUBIDA CADA 10 SEGUNDOS.
; Se despliega el valor de conteo de TMR1 por el pin T1CKI, en
; los puertos D y B.
;*******************************************************************
LIST P=16F877A
Tipo de microcontrolador
INCLUDE P16F877A.INC
; Archivo de definiciones
__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
ORG
GOTO
0x00
INICIO
; RC6 SALIDA
BANCO_0
MOVLW B'00000011'
MOVWF T1CON
MOVLW B'00000101'
MOVWF CCP1CON
CARGADO
CALL RET_10S
BSF
PORTC,6
NOP
NOP
NOP
BCF
PORTC,6
MOVF CCPR1H,W
MOVWF PORTD
MOVF CCPR1L,W
MOVWF PORTB
BCF
CLRF
CLRF
BSF
GOTO
END
T1CON,TMR1ON
TMR1H
TMR1L
T1CON,TMR1ON
CARGADO
;****************************************************************************
; 16 COMPARA.asm. TMR1 COMO TEMPORIZADOR. COMPARA CADA 0.5 s y
; CONMUTA LED EN RB0 cada segundo.
;****************************************************************************
LIST P=16F877A
; Tipo de microcontrolador
INCLUDE P16F877A.INC
; Archivo de definiciones
__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
ORG
0x00
; inicio del cdigo
GOTO INICIO
CONTA EQU 0x70
; reserva de memoria RAM
;---------------------------------------------------------------------; *************************** MACROS ***************************
;---------------------------------------------------------------------BANCO_0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANCO_1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************
;---------------------------------------------------------------------INICIO
CLRF PORTB
; Limpia PORTB
BANCO_1
MOVLW B'11111110'
MOVWF TRISB
BANCO_0
MOVLW 0x24
MOVWF CCPR1L
MOVLW 0xF4
MOVWF CCPR1H
BCF
PIR1,CCP1IF
MOVLW B'00001011'
MOVWF CCP1CON
MOVLW
;
;
;
;
;
;
;
;
MOVWF
BSF
;
;
;
;
B'00110000'
;
|||||||+------||||||+-------|||||+--------||||+---------|||+----------||+-----------|+------------+-------------T1CON
T1CON,TMR1ON
Se borra bandera
CCP1, modo comparacion, PIN CCP1 no afectado, cuando
TMR1 alcanza el valor de CCPR1H-CCPR1L. CCP1IF se pone a 1
CCP1M3:CCP1M0 = 1011. Se resetea TMR1
configuracin de TMR1 como temporizador
TMR1ON OFF, se iniciar mas tarde
TMR1CS=0 temporizador
/T1SYNC=X indistinto
T1OSCEN=0 oscilador de TMR1 deshabilitado
T1CKPS0=1 para seleccionar prescaler en 8
T1CKPS1=1 para seleccionar prescaler en 8
no usado
no usado
CICLO
MOVLW .2
MOVWF CONTA
; CONTA = 2
LOOP
BTFSS PIR1,CCP1IF
GOTO LOOP
BCF
PIR1,CCP1IF
DECFSZ CONTA,F
GOTO LOOP
;
;
;
;
Se igualaron contenidos?
NO, Salto a LOOP
Se borra bandera
CONTA = CONTA - 1
BTFSC PORTB,0
ON
OFF
GOTO
GOTO
BSF
GOTO
BCF
GOTO
END
OFF
ON
PORTB,0
CICLO
PORTB,0
CICLO
W_TEMP
EQU 0x70
STATUS_TEMP EQU 0x71
PCLATH_TEMP EQU 0x72
CBLOCK 0X73
UNI, DEC, PDel0
ENDC
; Reserva de memoria
`
ORG
0x00
; Inicio del cdigo
GOTO INICIO
ORG
0X04
; Inicio de la interrupcin
GOTO ISR
;---------------------------------------------------------------------; *************************** MACROS ***************************
;---------------------------------------------------------------------BANCO_0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANCO_1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;------------------------------------------------------------------------------------------; ******************** RUTINA TABLADATOS **********************
;------------------------------------------------------------------------------------------TABLADATOS
ADDWF PCL,F
RETLW B'01111110' ; 0 "g-f-e-d-c-b-a-INT"
RETLW B'00001100' ; 1 RB"7-6-5-4-3-2-1-0"
RETLW B'10110110' ; 2
RETLW B'10011110' ; 3
RETLW B'11001100' ; 4
RETLW B'11011010' ; 5
RETLW B'11111010' ; 6
RETLW B'00001110' ; 7
RETLW B'11111110' ; 8
RETLW B'11011110' ; 9
;------------------------------------------------------------------------------------------; ********** RUTINA DE RETARDO DE 100 us=0,1 ms *************
;------------------------------------------------------------------------------------------RETARDO movlw
.23
; 1 set numero de repeticion
movwf
PDel0
; 1 |
PLoop0 clrwdt
; 1 clear watchdog
decfsz
PDel0, 1 ; 1 + (1) es el tiempo 0 ?
goto
PLoop0
; 2 no, loop
PDelL1 goto
PDelL2
; 2 ciclos delay
PDelL2 clrwdt
; 1 ciclo delay
return
; 2+2 Fin.
;------------------------------------------------------------------------------------------; ************* RUTINA QUE ATIENDE INTERRUPCION ***************
;------------------------------------------------------------------------------------------ISR
PUSH
; salvamos contexto del programa principal
MOVWF
SWAPF
CLRF
MOVWF
MOVF
MOVWF
CLRF
W_TEMP
STATUS,W
STATUS
STATUS_TEMP
PCLATH, W
PCLATH_TEMP
PCLATH
;
;
;
;
;
;
;
Copy
Swap
bank
Save
Only
Save
Page
W to TEMP register
status to be saved into W
0, regardless of current bank, Clears IRP,RP1,RP0
status to bank zero STATUS_TEMP register
required if using pages 1, 2 and/or 3
PCLATH into W
zero, regardless of current page
BTFSS
GOTO
INCF
MOVLW
ADDWF
BTFSS
GOTO
GOTO
DECENAS
CLRF
INCF
MOVLW
ADDWF
BTFSS
GOTO
CLRF
EXIT
BCF
POP
MOVF
MOVWF
SWAPF
INTCON,INTF
POP
UNI,F
D'246'
UNI,W
STATUS,C
EXIT
DECENAS
;
;
;
;
;
;
INTF=1?
NO, restauramos contexto
Incrementa unidades
UNI
DEC,F
D'246'
DEC,W
STATUS,C
EXIT
DEC
;
;
;
;
;
;
;
OPTION_REG,INTEDG
BCF
MOVLW
MOVWF
MOVLW
MOVWF
STATUS,RP0
D'0'
UNI
D'0'
DEC
BCF
BSF
BSF
; Banco 0
; Unid. y decenas en cero
MULT
MOVF
CALL
MOVWF
BSF
CALL
BCF
NOP
NOP
NOP
NOP
UNI,W
TABLADATOS
PORTB
PORTA,0
RETARDO
PORTA,0
;
;
;
;
;
;
;
UNI a W
MOVF
CALL
MOVWF
BSF
CALL
BCF
NOP
NOP
NOP
NOP
GOTO
END
DEC,W
TABLADATOS
PORTB
PORTA,1
RETARDO
PORTA,1
;
;
;
;
;
;
;
DEC a W
Despliega informacin
RA0=1 unid. encendido
RA0=0 unidades apagado
Retardo de apagado
Despliega informacin
RA1=1 dec. encendido
RA1=0 decenas apagado
Retardo de apagado
MULT
; FIN DEL PROGRAMA
W_TEMP
EQU 0x70
STATUS_TEMP EQU 0x71
PCLATH_TEMP EQU 0x72
CBLOCK 0X73
UNI, DEC, CEN, PDel0
ENDC
; Reserva de memoria
ORG
0x00
; Inicio del cdigo
GOTO INICIO
ORG
0X04
; Inicio de la interrupcin
GOTO ISR
;---------------------------------------------------------------------; *************************** MACROS ***************************
;---------------------------------------------------------------------BANCO_0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANCO_1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;------------------------------------------------------------------------------------------; ******************** RUTINA TABLADATOS **********************
;------------------------------------------------------------------------------------------TABLADATOS
ADDWF PCL,F
RETLW B'01111110' ; 0 "g-f-e-d-c-b-a-INT"
RETLW B'00001100' ; 1 RB"7-6-5-4-3-2-1-0"
RETLW B'10110110' ; 2
RETLW B'10011110' ; 3
RETLW B'11001100' ; 4
RETLW B'11011010' ; 5
RETLW B'11111010' ; 6
RETLW B'00001110' ; 7
RETLW B'11111110' ; 8
RETLW B'11011110' ; 9
;------------------------------------------------------------------------------------------; ********** RUTINA DE RETARDO DE 100 us=0,1 ms *************
;------------------------------------------------------------------------------------------RETARDO movlw
.23
; 1 set numero de repeticion
movwf
PDel0
; 1 |
PLoop0 clrwdt
; 1 clear watchdog
decfsz
PDel0, 1 ; 1 + (1) es el tiempo 0 ?
goto
PLoop0
; 2 no, loop
PDelL1 goto PDelL2
; 2 ciclos delay
PDelL2 clrwdt
; 1 ciclo delay
return
; 2+2 Fin.
;------------------------------------------------------------------------------------------; ************* RUTINA QUE ATIENDE INTERRUPCION ***************
;------------------------------------------------------------------------------------------ISR
PUSH
; salvamos contexto del programa principal
MOVWF
SWAPF
CLRF
MOVWF
MOVF
MOVWF
CLRF
BTFSS
GOTO
UNIDADES
INCF
MOVLW
ADDWF
BTFSC
GOTO
GOTO
DECENAS
CLRF
INCF
MOVLW
ADDWF
BTFSC
GOTO
GOTO
CENTENAS
CLRF
INCF
MOVLW
ADDWF
BTFSC
CLRF
GOTO
EXIT
BCF
POP
MOVF
MOVWF
SWAPF
W_TEMP
STATUS,W
STATUS
STATUS_TEMP
PCLATH, W
PCLATH_TEMP
PCLATH
;
;
;
;
;
;
;
Copy
Swap
bank
Save
Only
Save
Page
W to TEMP register
status to be saved into W
0, regardless of current bank, Clears IRP,RP1,RP0
status to bank zero STATUS_TEMP register
required if using pages 1, 2 and/or 3
PCLATH into W
zero, regardless of current page
INTCON,INTF ; INTF=1?
POP
; NO, restauramos contexto
UNI,F
D'246'
UNI,W
STATUS,C
DECENAS
EXIT
; Incrementa unidades
;
;
; Salta si carry=0. No hay acarreo (no se lleg a 256)
; Borra registro decenas
;
UNI
DEC,F
D'246'
DEC,W
STATUS,C
CENTENAS
EXIT
;
;
;
;
;
;
;
DEC
CEN,F
D'246'
CEN,W
STATUS,C
CEN
EXIT
;
;
;
;
;
;
;
RETFIE
; Retorno a programa principal
;------------------------------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************
;------------------------------------------------------------------------------------------INICIO
CLRF PORTA
; Inicializa puertos
CLRF PORTB
;
BSF
STATUS,RP0 ; Banco 1
MOVLW B'00000001' ; RB1-7 sal. RB0/INT ent.
MOVWF TRISB
;
MOVLW B'00000110' ; todos los pines analogicos son digitales
MOVWF ADCON1
;
MOVLW B'11111000' ; RA0,RA1 y RA2 salidas, el resto entradas
MOVWF TRISA
;
BSF
OPTION_REG,INTEDG
BCF
MOVLW
MOVWF
MOVLW
MOVWF
MOVLW
MOVWF
STATUS,RP0
D'0'
UNI
D'0'
DEC
D'0'
CEN
; Banco 0
; Unidades, decenas y centenas en cero
BCF
BSF
BSF
MOVF
CALL
MOVWF
BSF
CALL
BCF
NOP
NOP
NOP
NOP
UNI,W
TABLADATOS
PORTB
PORTA,0
RETARDO
PORTA,0
;
;
;
;
;
;
;
UNI a W
MOVF
CALL
MOVWF
BSF
CALL
BCF
NOP
NOP
NOP
NOP
DEC,W
TABLADATOS
PORTB
PORTA,1
RETARDO
PORTA,1
;
;
;
;
;
;
;
DEC a W
MOVF
CALL
MOVWF
BSF
CALL
BCF
NOP
NOP
NOP
NOP
GOTO
END
CEN,W
TABLADATOS
PORTB
PORTA,2
RETARDO
PORTA,2
;
;
;
;
;
;
;
CEN a W
Recupera cdigo decimal
Despliega informacin en display centenas
RA2=1 centenas encendido
MULT
Despliega informacin
RA0=1 unid. encendido
RA0=0 unidades apagado
Retardo de apagado
Despliega informacin
RA1=1 dec. encendido
RA1=0 decenas apagado
Retardo de apagado
MULT
; FIN DEL PROGRAMA
CBLOCK 0X70
UNI, DEC, CEN, PDel0
ENDC
; Reserva de memoria
ORG
0x00
; Inicio del cdigo
GOTO INICIO
;---------------------------------------------------------------------; *************************** MACROS ***************************
;---------------------------------------------------------------------BANCO_0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANCO_1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;------------------------------------------------------------------------------------------; ******************** RUTINA TABLADATOS **********************
;------------------------------------------------------------------------------------------TABLADATOS
ADDWF PCL,F
RETLW B'01111110' ; 0 "g-f-e-d-c-b-a-INT"
RETLW B'00001100' ; 1 RB"7-6-5-4-3-2-1-0"
RETLW B'10110110' ; 2
RETLW B'10011110' ; 3
RETLW B'11001100' ; 4
RETLW B'11011010' ; 5
RETLW B'11111010' ; 6
RETLW B'00001110' ; 7
RETLW B'11111110' ; 8
RETLW B'11011110' ; 9
;------------------------------------------------------------------------------------------; ********** RUTINA DE RETARDO DE 100 us=0,1 ms *************
;------------------------------------------------------------------------------------------RETARDO movlw
.23
; 1 set numero de repeticion
movwf
PDel0
; 1
PLoop0 clrwdt
; 1 clear watchdog
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ?
goto
PLoop0
; 2 no, loop
PDelL1 goto
PDelL2
; 2 ciclos delay
PDelL2 clrwdt
; 1 ciclo delay
return
; 2+2 Fin.
;------------------------------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************
;------------------------------------------------------------------------------------------INICIO
CLRF PORTA
; Inicializa puertos
CLRF PORTB
;
BANCO_1
MOVLW B'00000001' ; RB1-7 sal. RB0/INT ent.
MOVWF TRISB
;
TMR0
;
; Unidades en cero
; Decenas en cero
; TMR0 en cero
MULT
MOVF TMR0,W
MOVWF UNI
; Leemos TMR0
; UNI=TMR0
MOVF
CALL
MOVWF
BSF
CALL
BCF
NOP
NOP
NOP
NOP
UNI,W
TABLADATOS
PORTB
PORTA,0
RETARDO
PORTA,0
;
;
;
;
;
;
;
UNI a W
Recupera cdigo decimal
Despliega informacin en display unidades
RA0=1 unidades encendido
MOVF
CALL
MOVWF
BSF
CALL
BCF
NOP
NOP
NOP
NOP
DEC,W
TABLADATOS
PORTB
PORTA,1
RETARDO
PORTA,1
;
;
;
;
;
;
;
DEC a W
Recupera cdigo decimal
Despliega informacin en display decenas
RA1=1 decenas encendido
MOVF
CALL
MOVWF
BSF
CALL
BCF
NOP
NOP
NOP
NOP
UNIDADES
INCF
MOVLW
ADDWF
BTFSS
GOTO
DECENAS
CLRF
INCF
MOVLW
ADDWF
CEN,W
TABLADATOS
PORTB
PORTA,2
RETARDO
PORTA,2
;
;
;
;
;
;
;
CEN a W
Recupera cdigo decimal
Despliega informacin en display centenas
RA2=1 centenas encendido
UNI,F
D'245'
UNI,W
STATUS,C
MULT
; Incrementa unidades
;
;
; Salta si carry=1 (si hay acarreo)
;
TMR0
DEC,F
D'246'
DEC,W
BTFSS
GOTO
CLRF
CENTENAS
INCF
MOVLW
ADDWF
BTFSS
GOTO
CLRF
GOTO
END
STATUS,C
MULT
DEC
CEN,F
D'246'
CEN,W
STATUS,C
MULT
CEN
MULT
; Incrementa centenas
;
;
; Salta si carry=1 (si hay acarreo)
; Borra registro centenas
;
; FIN DEL PROGRAMA
;---------------------------------------------------------------------; 20 - ADC.asm
; Conversin Analgica /Digital de voltaje de Canal 0 (Potencimetro
; en RA0/AN0). El resultado se muestra en PORTB (parte baja)
; y PORTC (parte alta)
;---------------------------------------------------------------------LIST P=16F877A
; Tipo de microcontrolador
#INCLUDE <P16F877A.INC> ; Archivo de definiciones
__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
PDel0 EQU
0x70
ORG
0X00
; Inicio del cdigo
GOTO INICIO
;---------------------------------------------------------------------; *************************** MACROS ***************************
;---------------------------------------------------------------------BANCO_0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANCO_1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;---------------------------------------------------------------------; ******************** RUTINA RETARDO 20us ********************
;---------------------------------------------------------------------Delay20us
movlw
.3
; 1 set numero de repeticion
movwf
PDel0
; 1
PLoop0 clrwdt
; 1 clear watchdog
decfsz PDel0, 1
; 1 + (1) es el tiempo 0 ?
goto
PLoop0
; 2 no, loop
PDelL1 goto
PDelL2
; 2 ciclos delay
PDelL2 clrwdt
; 1 ciclo delay
return
; 2+2 Fin.
;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************
;---------------------------------------------------------------------INICIO
; Se inicializa Puertos
CLRF PORTA
; Inicializa PORTA
CLRF PORTB
; Inicializa PORTB
CLRF PORTC
; Inicializa PORTC
; Se configura Puertos
BANCO_1
MOVLW B'00000000'
MOVWF TRISB
MOVLW B'11111100'
MOVWF TRISC
MOVLW B'11111111'
MOVWF TRISA
;
; PORTB salida
;
; PORTC RC0-RC1 salidas
;
; PORTA entrada
; Se inicializa Mdulo de
BANCO_0
MOVLW B'11000001' ;
MOVWF ADCON0
;
;
BANCO_1
MOVLW B'10001110' ;
MOVWF ADCON1
;
Conversin A/D
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/_DONE - ADON
ADCS1-ADCS0:11 (oscilador interno RC). ADON:1 (A/D habilitado)
CHS2 a CHS0:000 (canal 0: AN0)
ADFM ADCS2 - - PCFG3 PCFG2 PCFG1 PCFG0
ADFM:1 (Just. derecha). PCFG3 a PCFG0:1110 (AN0 analgica)
BTFSC ADCON0,GO
BTFSS PIR1,ADIF
GOTO WAIT
MOVF ADRESH,W
MOVWF PORTC
;
; ADRESH a PORTC
BANCO_1
MOVF ADRESL,W
BANCO_0
MOVWF PORTB
BCF
PIR1,ADIF
GOTO MAIN
END
;
; ADRESL a PORTB
;
;
; FIN PROGRAMA
;---------------------------------------------------------------------; 21 - PWM_AD.asm
; Conversin Analgica /Digital de voltaje de Canal 0 (Potencimetro
; en RA0/AN0). El resultado se muestra en PORTB (parte baja)
; y PORTD (parte alta). Control con GO/-DONE
;---------------------------------------------------------------------LIST P=16F877A
; Tipo de microcontrolador
INCLUDE P16F877A.INC
; Archivo de definiciones
__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
PDel0 EQU
0x70
ORG
0X00
; Inicio del cdigo
GOTO INICIO
;---------------------------------------------------------------------; *************************** MACROS ***************************
;---------------------------------------------------------------------BANCO_0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANCO_1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;---------------------------------------------------------------------; ******************** RUTINA RETARDO 20us ********************
;---------------------------------------------------------------------RET_20us
Movlw .3
; 1 set numero de repeticion
movwf
PDel0
; 1
PLoop0 clrwdt
; 1 clear watchdog
decfsz PDel0, 1
; 1 + (1) es el tiempo 0 ?
goto
PLoop0
; 2 no, loop
PDelL1 goto
PDelL2
; 2 ciclos delay
PDelL2 clrwdt
; 1 ciclo delay
return
; 2+2 Fin.
;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************
;---------------------------------------------------------------------INICIO
BANCO_0
CLRF PORTA
; Inicializa PORTA
CLRF PORTB
; Inicializa PORTB
CLRF PORTC
; Inicializa PORTC
CLRF PORTD
; Inicializa PORTD
BANCO_1
MOVLW B'11111111'
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB
MOVLW B'11111011'
MOVWF TRISC
MOVLW B'00111111'
MOVWF TRISD
;
;
;
;
;
;
;
;
; Se inicializa Mdulo de
BANCO_0
MOVLW B'11000001' ;
MOVWF ADCON0
;
;
BANCO_1
MOVLW B'00001110' ;
MOVWF ADCON1
;
PORTA entrada
PORTB salida
RC2 SALIDA
PORTD RD7-RD6 salidas
Conversin A/D
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/_DONE - ADON
ADCS1-ADCS0:11 (oscilador interno RC). ADON:1 (A/D habilitado)
CHS2 a CHS0:000 (canal 0: AN0)
ADFM ADCS2 - - PCFG3 PCFG2 PCFG1 PCFG0
ADFM:0 (Just. izquierda). PCFG3 a PCFG0:1110 (AN0 analgica)
BANCO_1
MOVLW .249
MOVWF PR2
; PWM Frec.=1000 Hz
; PWM Period=0,001s - Tosc=0,25x10-6 - TMR2 Prescale=4
; PR2=.249
BANCO_0
; PARA CAMBIAR CICLO
MOVLW B'01111101' ; CALCULADO PARA 1000 Hz 0111110100b (500d) A 50%
MOVWF CCPR1L
; Configurados los bits 9-2
BCF
BCF
CCP1CON,CCP1X
CCP1CON,CCP1Y
; Configurado el bit 5
; Configurado el bit 4
BCF
BSF
BSF
T2CON,T2CKPS1
T2CON,T2CKPS0
T2CON,TMR2ON
; TMR2 Prescaler=4
; T2CKPS1:0 = 01
; TMR2 Encendido
BSF
BSF
BSF
BSF
CCP1CON,3
CCP1CON,2
CCP1CON,1
CCP1CON,0
; Se configura PWM
; CCP1CON<3:0>=11XX
;
;
MOVF ADRESH,W
MOVWF PORTB
MOVWF CCPR1L
;
; ADRESH a PORTB
; Se cambia valor de PWM Duty cycle
BANCO_1
MOVF ADRESL,W
BANCO_0
MOVWF PORTD
GOTO MAIN
END
;
; ADRESL a PORTD
;
; FIN PROGRAMA
;---------------------------------------------------------------------; 22 - EEPROM.asm
; Se escribe un dato en la posicin 0x00 de la EEPROM, luego se lee
; y se lo despliega en PORTB.
;---------------------------------------------------------------------LIST P=16F877A
; Tipo de microcontrolador
INCLUDE P16F877A.INC
; Archivo de definiciones
__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
ADDR_E
DATA_E
EQU 0x70
EQU 0x71
ORG
0x00
; Inicio del cdigo
GOTO INICIO
;---------------------------------------------------------------------; ******************** ESCRITURA EEPROM *********************
;---------------------------------------------------------------------ESCRIBE_E
BANKSEL EEDATA
MOVF ADDR_E,W
; direccin donde escribir
MOVWF EEADR
MOVF DATA_E,W
; dato a escribir
MOVWF EEDATA
BANKSEL EECON1
BCF
EECON1, EEPGD
; se selecciona memoria EEPROM
BSF
EECON1, WREN
; se habilita escritura
BCF
INTCON, GIE
BANKSEL EECON2
MOVLW 0x55
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BANKSEL EECON1
BSF
EECON1,WR
ESPERA
BTFSC EECON1, WR
GOTO ESPERA
BCF
BSF
EECON1, WREN
INTCON, GIE
; se deshabilita interrupciones
; RUTINA OBLIGATORIA
;
;
;
; se inicia escritura
; esperar a que termine
; ciclo de escritura
; deshabilita escritura
; Enable INTs.
BANCO_0
RETURN
;---------------------------------------------------------------------; ******************** LECTURA EEPROM *********************
;---------------------------------------------------------------------LEE_E
BANKSEL EEADR
MOVF ADDR_E,W
; direccin donde escribir
MOVWF EEADR
BANKSEL EECON1
BCF
EECON1, EEPGD
BSF
EECON1, RD
BANKSEL EEDATA
MOVF EEDATA,W
RETURN
BANKSEL TRISB
CLRF TRISB
MOVLW 0x00
MOVWF ADDR_E
MOVLW B'10101011'
MOVWF DATA_E
; PORTB salidas
; DIRECCION
;
; DATO
;
BANKSEL EEDATA
CALL ESCRIBE_E
CLRF EEDATA
CALL LEE_E
; escribe en EEPROM
; Limpia EEDATA
; lee de EEPROM
BANKSEL PORTB
CICLO
MOVWF PORTB
GOTO CICLO
END
;
;
; FIN PROGRAMA PRINCIPAL
;-----------------------------------------------------------------------------; 23 RS232.asm
; Usando la interrupcin del USART, desde el hyperterminal se presiona la tecla
; A RC0 = 1, a RC0 = 0, B RC1 = 1, b RC1 = 0, C RC2 = 1,c RC2 = 0
;-----------------------------------------------------------------------------LIST P=16F877A
; Tipo de microcontrolador
#INCLUDE <P16F877A.INC> ; Archivo de definiciones
__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
W_TEMP
EQU 0x70
STATUS_TEMP EQU 0x71
PCLATH_TEMP EQU
0x72
TECLA
INDICE
EQU 0x73
EQU 0x74
ORG
0x00
; Inicio del cdigo
GOTO INICIO
ORG
0X04
; Inicio de la interrupcin
GOTO ISR
;-------------------------------------------------------------------------------; *************************** MACROS ***************************
;-------------------------------------------------------------------------------BANCO_0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANCO_1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;-------------------------------------------------------------------------------; El PCL se incrementa con el valor de W proporcionando un salto
;-------------------------------------------------------------------------------TECLAS
ADDWF
PCL,F
; pcl + W > W
RETLW
A'A'
; retorna con valores para PORTC
RETLW
A'B'
RETLW
A'C'
RETLW
A'a'
RETLW
A'b'
RETLW
A'c'
;-------------------------------------------------------------------------------; El PCL se incrementa con el valor de W proporcionando un salto
;-------------------------------------------------------------------------------SALIDAS
ADDWF PCL,F
; pcl + W > W
GOTO ON_RC0
; RC0=1
GOTO ON_RC1
; RC1=1
GOTO ON_RC2
; RC2=1
GOTO OFF_RC0
; RC0=0
GOTO OFF_RC1
; RC1=0
GOTO OFF_RC2
; RC2=0
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
;------------------------------------------------------------------------------------------; ************* RUTINA QUE ATIENDE INTERRUPCION ***************
;------------------------------------------------------------------------------------------ISR
PUSH
; Guardamos contexto del programa principal
MOVWF W_TEMP
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_TEMP
MOVF PCLATH,W
MOVWF PCLATH_TEMP
CLRF PCLATH
BTFSS PIR1,RCIF
GOTO POP
; RCIF=1?
; si no lo es, restauramos contexto y luego RETFIE (GIE=1)
MOVF RCREG,W
;
MOVWF TECLA
; tecla=RCREG
CLRF INDICE
; indice=0
_BUSCA_TECLA
MOVF INDICE,W
; W=indice
CALL TECLAS
; llama en orden, las teclas 'A' 'B' 'C' 'a' 'b' 'c'
SUBWF TECLA,W
; compara tecla con los valores de la tabla TECLAS
BTFSC STATUS,Z
;
GOTO _SIGUE
; coincide
INCF INDICE,F
; no coincide, incrementa indice
MOVLW D'6'
;
SUBWF INDICE,W
; compara indice con el numero 6 (total de teclas posibles)
BTFSC STATUS,Z
;
GOTO POP
; hace las 6 comparaciones y sale de la subrutina
GOTO _BUSCA_TECLA
; ndice no es igual a 6 y sigue buscando en la tabla
_SIGUE
MOVF INDICE,W
;
CALL SALIDAS
; toma la accin correspondiente a la tecla pulsada
MOVF TECLA,W
;
CALL ENVIA
; enva a la PC la tecla pulsada
POP
; Restauramos contexto del programa principal
MOVF PCLATH_TEMP,W
MOVWF PCLATH
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
;*************************************************
;SUBRUTINA PARA ENVIAR UN DATO POR EL PUERTO SERIE
;*************************************************
ENVIA
MOVWF TXREG
BANCO_1
BTFSS TXSTA, TRMT
GOTO $-1
RETURN
;-------------------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************
;-------------------------------------------------------------------------------INICIO
BANCO_1
MOVLW B'11111000'
MOVWF TRISC
MOVLW d'25'
MOVWF SPBRG
BSF
TXSTA,BRGH
BCF
TXSTA,SYNC
BSF
PIE1,RCIE
BSF
INTCON,PEIE
BSF
INTCON,GIE
BANCO_0
BSF
RCSTA,SPEN
BANCO_1
BSF
TXSTA,TXEN
BANCO_0
BSF
RCSTA,CREN
CLRF PORTC
BUCLE
GOTO
END
BUCLE
; Espera interrupcin
;****************************************************************************
; 24 I2C.asm
; Configura mdulo MSSP en modo I2C Master y se utiliza en modo Transmisin.
; Lee el contenido de PORTD y lo enva a las lneas correspondientes
; del puerto del perifrico I2C PCF8574 - Direccin 001 de U1 en el esquema.
;****************************************************************************
LIST P=16F877A
; Tipo de microcontrolador
#INCLUDE <P16F877A.INC> ; Archivo de definiciones
__CONFIG _CP_OFF & _WRT_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
MEMO
EQU
ERRORLEVEL
ERRORLEVEL
0x70
-302
-207
ORG
0x00
; inicio del cdigo
GOTO INICIO
;-------------------------------------------------------------------------------; *************************** MACROS ***************************
;-------------------------------------------------------------------------------BANCO_0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANCO_1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;****************************************************************************
; I2C_EnviaStart: Enva la condicin de Start
;****************************************************************************
I2C_EnviaStart
BANCO_0
BCF
PIR1,SSPIF ; Si SSPIF=1, la condicion de START fue completado por el mod. MSSP
BANCO_1
BSF
SSPCON2,SEN ; Activa secuencia inicio para SDA - SCL. Se limpia utomaticamente
BANCO_0
Espera_Start
BTFSS PIR1,SSPIF ; Fin de secuencia de transmisin?
GOTO Espera_Start ; Espera fin de transmisin
RETURN
;****************************************************************************
; I2C_EnviaRStart: Enva la condicin de RStart
;****************************************************************************
I2C_EnviaRStart
BANCO_0
BCF
PIR1,SSPIF ; Si SSPIF=1, la condicion de START fue completado por el modulo
MSSP
BANCO_1
BSF SSPCON2,RSEN ; Activa secuencia de inicio para SDA - SCL. Se limpiaautomaticamente
BANCO_0
Espera_RStart
BTFSS PIR1,SSPIF ; Fin de secuencia de transmisin?
GOTO Espera_RStart ; Espera fin de transmisin
RETURN
;****************************************************************************
; I2C_EnviaByte: Transmite el byte del W va I2C. La rutina finaliza cuando se recibe /ACK
;****************************************************************************
I2C_EnviaByte
BANCO_0
BCF
PIR1,SSPIF
MOVWF SSPBUF
Espera_Byte
BTFSS PIR1,SSPIF
BANCO_0
Espera_ACK
BTFSS PIR1,SSPIF
; Se ha finalizado la Secuencia ACK?
GOTO Espera_ACK
; No, esperar ACK
MOVF SSPBUF,W
; Lee el byte recibido
RETURN
;****************************************************************************
; stop_i2c
;****************************************************************************
stop_i2c
BANCO_0
BCF
PIR1,SSPIF
BANC0_1
BSF
SSPCON2,PEN
; Envia bit STOP i2c [P]
BANCO_0
BTFSS
PIR1,SSPIF
; Ciclo de bit de parada completado?
GOTO
$-1
RETURN
;****************************************************************************
;
Programa principal
;****************************************************************************
INICIO
CLRF PORTC
CLRF PORTD
BANCO_1
MOVLW B'11111111'
MOVWF TRISC
MOVWF TRISD
BANCO_0
MOVLW B'00101000'
MOVWF SSPCON
; Mdulo MSSP en On
CALL I2C_EnviaStart
MOVLW B'01000010'
CALL I2C_EnviaByte
MOVF
CALL
GOTO
END
Bucle
PORTD,W
I2C_EnviaByte
Bucle