You are on page 1of 50

01

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

; Inicio del cdigo


; Reserva de memoria RAM
; Reserva de memoria RAM
; Reserva de memoria RAM

;---------------------------------------------------------------------; *********************** RETARDO DE 1 s ***********************


;---------------------------------------------------------------------DELAY_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
;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************
;---------------------------------------------------------------------INICIO
CLRF PORTB
; Inicializa PORTB
BCF
BSF

STATUS,RP1
STATUS,RP0

; BANCO 1
;

MOVLW B'11111110' ; RB0 Salida, el resto Entradas


MOVWF TRISB
BCF
BCF

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

; FIN DEL PROGRAMA

;---------------------------------------------------------------------; 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

;---------------------------------------------------------------------; 03 CONMUTADOR SOFT.asm


; Enciende LED en RB2, con pulsador en RB0 y RB1 y Apaga LED en RB2, con
; los mismos pulsadores.
; Se elimina rebotes al pulsar y soltar (que podemos omitir)
; Usamos la instruccion XORWF,F (or exclusivo entre W y F)
; W
F
SALIDA en F
; 0
0
0
; 0
1
1
; 1
0
1
; 1
1
0
; Subrutina de retardo 20ms para rebote de contactos
;---------------------------------------------------------------------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

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

; soltaron? (RB0 paso a uno?)


; no soltaron (RB0 sigue en 0), queda en loop
; hasta que suelten

GOTO CONMUTA
TEST_1
BTFSC PORTB,1
GOTO TEST_0

pulsaron? (RB0 es 0?)


si no pulsaron (RB0 = 1), lee otra vez
si pulsaron, retardo de 20 ms (si RB0=0, ret. de 20 ms)
se mantiene pulsado? (RB0 sigue en 0?)
si no, falsa alarma, chequea otra vez

; pulsaron? (RB1 es 0?)


; si no pulsaron (RB1 = 1), lee otra vez RB1

CALL
BTFSC
GOTO
SUELTA_1
BTFSS
GOTO

RET_20ms
PORTB,1
TEST_1

; si pulsaron, retardo de 20 ms (si RB1=0, ret. de 20 ms)


; se mantiene pulsado? (RB1 sigue en 1?)
; si no, falsa alarma, chequea otra vez

PORTB,1
SUELTA_1

; soltaron? (RB1 paso a uno?)


; no soltaron (RB1 sigue en 0), queda en loop
; hasta que suelten

GOTO
CONMUTA
CALL

CONMUTA
RET_20ms

MOVLW 0x04
XORWF PORTB,F
GOTO TEST_0
END

;
;
;
;
;
;

si soltaron, retardo de 20 ms (si RB0,1=0, ret. de 20 ms)


probar sin este retardo (normalmente no se requiere)
carga W con 0000 0100
conmuta estado del LED
salta a leer RB0
FIN DEL PROGRAMA

;---------------------------------------------------------------------; 04 CONMUTADOR HARD.asm


; Enciende LED en RB2, con pulsador en RB0 y RB1 y Apaga LED en RB2, con
; los mismos pulsadores.
; Se elimina rebotes al pulsar y soltar (que podemos omitir).
; Subrutina de retardo 20ms para rebote de contactos.
;---------------------------------------------------------------------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
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

;
;
;
;
;

pulsaron? (RB0 es 0?)


si no pulsaron (RB0 = 1), lee RB1
si pulsaron (si RB0=0), retardo de 20 ms
se mantiene pulsado? (RB0 sigue en 0?)
si no, falsa alarma, chequea otra vez

; soltaron? (RB0 paso a uno?)

GOTO

SUELTA_0

GOTO CONMUTA
TEST_1
BTFSC PORTB,1
GOTO TEST_0

; no soltaron (RB0 sigue en 0), queda en loop


; hasta que suelten
; pulsaron? (RB1 es 0?)
; si no pulsaron (RB1 = 1), lee RB0

CALL
BTFSC
GOTO
SUELTA_1
BTFSS
GOTO

RET_20ms
PORTB,1
TEST_1

; si pulsaron (si RB1=0), retardo de 20 ms


; se mantiene pulsado? (RB1 sigue en 0?)
; si no, falsa alarma, chequea otra vez

PORTB,1
SUELTA_1

; soltaron? (RB1 paso a uno?)


; no soltaron (RB1 sigue en 0), queda en loop
; hasta que suelten

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

;
;
;
;
;
;
;
;
;
;

si soltaron, retardo de 20 ms (si RB0,1=0, ret. de 20 ms)


probar sin este retardo (normalmente no se requiere)
Probar estado actual del LED. RB2 est apagado?
Si est encendido, apaga el LED
Si est apagado, enciende el LED
LED ON
salta a leer RB0
LED OFF
salta a leer RB0
FIN DEL PROGRAMA

;----------------------------------------------------------------------------; 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

; Inicio del cdigo

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

; retardo 0,5 segundos

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

;---------------------------------------------------------------------; 06 - INT EXT.asm


; Programa principal: LED ROJO en RB6 conmuta cada 1 s
; La temporizacion de 1 s, con generador de retardos
; LED VERDE en RB7, conmuta mediante interrupcion externa
;---------------------------------------------------------------------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

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

; INTF=1?. Si es la interrupcin INT, lee estado RB1


; NO, restauramos contexto

MOVLW B'10000000'
XORWF PORTB,F

; Xoring with a 1-bit produces


; Complement bit 7, port-B

BCF

;
;
;
;
;

SALIR
INTCON,INTF

POP

Borra bandera de interrupcin externa


Restauramos contexto del programa principal
recupera PCLATH
W a PCLATH
Intercambia STATUS_TEMP y guarda en W. Retorna al Banco

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

; RB6 y RB7 inicialmente apagados


;
;
;
;
;
;

Mascara en 1 para RB6 de PORTB


Complementa bit 1
Retardo 0,5 segundos
Queda a la espera de la interrupcin
FIN DEL PROGRAMA

;---------------------------------------------------------------------; 07 - INT RB4_7 INTE.asm


; LED en RB0 conmuta con cambio de estado de RB4-RB7.
; Se usan interruptores.
;---------------------------------------------------------------------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
ORG
GOTO

0x00
INICIO
0x04
ISR

; Inicio del cdigo


; inicio de la interrupcin

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

; si RBIF=1, se produjo interrupcin


; si no, EXIT

BTFSC
GOTO
BSF
GOTO

PORTB,0
ESUNO
PORTB,0
EXIT

;
;
;
;

PORTB,0

; RB0=0 (Porque era "1")

MOVF

PORTB,F

; Lectura para borrar latch de PORTB

BCF

INTCON,RBIF

; borramos bandera RBIF


; Restauramos contexto del programa principal

ESUNO BCF

si RB0=0 salta una instruccin


a ESUNO
RB0=1 (porque era "0")
ya est invertido RB0, se va a EXIT

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 PORTB
; Inicializa PORTB
BANCO_1
MOVLW B'11111110'
MOVWF TRISB
; configuramos PORTB como entrada, excepto RB0
BCF
OPTION_REG,NOT_RBPU
; Pullup de PORTB habilitados
BANCO_0
BSF
INTCON,GIE
BSF
INTCON,RBIE
BCF
INTCON,RBIF
BCF
ESPERA
GOTO
END

; Habilita las interrupciones globalmente


; Habilita la interrupcin por cambio de nivel
; lgico en RB4 a RB7

PORTB,0

; Aseguramos LED apagado

ESPERA

; queda a la espera de la interrupcin


; FIN DEL PROGRAMA

;---------------------------------------------------------------------; 08- INT RB4_7 PULSA.asm


; Conmutador de LED en RA0 con int. RB4-RB7, con pulsadores
;---------------------------------------------------------------------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
ORG
GOTO

0x00
INICIO
0x04
ISR

; Inicio del cdigo


; inicio de la interrupcin

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

; si RBIF=1, se produjo interrupcin


; si no, 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

; si RB4=0 (pulsador presionado), salta instruccin


; Si pulsador RB4 no se presiona, se prueba pulsador RB5
; si RA0=0 (LED apagado), salta instruccin

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

; si RB5=0 (pulsador presionado), salta instruccin


; Si pulsador RB5 no se presiona, se prueba pulsador RB6
; si RA0=0 (LED apagado), salta instruccin

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

; si RB6=0 (pulsador presionado), salta instruccin


; Si pulsador RB6 no se presiona, se prueba pulsador RB7
; si RA0=0 (LED apagado), salta instruccin

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

; si RB7=0 (pulsador presionado), salta instruccin


; Si pulsador RB6 no se presiona, se sale de la subrutina
; si RA0=0 (LED apagado), salta instruccin

MOVF

PORTB,F

; Lectura para borrar latch de PORTB

BCF

INTCON,RBIF

; borramos bandera RBIF


; Restauramos contexto del programa principal

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

; Habilita las interrupciones globalmente


; Habilita la interrupcin por cambio de estado en RB4-7
; borramos bandera RBIF

PORTA,0

; Aseguramos LED apagado

ESPERA

; queda a la espera de la interrupcin


; FIN DEL PROGRAMA

;---------------------------------------------------------------------; 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

; inicio del cdigo

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
;---------------------------------------------------------------------; ***************** SURUTINA DE RETARDO DE 1 s ***************
;---------------------------------------------------------------------RET_1S
MOVLW .100
;
MOVWF CONTA
; CONTA = 100
DELAY
MOVLW .217
; W = 217
MOVWF TMR0
; TMR0 = 217
LOOP1S

BTFSS INTCON,T0IF ; T0IF=1? Hay desborde en TMR0?


GOTO LOOP1S
; n, esperar
BCF
INTCON,T0IF ; s, borrar bandera T0IF
DECFSZ CONTA,F
;
GOTO DELAY
; si CONTA no lleg a cero, se vuelve a cargar TMR0
RETURN
; si, retorno despus de aprox. 1 s
;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************
;---------------------------------------------------------------------INICIO
CLRF PORTB
; Inicializa PORTB
BANCO_1
MOVLW B'11111110'
MOVWF TRISB
MOVLW B'11010111'
MOVWF OPTION_REG

; RB0 Salida, el resto Entradas


;
; TMR0=Timer, Prescaler al Timer, Divisor %256
; T0CS=0, PSA=0, PS2-PS1-PS0=111

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

; inicio del cdigo

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
;---------------------------------------------------------------------; *********************** RETARDO DE 1 s ***********************
;---------------------------------------------------------------------RET_1S
MOVLW .2
MOVWF CONTA
; CONTA = 2
CICLO
BCF
T1CON,TMR1ON
; TMR1 OFF para Precarga
MOVLW 0x0B
MOVWF TMR1H
; TMR1H = Ox0B
MOVLW 0xDC
MOVWF TMR1L
; TMR1L = OxDC
BSF
T1CON,TMR1ON
; TMR1 ON despus de la Precarga
; ********** DESBORDAMIENTO **********
FLAG
BTFSS PIR1,TMR1IF
; TMR1IF=1? Hay desbordamiento?
GOTO FLAG
; Si no hay, esperar
BCF
PIR1,TMR1IF
; Si hay, borrar bandera
DECFSZ CONTA,F
; si CONTA lleg a 0, salir de la subrutina
GOTO CICLO
; si CONTA no lleg a cero, se vuelve a cargar TMR1
RETURN
;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************
;---------------------------------------------------------------------INICIO
CLRF PORTB
; Inicializa PORTB
BANCO_1
MOVLW B'11111110'
MOVWF TRISB
; RB0 salida, el resto entradas
BANCO_0
; ********** CONFIGURA TMR1 **********
BSF
T1CON,T1CKPS1
; Prescaler
BSF
T1CON,T1CKPS0
; divisor por 8
BCF
T1CON,TMR1CS
; Usamos fosc/4, TMR1 como temporizador
; ********** ENCIENDE Y APAGA LED EN RB1 **********
TIME
BSF
PORTB,0
; RB0=1
CALL RET_1S
; Retardo 1s
BCF
PORTB,0
; RB0=0

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

;
;
;
;
;
;
;
;

; RB1 salida, el resto entradas

BANCO_0
MOVLW
B'00001110'
;
|||||||+------||||||+-------|||||+--------||||+---------|||+----------||+-----------|+------------+-------------MOVWF
T1CON

configuracin de TMR1 para usar cristal externo


TMR1ON OFF, se iniciar mas tarde
TMR1CS reloj externo con cristal de 32768 Hz
/T1SYNC reloj externo no sincronizado para usar SLEEP
T1OSCEN oscilador de TMR1 habilitado
T1CKPS0 para seleccionar prescaler en 1
T1CKPS1 para seleccionar prescaler en 1
no usado
no usado

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

; inicio del cdigo

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
;---------------------------------------------------------------------; *********************** RETARDO DE 1 s ***********************
;---------------------------------------------------------------------RET_1S
MOVLW .125
MOVWF CONTA
; CONTA = 125
; ********** DESBORDAMIENTO **********
FLAG
BTFSS PIR1,TMR2IF
; TMR2IF=1? Hay desbordamiento?
GOTO FLAG
; Si no hay, esperar
BCF
PIR1,TMR2IF
; Si hay, borrar bandera
DECFSZ CONTA,F
; si CONTA lleg a 0, salir de la subrutina
GOTO FLAG
; si CONTA no lleg a 0, salto a FLAG
RETURN
;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************
;---------------------------------------------------------------------INICIO
CLRF PORTB
; Inicializa PORTB
BANCO_1
MOVLW B'11111110'
MOVWF TRISB

; RB1 salida, el resto entradas

; ********** CONFIGURA TMR2 **********


MOVLW .199
MOVWF PR2
; PR2=199 Lmite superior de conteo de TMR2
BANCO_0
MOVLW B'01001001'
MOVWF T2CON
; PRESCALER=10, TMR2=OFF, POSTSCALER=4
BSF
T2CON,TMR2ON
; TMR2 ON
; ********** ENCIENDE Y APAGA LED EN RB1 **********
CICLO
BSF
PORTB,0
; RB0=1
CALL RET_1S
; Retardo 1s
BCF
PORTB,0
; RB0=0
CALL RET_1S
; Retardo 1s
GOTO CICLO
; Salto a CICLO

END

;---------------------------------------------------------------------; 13 - SLEEP INT EXT.asm


; Despus de energizarce, el micro entra a modo SLEEP. Sale del modo
; SLEEP mediante int. Externa. Luego sigue 5 ciclos de 2 segundos cada
; uno. Dentro de cada ciclo, RB7 se enciende 1 segundo y se apaga 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

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

;
;
;
;
;

Borra bandera de interrupcin externa


Restauramos contexto del programa principal
recupera PCLATH
W a PCLATH
Intercambia STATUS_TEMP y guarda en W. Retorna

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

; inicio del cdigo

CONT EQU 0x70


; reserva de memoria RAM
CONTA EQU
0X71
; 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
;---------------------------------------------------------------------; *********************** RETARDO DE 1 s ***********************
;---------------------------------------------------------------------RET_1S
MOVLW .20
;
MOVWF CONT
; SEGUNDO = 20
DELAY
MOVLW .60
; W = 60
MOVWF TMR0
; TMR0 = W = 60
LOOP1S
CLRWDT
; Limpiar WDT para que no desborde
BTFSS INTCON,T0IF
; T0IF=1? Hay desborde en TMR0?
GOTO LOOP1S
; n, esperar
BCF
INTCON,T0IF
; s, borrar bandera T0IF
DECFSZ CONT,F
; si SEGUNDO lleg a 0, pasaron 196*256+2 estados
GOTO DELAY
; si SEGUNDO no lleg a cero, se vuelve a cargar TMR0
RETURN
; retorno despus de 20*[(192*256)+2] us=1003560 us=1,0004 s
;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************
;---------------------------------------------------------------------INICIO
CLRF PORTB
; Inicializa PORTB
CLRWDT
; Reset del Watchdog
MOVLW .6
;
MOVWF CONTA
;
BANCO_1
MOVLW B'11111101'
; RB1 Salida, el resto Entradas
MOVWF TRISB
;
MOVLW B'11010111'
MOVWF OPTION_REG

; TMR0=Timer, Prescaler al Timer, Divisor %256


; T0CS=0, PSA=0, PS2-PS1-PS0=111

BANCO_0
PULSA

LOOP

CLRWDT
BTFSC PORTA,4
GOTO PULSA
DECFSZ CONTA,F
GOTO CICLO

; Evita el desbordamiento del Watchdog


; Si no se acciona el pulsador RA4
; se espera
;
;

GOTO

BUCLE

BSF
CALL
BCF
CALL
GOTO

PORTB,1
RET_1S
PORTB,1
RET_1S
LOOP

; RB1=1
;
; RB1=0
;
;

GOTO
END

BUCLE

; tras 18 ms. el micro se resetea


; FIN DEL PROGRAMA

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

; inicio del cdigo

PDel0 EQU 0x70


PDel1 EQU 0x71
PDel2 EQU 0x72
;---------------------------------------------------------------------; *************************** MACROS ***************************
;---------------------------------------------------------------------BANCO_0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANCO_1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;------------------------------------------------------------; Generado con PDEL ver SP r 1.0 el 12/09/2009 Hs 07:35:32 p.m.
; Descripcion: Delay 10000000 ciclos (10 SEGUNDOS)
;------------------------------------------------------------RET_10S movlw
.43
; 1 set numero de repeticion (C)
movwf
PDel0
; 1 |
PLoop0 movlw
.226
; 1 set numero de repeticion (B)
movwf
PDel1
; 1 |
PLoop1 movlw
.205
; 1 set numero de repeticion (A)
movwf
PDel2
; 1 |
PLoop2 clrwdt
; 1 clear watchdog
clrwdt
; 1 ciclo delay
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
clrwdt
; 1 ciclo delay
return
; 2+2 Fin.
;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************
;---------------------------------------------------------------------INICIO
CLRF PORTC
CLRF PORTB
CLRF PORTD
CLRF TMR1H
CLRF TMR1L
BANCO_1
MOVLW B'00000000'
MOVWF TRISB
MOVWF TRISD
MOVLW B'10111111'
MOVWF TRISC

; PORTB Y PORTD SALIDAS

; 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

; TMR1 como contador


; Modo de captura, flanco de subida
; RETARDO DE 10s
; INICIO PULSO DE SUBIDA EN RC6

; FIN PULSO DE SUBIDA EN RC6, CONECTADO A CCP1

MOVF CCPR1H,W
MOVWF PORTD

; SE LEE PARTE ALTA CCPR1H


; PARTE ALTA A PORTD

MOVF CCPR1L,W
MOVWF PORTB

; SE LEE PARTE BAJA CCPR1L


; PARTE BAJA A 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

; PIN RB0 SALIDA

; Cargamos valor de comparacion


; F424 = 62500

;
;
;
;
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

; TMR1 ON despus de la Precarga

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

; Probar estado actual del LED

ON
OFF

GOTO
GOTO
BSF
GOTO
BCF
GOTO
END

OFF
ON
PORTB,0
CICLO
PORTB,0
CICLO

; Si es uno, apaga el LED


; Si es cero, enciende el LED
; LED ON
; LED OFF
; FIN DEL PROGRAMA

;---------------------------------------------------------------------; 17 - MULTIPLEX INT EXT 00a99.asm


; Multiplexa y cuenta con interrupcin por RB0/INT
; RA0 unidades y RA1 decenas
; Display de ctodo comn RB7 = g ... RB1 = a
;---------------------------------------------------------------------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

; Para salvar contexto registro W


; Salvar contexto registro STATUS

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

;
;
;
;
;
;
;

Borra registro unidades


Incrementa decenas

Salta si carry=1 (hay acarreo)

Salta si carry=1 (hay acarreo)


Borra registro decenas

INTCON,INTF ; Borra bandera de interrupcin externa INTF=0


; Restauramos contexto del programa principal
PCLATH_TEMP, W
; Restore PCLATH
PCLATH
; Move W into PCLATH
STATUS_TEMP,W
; Swap STATUS_TEMP register into W
; (sets bank to original state)
MOVWF STATUS
; Move W into STATUS register
SWAPF W_TEMP,F
; Swap W_TEMP
SWAPF W_TEMP,W
; Swap W_TEMP into W
RETFIE
;
;------------------------------------------------------------------------------------------; ******************** 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'11111100' ; RA0 y RA1 salidas, el resto entradas
MOVWF TRISA
;
BSF

OPTION_REG,INTEDG

; Interrupcin en flanco de subida INTEDG=1

BCF
MOVLW
MOVWF
MOVLW
MOVWF

STATUS,RP0
D'0'
UNI
D'0'
DEC

BCF
BSF
BSF

INTCON,INTF ; Flag de int. RB0/INT=0


INTCON,INTE ; Habilit. interrup. por RB0/INT
INTCON,GIE ; Habilit. interrup. globales

; 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

;---------------------------------------------------------------------; 18 - MULTIPLEX INT EXT 000a999.asm


; Multiplexa y cuenta hasta 999 con interrupcin por RB0/INT
; RA0 unidades y RA1 decenas RA2 centenas
; Display de ctodo comn RB7 = g ... RB1 = a
;---------------------------------------------------------------------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

; Para guardar registro W


; Para guardar registro STATUS
; Para guardar registro PCLATH

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

;
;
;
;
;
;
;

Borra registro unidades


Incrementa decenas

DEC
CEN,F
D'246'
CEN,W
STATUS,C
CEN
EXIT

;
;
;
;
;
;
;

Borra registro decenas


Incrementa centenas

Salta si carry=0. No hay acarreo (no se lleg a 256)


Borra registro centenas

Salta si carry=0. No hay acarreo (no se lleg a 256)


Borra registro centenas

INTCON,INTF ; Borra bandera de interrupcin externa INTF=0


; Restauramos contexto del programa principal
PCLATH_TEMP, W
; Restore PCLATH
PCLATH
; Move W into PCLATH
STATUS_TEMP,W
; Swap STATUS_TEMP register into W
; (sets bank to original state)
MOVWF STATUS
; Move W into STATUS register
SWAPF W_TEMP,F
; Swap W_TEMP
SWAPF W_TEMP,W
; Swap W_TEMP into W

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

; Interrupcin en flanco de subida INTEDG=1

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

INTCON,INTF ; Flag de int. RB0/INT=0


INTCON,INTE ; Habilit. interrup. por RB0/INT
INTCON,GIE ; Habilit. interrup. globales

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

RA2=0 centenas apagado


Retardo de apagado

MULT
; FIN DEL PROGRAMA

;---------------------------------------------------------------------; 19 - MULTIPLEX CONTA TMR0.asm


; Multiplexa y funcionamiento como contador por RA4/T0CKI
; RA0 unidades, RA1 decenas y RA2 centenas
; Display de ctodo comn RB7 = g ... RB1 = a
;---------------------------------------------------------------------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

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
;

MOVLW B'00000110' ; todos los pines analogicos son digitales


MOVWF ADCON1
;
MOVLW B'11111000' ; RA0, RA1 y RA2 salidas, el resto entradas
MOVWF TRISA
;
MOVLW B'11111111' ; T0CS=1 (contador). T0SE=1 (Flanco de bajada). PSA=1 (Prescaler a
WDT)
MOVWF OPTION_REG
BANCO_0
MOVLW D'0'
MOVWF UNI
MOVLW D'0'
MOVWF DEC
CLRF

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

; Borra registro unidades


; Incrementa decenas
;
;

RA0=0 unidades apagado


Retardo de apagado

RA1=0 decenas apagado


Retardo de apagado

RA2=0 centenas apagado


Retardo de apagado

BTFSS
GOTO
CLRF
CENTENAS
INCF
MOVLW
ADDWF
BTFSS
GOTO
CLRF
GOTO
END

STATUS,C
MULT
DEC

; Salta si carry=1 (si hay acarreo)


;
;

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

; Reserva de memoria RAM

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)

; Lectura del Canal analgico AN0


MAIN
BANCO_0
CALL Delay20us
; Retardo para tiempo de adquisicin
BSF
ADCON0,GO
; Inicia la conversin
WAIT
;

BTFSC ADCON0,GO
BTFSS PIR1,ADIF
GOTO WAIT

; Nota: Tambin se puede escribir ADCON0,GO_DONE


;
; Espera fin de conversin

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

; Reserva de memoria RAM

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
;
;

; Lectura del Canal analgico AN0


MAIN
CALL RET_20us
; Retardo para tiempo de adquisicin
BSF
ADCON0,GO
; Inicia la conversin
WAIT
BTFSC ADCON0,GO
GOTO WAIT

; Nota: Tambin se puede escribir ADCON0,GO_DONE


; Espera fin de conversin

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

; se apunta a memoria EEPROM


; se inicia ciclo de lectura
; se lee dato de EEDATA y se almacena en W

;---------------------------------------------------------------------; ******************** PROGRAMA PRINCIPAL *********************


;---------------------------------------------------------------------INICIO
CLRF PORTB
; inicializa PORTB

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

; Para guardar registro W


; Para guardar registro STATUS
; Para guardar registro PCLATH

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

; RC0-1-2 salidas, el resto entradas


;
; 9600 baudios, Xtal=4 MHz
;
;
;
;
;

Seleccin de ALTA velocidad


Modo asncrono
Habilita INTR Recepcin Serial
Habilita INTR perifricos
Habilitador general de interrupciones

BANCO_0
BSF
RCSTA,SPEN

; habilita el puerto serie

BANCO_1
BSF
TXSTA,TXEN

; Activa la transmisin serial TXIF=1

BANCO_0
BSF
RCSTA,CREN
CLRF PORTC

; bit de habilitacin de recepcin continua


; PORTC=0. LED apagados

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

; reservamos memoria RAM


; elimina BANK WARNING
; elimina LABEL AFTER COLUMN 1

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

; Byte a transmitir pasa al buffer de salida

; Se ha recibido el bit /ACK?. Si=1, la condicion de reconocimiento


; fue completada por el modulo MSSP
GOTO Espera_Byte ; No esperar
RETURN
;****************************************************************************************
;I2C_LeeByte: Lee un byte procedente del dispositivo I2C seleccionado y lo deja en W
;Seguidamente se genera y transmite el bit /ACK
;****************************************************************************
I2C_LeeByte
BCF
PIR1,SSPIF
; Restaura el flag del mdulo MSSP
BANCO_1
BSF
SSPCON2,RCEN
BANCO_0
Espera_Lectura
BTFSS PIR1,SSPIF
GOTO Espera_Lectura
BCF
PIR1,SSPIF
BANCO_1
BCF
SSPCON2,ACKDT
BSF
SSPCON2,ACKEN

; Activa el modo receptor

; Se han recibidos los 8 bits ?


; No, esperar lectura
; Restaura el flag del mdulo MSSP
; Pone bit ACK a "0"
; Aciva la secuencia de generacin del bit ACK

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

; Configura PORTC y PORTD como entrada


; RC3/SCL y RC4/SDA entradas

;*******INICIALIZA MODULO MSSP**********************************


MOVLW B'10000000'
MOVWF SSPSTAT
; Velocidad estndar con niveles I2C
MOVLW .9
MOVWF SSPADD
; Velocidad del bus I2C 100 kHz
;***************************************************************
;Configuramos el mdulo MSSP en el modo Master I2C

BANCO_0
MOVLW B'00101000'
MOVWF SSPCON

; Mdulo MSSP en On

CALL I2C_EnviaStart
MOVLW B'01000010'
CALL I2C_EnviaByte

; Enva condicin de Start

MOVF
CALL
GOTO
END

; Carga en W el valor del PORTD


; Envia Byte al PCF8574 - U2

; Enva la direccin al PCF8574 - U2

Bucle
PORTD,W
I2C_EnviaByte
Bucle

; Fin del programa

You might also like