Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Entrenadores PDF
Entrenadores PDF
Microcontroladores PIC
ndice
Pgina
1.1.- Ejemplo1.asm
1.2.- Ejemplo2.asm
1.3.- Ejemplo3.asm
1.4.- Ejemplo3A.asm
1.5.- Ejemplo3B.asm
12
14
1.6.- Ejemplo4.asm
15
1.7.- Ejemplo5.asm
18
1.8.- Nom_disp.asm
21
1.9.- Sum_Nibl.asm
24
1.10.- Dir_ind.asm
26
1.11.- Pagina1.asm
28
1.12.- RETARDO_1S.INC
30
1.13.- RETARDOS.INC
31
35
2.1.- Ejemplo6.asm
36
2.2.- Ejemplo7.asm
38
41
46
2.3.- Ejemplo8.asm
3.1.- Ejemplo9.asm
47
52
4.1.- PWM_1.asm.
4.2.- PWM_CAD.asm
53
55
58
5.1.- Ejempl10.asm
59
ndice
Pgina
5.2.- Ejemp_11.asm
64
5.3.- Ejemp_12.asm
66
68
71
75
6.1.- T_S_A.asm
76
6.2.- R_S_A.asm
79
6.3.- T1_S_RF.asm
82
84
87
5.4.- Ejemp_13.asm
5.5.- Ejemp_14.asm
6.4.- RE1_S_RF.asm
6.5.- T_S_RF.INC
6.6.- R_S_RF.INC
6.8.- R_M_S_RF.INC
DATO_SERIE_VALIDO. ...............................................
90
94
98
ndice
Pgina
102
7.1.- Tecla0.asm
103
7.2.- Tecl_01.asm
105
108
110
111
7.2.- Tecl_02.asm
7.4.- HEX_7SEG.INC
7.5.-TECLADO.INC
115
116
8.2.- LCD_02.asm
8.3.- LCD_03.asm
118
8.4.- LCD_04.asm
120
8.5.- LCD_05.asm
122
123
125
127
129
131
132
133
8.6.- LCD_06.asm
8.7.- LCD_07.asm
8.8.- LCD_08.asm
8.9.- Mens_01.asm
8.10.- Mens_02.asm
8.11.- Mens_03.asm
8.12.- Mens_03B.asm
ndice
8.13.- Mens_04.asm
Pgina
Visualizacin de mensajes parpadeantes
en dos lneas del LCD. ....................................................
135
8.14.- Mens_05.asm
137
8.15.- Mens_06.asm
8.16.- Mens_07.asm
141
8.17.- Mens_08.asm
142
8.18.- Mens_09.asm
144
145
8.19.- BIN_BCD.INC
8.20.- LCD_4BIT.INC
8.21.- LCD_MENS.INC
151
154
9.1.- Tecla_01.asm
9.2.- Tecla_02.asm
9.3.- Tecl_03.asm
9.4.- Tecla_04.asm
155
156
157
159
9.5.- Tecla_05.asm
9.6.- Tecla_06.asm
9.7.- Tecla_07.asm
9.8.- Tecla_08.asm
166
169
9.8.- Tecla_09.asm
ndice
Pgina
173
10.1.- Tecla_10.asm
174
179
11.1.- I2C1.asm
180
11.2.- I2C2.asm
11.3.- I2C3.asm
12.2.- I2C5.asm
13.2.- I2C7.asm
13.3.- I2C8.asm
13.4.- I2C.INC
13.5.- I2C1.INC
14.2.- RTS232_2.asm
14.3.- RTS232_3.asm
14.4.- RTS232_4.asm
14.5.- RTS232_5.asm
14.6.- RTS232_6.asm
14.7.- RTS232_7.asm
14.8.- RTS232_8.asm
14.9.- RTS232_9.asm
14.10.- RTS23_10.asm
14.11.- RTS23_11.asm
14.12.- RS232_RT.INC
14.13.- RS232MEN.INC
15.2.- Int_T_02.asm
15.3.- Int_T_03.asm
15.4.- Int_T_04.asm
15.5.- Int_T_05.asm
15.6.- Int_T_06.asm
15.7.- Int_C_01.asm
15.8.- Int_C_02.asm
15.9.- Int_C_03.asm
15.10.- Int_C_04.asm
15.11.- Int_Re_01.asm
15.12.- Int_Re_04.asm
15.13.- Int_Temp.asm
1.1.- Ejemplo1.asm
(Entrenador Bsico 0)
Diagrama de Flujo
Leer el Puerto C
y transferirlo al
Elegimos PIC
List p=16f877 , f=inhx32
Asignacin de nombres de
RFS a direcciones.
#include <p16f877.inc>
; Igualdades
; Registros
Seccin de Configuracin
ORG 0x05
; Inicio de Programa
COMIENZO
RP0 1
TRISC 11111111 B
TRISB 00000000 B
RP0 0
; Ir al Banco 1
; Poner el Puerto C como entrada de datos.
; Poner el Puerto B como salida de datos.
; Ir al Banco 0
; Principal
PORTB PORTC
0x00
GOTO COMIENZO
; Inicio de Programa
;(Una posicin detrs del vector de Interrupcin)
BSF STATUS,RP0
MOVLW B'11111111'
MOVWF TRISC
CLRF TRISB
BCF STATUS,RP0
MOVF PORTC,W
MOVWF PORTB
GOTO SEG1
END
1.2.- Ejemplo2.asm
(Entrenador Bsico 0)
Diagrama de Flujo
Leer el Puerto C
complementarlo y
transferirlo al Puerto B
Elegimos PIC
List p=16f877 , f=inhx32
Asignacin de nombres de
RFS a direcciones.
#include <p16f877.inc>
; Igualdades
; Registros
Seccin de Configuracin
ORG 0x05
COMIENZO
RP0 1
TRISC 11111111 B
TRISB 00000000 B
RP0 0
; Inicio de Programa
; Ir al Banco 1
; Poner el Puerto C como entrada de datos.
; Poner el Puerto B como salida de datos.
; Ir al Banco 0
; Principal
PORTB PORTC
0x00
GOTO COMIENZO
; Inicio de Programa
; (Una posicin detrs del vector de Interrupcin)
BSF STATUS,RP0
MOVLW B'11111111'
MOVWF TRISC
CLRF TRISB
BCF STATUS,RP0
COMF PORTC,W
MOVWF PORTB
GOTO INICIO
END
1.3.- Ejemplo3.asm
(Entrenador Bsico 0)
Diagrama de Flujo
Parpadeo de un Led
Subrutina de
Tiempo
Elegimos PIC
List p=16f877 , f=inhx32
REG3 # DATO3
Asignacin de nombres de
RFS a direcciones.
#include <p16f877.inc>
REG2 # DATO2
; Igualdades
REG1 # DATO1
DATO1
DATO2
DATO3
REG1 REG1 - 1
EQU 0X10
EQU 0X64
EQU 0X64
NO
; Registros
REG1
REG2
REG3
EQU
EQU
EQU
0X22
0X23
0X24
REG1 = 0
?
SI
REG2 REG2 - 1
Seccin de Configuracin
ORG 0x05
COMIENZO
RP0 1
TRISB 00000000 B
RP0 0
PORTB 00000000 B
; Inicio de Programa
; Ir al Banco 1
; Poner el Puerto B como salida de datos.
; Ir al Banco 0
; Limpiar el Puerto B
REG2 = 0
?
NO
SI
REG3 REG3 - 1
REG3 = 0
?
NO
SI
; Principal
RETUR
SEGUNDO
SEGUNDO
EQU 0X10
DATO2
EQU 0X64
DATO3
EQU 0X64
0x00
GOTO COMIENZO
BSF STATUS,RP1
BSF STATUS,RP0
CLRF TRISB
; Configuramos el Puerto B como salidas
BCF STATUS,RP0
CLRF PORTB
BSF PORTB,0
CALL SEGUNDO
10
BCF PORTB,0
CALL SEGUNDO
GOTO SEGUIR
;**************************** Subrutina de perdida de tiempo de 1 Segundo ******************************
SEGUNDO
SEG7
SEG6
SEG5
MOVLW DATO3
MOVWF REG3
MOVLW DATO2
MOVWF REG2
MOVLW DATO1
MOVWF REG1
DECFSZ REG1,F
GOTO SEG5
DECFSZ REG2,F
GOTO SEG6
DECFSZ REG3,F
GOTO SEG7
RETURN
END
11
1.4.- Ejemplo3A.asm
(Entrenador Bsico 0)
Diagrama de Flujo
Parpadeo de un Led
Utilizando una librera de
Tiempo
Librera de Tiempo
RETART_1S.INC
; Igualdades
Elegimos PIC
List p=16f877 , f=inhx32
Asignacin de nombres de
RFS a direcciones.
#include <p16f877.inc>
DATO1
DATO2
DATO3
EQU 0X10
EQU 0X64
EQU 0X64
; Registros
CBOCK
REG1
REG2
REG3
; Igualdades
ENDC
SEGUNDO
; Registros
REG3 # DATO3
CBLOCK 0X20
REG2 # DATO2
ENDC
REG1 # DATO1
REG1 REG1 - 1
NO
Seccin de Configuracin
ORG 0x05
COMIENZO
RP0 1
TRISB 00000000 B
RP0 0
PORTB 00000000 B
; Inicio de Programa
; Ir al Banco 1
; Poner el Puerto B como salida de datos.
; Ir al Banco 0
; Limpiar el Puerto B
; Principal
PB0 1 ; Encender el Led de PB0
REG1 = 0
?
SI
REG2 REG2 - 1
REG2 = 0
?
NO
SI
SEGUNDO
SEGUNDO
REG3 REG3 - 1
REG3 = 0
?
NO
SI
RETUR
12
title " Parpadeo de un Led utilizando una librera llamada RETAR_1S.INC "
;Programa para PIC 16F877a.
;Velocidad del Reloj:4 MHz.
;Reloj instruccin: 1 MHz = 1 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;**************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;**************************** Asignacin de Registros de Funciones especiales a direcciones ************
#include <p16f877.inc> ;Este fichero contiene los nombres y direcciones de los
; registros de funciones especiales.
; Este fichero esta localizado en el directorio
; con el nombre MPASM.
;**************************** Igualdades ************************************************************************
;*************************** Registros **************************************************************************
CBLOCK 0X20
ENDC
;**************************** Seccin Cdigo de Reset *******************************************************
ORG
0x00
GOTO COMIENZO
BSF STATUS,RP0
CLRF TRISB ; Configuramos el Puerto B como salidas
BCF STATUS,RP0
CLRF PORTB
BSF PORTB,0
CALL SEGUNDO
BCF PORTB,0
CALL SEGUNDO
GOTO SEGUIR
1.5.- Ejemplo3B.asm
(Entrenador Bsico 0)
13
title " Parpadeo de un Led utilizando una librera llamada RETARDOS.INC del libro
de Desarrollo de Proyectos"
;Programa para PIC 16F877.
;Velocidad del Reloj:4 MHz.
;Reloj instruccin: 1 MHz = 1 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;**************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;**************************** Asignacin de Registros de Funciones especiales a direcciones ************
#include <p16f877.inc> ;Este fichero contiene los nombres y direcciones de los
; registros de funciones especiales.
; Este fichero esta localizado en el directorio
; con el nombre MPASM.
;**************************** Igualdades ************************************************************************
;*************************** Comienzo de registros ************************************************************
CBLOCK 0X20
ENDC
;**************************** Seccin Cdigo de Reset ********************************************************
ORG
0x00
GOTO COMIENZO
BSF STATUS,RP0
CLRF TRISB ; Configuramos el Puerto B como salidas
BCF STATUS,RP0
CLRF PORTB
BSF PORTB,0
CALL Retardo_1s
BCF PORTB,0
CALL Retardo_1s
GOTO SEGUIR
1.6.- Ejemplo4.asm
(Entrenador Bsico 0)
14
Diagrama de Flujo
1
Simular las luces del
Coche Fantstico
PORTB DATO
Elegimos PIC
List p=16f877 , f=inhx32
Asignacin de nombres de
RFS a direcciones.
CONTADOR CONTADOR + 1
CY
DATO
Retardo_100ms
#include <p16f877.inc>
NO
CONTADOR =
8?
; Igualdades
CY 0
SI
CONTADOR 00000000 B
; Registros
CBLOCK 0X20
CY 0
CONTADOR
DATO
ENDC
CY
DATO
Seccin de Configuracin
ORG 0x05
PORTB DATO
Retardo_100ms
; Inicio de Programa
CONTADOR CONTADOR + 1
CONTADOR =
7?
NO
SI
CONTADOR 00000001 B
0x00
GOTO COMIENZO
CLRF CONTADOR
BCF STATUS,RP1
BSF STATUS,RP0
MOVLW B'00000000'
MOVWF TRISB
BCF STATUS,RP0
MOVLW B'10000000'
MOVWF DATO
16
SEG1
SEG4
SEG2
SEG3
MOVF DATO,W
MOVWF PORTB
INCF CONTADOR
; Incrementamos CONTADOR.
CALL Retardo_100ms
MOVF CONTADOR,W
; Preguntamos si CONTADOR = 8
XORLW 0X08
BTFSC STATUS,Z
GOTO SEG2
BCF STATUS,C
; Si CONTADOR <> 8 ponemos el Cy=0 y rotamos hacia
RRF DATO,F
; la Derecha el registro DATO.
GOTO SEG1
; Seguimos hacia la Derecha.
CLRF CONTADOR ; Si CONTADOR = 8 ponemos el CONTADOR=0, Cy=0 y
BCF STATUS,C
; rotamos hacia la Izquierda el registro DATO.
RLF DATO,F
MOVF DATO,W
MOVWF PORTB
1.7.- Ejemplo5.asm
(Entrenador Bsico 0)
17
Diagrama de Flujo
PORTB DATO
NO
PC0 = 1 ?
Elegimos PIC
List p=16f877 , f=inhx32
SI
CONTADOR CONTADOR + 1
Asignacin de nombres de
RFS a direcciones.
#include <p16f877.inc>
CY
DATO
Retardo_100ms
; Igualdades
NO
CONTADOR =
8?
CY 0
SI
; Registros
CONTADOR 00000000 B
CBLOCK 0X20
CONTADOR
DATO
CY 0
ENDC
CY
DATO
ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa
PORTB DATO
Seccin de Configuracin
ORG 0x05
; Inicio de Programa
PCO = 1
?
NO
SI
DATO 10000000 B ; Encendemos el Led PB7
y guardamos el cdigo en un Registro.
NO
PC0 =
1?
SI
Retardo_100ms
CONTADOR CONTADOR + 1
NO
CONTADOR =
7?
SI
CONTADOR 00000001 B
0x00
GOTO COMIENZO
CLRF CONTADOR
BCF STATUS,RP1
BSF STATUS,RP0
MOVLW B'00000000'
MOVWF TRISB
BSF TRISC,0
BCF STATUS,RP0
BTFSS PORTC,0
GOTO SEGUIR
MOVLW B'10000000' ; Encendemos el Led PB7
MOVWF DATO
; Guardamos el cdigo en un Registro.
19
SEG1
PARAR1
MOVF DATO,W
MOVWF PORTB
BTFSS PORTC,0
GOTO PARAR1
INCF CONTADOR
CALL Retardo_100ms
MOVF CONTADOR,W
XORLW 0X08
BTFSC STATUS,Z
GOTO SEG2
SEG4
BCF STATUS,C
RRF DATO,F
GOTO SEG1
SEG2
SEG3
PARAR2
MOVF DATO,W
MOVWF PORTB
BTFSS PORTC,0
GOTO PARAR2
INCF CONTADOR
CALL Retardo_100ms
; Preguntamos si CONTADOR = 7
; Llamamos a la Subrutina de Retardo TIEMPO.
MOVF CONTADOR,W
XORLW 0X07
BTFSS STATUS,Z
GOTO SEG3
; Seguimos hacia la Derecha.
MOVLW 0X01
; Ponemos el CONTADOR = 1 y volvemos hacia la izquierda.
MOVWF CONTADOR
GOTO SEG4
;*************************** Libreras ***************************************************************************
INCLUDE <RETARDOS.INC>
END
1.8.- Nom_disp.asm
(Entrenador Bsico 0)
20
Diagrama de Flujo
1
Poner el Nombre en el
Display
CONTADOR 00000000 B
Elegimos PIC
List p=16f877 , f=inhx32
W CONTADOR
Asignacin de nombres de
RFS a direcciones.
BINARIO_CARACTER
#include <p16f877.inc>
PORTD W
; Igualdades
Retardo_500ms
; Registros
CONTADOR CONTADOR + 1
CBLOCK 0X20
CONTADOR
ENDC
CONTADOR
=
NO
SI
Numero_de
_caracteres
ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa
Seccin de Configuracin
ORG 0x05
COMIENZO
; Inicio de Programa
RP0 1
TRISD 00000000 B
RP0 0
; Ir al Banco 1
; Poner el Puerto D como
salida de datos.
; Ir al Banco 0
BINARIO_CARACTE
R
PCL PCL + W
1
RETLW B'01110011'
RETLW B'01111001'
RETLW B'01011110'
RETLW B'01010000'
RETLW B'01011100'
GOTO COMIENZO
BSF STATUS,RP0
CLRF TRISD
BCF STATUS,RP0
CLRF CONTADOR
MOVF CONTADOR,W
CALL BINARIO_CARACTER
MOVWF PORTD
CALL Retardo_500ms
INCF CONTADOR,F
MOVF CONTADOR,W
SUBLW Numero_de_caracteres
BTFSS STATUS,Z
GOTO SEG1
GOTO SEG2
22
1.9.- Sum_Nibl.asm
(Entrenador Bsico 0)
23
Diagrama de Flujo
1
Sumar los nibles del
Puerto C y llevarlos al
Puerto B
W PORTC
Elegimos PIC
List p=16f877 , f=inhx32
W 00001111 B AND W
Asignacin de nombres de
RFS a direcciones.
#include <p16f877.inc>
Numero_bajo W
; Igualdades
W PORTC
W 11110000 B AND W
; Registros
CBLOCK 0X20
Numero_bajo
Numero_alto
ENDC
Numero_alto W
Numero_alto
( 7..4 )
Numero_alto
( 3..0 )
ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa
W Numero_alto
Seccin de Configuracin
ORG 0x05
COMIENZO
; Inicio de Programa
RP0 1
TRISB 00000000 B
TRISC 11111111 B
RP0 0
; Ir al Banco 1
; Poner el Puerto B como
salida de datos.
; Poner el Puerto C como
entrada de datos.
; Ir al Banco 0
W W + Numero_bajo
PORTB W
title " Sumar los nibles del Puerto C y llevarlos al Puerto B "
;Programa para PIC 16F877.
;Velocidad del Reloj:4 MHz.
;Reloj instruccin: 1 MHz = 1 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
24
GOTO COMIENZO
BSF STATUS,RP0
CLRF TRISB
MOVLW B'11111111'
MOVWF TRISC
BCF STATUS,RP0
COMF PORTC,W
ANDLW B'00001111'
MOVWF Numero_bajo
COMF PORTC,W
ANDLW B'11110000'
MOVWF Numero_alto
SWAPF Numero_alto,F
MOVF Numero_alto,W
ADDWF Numero_bajo,W
MOVWF PORTB
GOTO SEG1
END
1.10.- Dir_ind.asm
(Entrenador Bsico 0)
25
Diagrama de Flujo
Direccionamiento
Indirecto
Elegimos PIC
List p=16f877 , f=inhx32
Asignacin de nombres de
RFS a direcciones.
#include <p16f877.inc>
; Igualdades
; Registros
CBLOCK 0X20
REG1
REG2
REG3
ENDC
Principal
ORG 0x05
COMIENZO
; Inicio de Programa
FSR # REG1
(FSR) D1
FSR FSR + 1
(FSR) D2
FSR FSR + 1
(FSR) D3
FSR FSR + 1
26
0x00
GOTO COMIENZO
MOVLW REG1
MOVWF FSR ; Cargas la direccin del Registro REG1 20H en el Puntero FSR.
MOVLW D'1'
MOVWF INDF ; Cargas donde apunta el Puntero (FSR) el dato 1. (20H) 1.
INCF FSR
; Incrementas el Puntero FSR 21H.
MOVLW D'2'
MOVWF INDF ; Cargas donde apunta el Puntero (FSR) el dato 2. (21H) 2.
INCF FSR
; Incrementas el Puntero FSR 22H.
MOVLW D'3'
MOVWF INDF ; Cargas donde apunta el Puntero (FSR) el dato 3. (22H) 3.
INCF FSR
; Incrementas el Puntero FSR 23H.
END
1.11.- Pagina1.asm
(Entrenador Bsico 0)
27
Diagrama de Flujo
Trabajar con la Pagina
1 de memoria de
Elegimos PIC
List p=16f877 , f=inhx32
Asignacin de nombres de
RFS a direcciones.
Subrutina Prueba
Pagina1
ORG 0800H
#include <p16f877.inc>
PORTC PORTB
; Igualdades
; Cambio a la Pgina0
; Registros
PCLATCH3 0
CBLOCK 0X20
ENDC
RETUR
N
Seccin de Configuracin
COMIENZO
RP0 1
TRISB 00000000 B
TRISC 11111111 B
RP0 0
ORG 0X05
; Ir al Banco 1
; Poner el Puerto B como
salida de datos.
; Poner el Puerto C como
entrada de datos.
; Ir al Banco 0
; Cambio a la Pgina1
PCLATCH3 1
PCLATCH4 0
PAGINA1
28
0x00
GOTO COMIENZO
BSF STATUS,RP0
MOVLW B'11111111'
MOVWF TRISC
CLRF TRISB
BCF STATUS,RP0
MOVF PORTC,W
MOVWF PORTB ;Ir a la Pagina0 de memoria de Programa
BCF PCLATH,3
RETURN
END
1.12.- RETARDO_1S.INC
(Entrenador Bsico 0)
29
EQU D'100'
DATO2
EQU D'100'
DATO3
EQU D'20'
MOVLW DATO3
MOVWF REG3
MOVLW DATO2
MOVWF REG2
MOVLW DATO1
MOVWF REG1
DECFSZ REG1,F
GOTO SEG5
DECFSZ REG2,F
GOTO SEG6
DECFSZ REG3,F
GOTO SEG7
RETURN
1.13.- RETARDOS.INC
(Entrenador Bsico 0)
30
;
; RETARDOS de 4 hasta 10 microsegundos ------------------------------------------------------------------;
; A continuacin retardos pequeos teniendo en cuenta que para una frecuencia de 4 MHZ,
; la llamada a subrutina "call" tarda 2 ciclos mquina, el retorno de subrutina
; "return" toma otros 2 ciclos mquina y cada instruccin "nop" tarda 1 ciclo mquina.
;
Retardo_10micros
; La llamada "call" aporta 2 ciclos mquina.
nop
; Aporta 1 ciclo mquina.
nop
; Aporta 1 ciclo mquina.
nop
; Aporta 1 ciclo mquina.
nop
; Aporta 1 ciclo mquina.
nop
; Aporta 1 ciclo mquina.
Retardo_5micros
; La llamada "call" aporta 2 ciclos mquina.
nop
; Aporta 1 ciclo mquina.
Retardo_4micros
; La llamada "call" aporta 2 ciclos mquina.
return
; El salto del retorno aporta 2 ciclos mquina.
;
; RETARDOS de 20 hasta 500 microsegundos ----------------------------------------------------------------;
Retardo_500micros
; La llamada "call" aporta 2 ciclos mquina.
nop
; Aporta 1 ciclo mquina.
movlw d'164'
; Aporta 1 ciclo mquina. Este es el valor de "K".
goto
RetardoMicros
; Aporta 2 ciclos mquina.
Retardo_200micros
; La llamada "call" aporta 2 ciclos mquina.
nop
; Aporta 1 ciclo mquina.
movlw d'64'
; Aporta 1 ciclo mquina. Este es el valor de "K".
goto
RetardoMicros
; Aporta 2 ciclos mquina.
Retardo_100micros
; La llamada "call" aporta 2 ciclos mquina.
movlw d'31'
; Aporta 1 ciclo mquina. Este es el valor de "K".
goto
RetardoMicros
; Aporta 2 ciclos mquina.
Retardo_50micros
; La llamada "call" aporta 2 ciclos mquina.
nop
; Aporta 1 ciclo mquina.
movlw d'14'
; Aporta 1 ciclo mquina. Este es el valor de "K".
goto
RetardoMicros
; Aporta 2 ciclos mquina.
Retardo_20micros
; La llamada "call" aporta 2 ciclos mquina.
31
movlw d'5'
; Aporta 1 ciclo mquina. Este es el valor de "K".
;
; El prximo bloque "RetardoMicros" tarda:
; 1 + (K-1) + 2 + (K-1)x2 + 2 = (2 + 3K) ciclos mquina.
;
RetardoMicros
movwf R_ContA
; Aporta 1 ciclo mquina.
Rmicros_Bucle
decfsz R_ContA,F
; (K-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto
Rmicros_Bucle
; Aporta (K-1)x2 ciclos mquina.
return
; El salto del retorno aporta 2 ciclos mquina.
;
;En total estas subrutinas tardan:
; - Retardo_500micros: 2 + 1 + 1 + 2 + (2 + 3K) = 500 cm = 500 s. (para K=164 y 4 MHz).
; - Retardo_200micros: 2 + 1 + 1 + 2 + (2 + 3K) = 200 cm = 200 s. (para K= 64 y 4 MHz).
; - Retardo_100micros: 2 + 1 + 2 + (2 + 3K) = 100 cm = 100 s. (para K= 31 y 4 MHz).
; - Retardo_50micros : 2 + 1 + 1 + 2 + (2 + 3K) = 50 cm = 50 s. (para K= 14 y 4 MHz).
; - Retardo_20micros : 2 + 1 + (2 + 3K) = 20 cm = 20 s. (para K= 5 y 4 MHz).
;
; RETARDOS de 1 ms hasta 200 ms. -----------------------------------------------------------------------------;
Retardo_200ms
; La llamada "call" aporta 2 ciclos mquina.
movlw d'200'
; Aporta 1 ciclo mquina. Este es el valor de "M".
goto
Retardos_ms
; Aporta 2 ciclos mquina.
Retardo_100ms
; La llamada "call" aporta 2 ciclos mquina.
movlw d'100'
; Aporta 1 ciclo mquina. Este es el valor de "M".
goto
Retardos_ms
; Aporta 2 ciclos mquina.
Retardo_50ms
; La llamada "call" aporta 2 ciclos mquina.
movlw d'50'
; Aporta 1 ciclo mquina. Este es el valor de "M".
goto
Retardos_ms
; Aporta 2 ciclos mquina.
Retardo_20ms
; La llamada "call" aporta 2 ciclos mquina.
movlw d'20'
; Aporta 1 ciclo mquina. Este es el valor de "M".
goto
Retardos_ms
; Aporta 2 ciclos mquina.
Retardo_10ms
; La llamada "call" aporta 2 ciclos mquina.
movlw d'10'
; Aporta 1 ciclo mquina. Este es el valor de "M".
goto
Retardos_ms
; Aporta 2 ciclos mquina.
Retardo_5ms
; La llamada "call" aporta 2 ciclos mquina.
movlw d'5'
; Aporta 1 ciclo mquina. Este es el valor de "M".
goto
Retardos_ms
; Aporta 2 ciclos mquina.
Retardo_2ms
; La llamada "call" aporta 2 ciclos mquina.
movlw d'2'
; Aporta 1 ciclo mquina. Este es el valor de "M".
goto
Retardos_ms
; Aporta 2 ciclos mquina.
Retardo_1ms
; La llamada "call" aporta 2 ciclos mquina.
movlw d'1'
; Aporta 1 ciclo mquina. Este es el valor de "M".
;
; El prximo bloque "Retardos_ms" tarda:
; 1 + M + M + KxM + (K-1)xM + Mx2 + (K-1)Mx2 + (M-1) + 2 + (M-1)x2 + 2 =
; = (2 + 4M + 4KM) ciclos mquina. Para K=249 y M=1 supone 1002 ciclos mquina
; que a 4 MHz son 1002 s = 1 ms.
;
Retardos_ms
movwf R_ContB
; Aporta 1 ciclo mquina.
R1ms_BucleExterno
movlw d'249'
; Aporta Mx1 ciclos mquina. Este es el valor de "K".
movwf R_ContA
; Aporta Mx1 ciclos mquina.
R1ms_BucleInterno
nop
; Aporta KxMx1 ciclos mquina.
decfsz R_ContA,F
; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
goto
R1ms_BucleInterno
; Aporta (K-1)xMx2 ciclos mquina.
decfsz R_ContB,F
; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
32
goto
R1ms_BucleExterno
return
;
;En total estas subrutinas tardan:
; - Retardo_200ms:
2 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. (M=200 y K=249).
; - Retardo_100ms:
2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms. (M=100 y K=249).
; - Retardo_50ms :
2 + 1 + 2 + (2 + 4M + 4KM) = 50007 cm = 50 ms. (M= 50 y K=249).
; - Retardo_20ms :
2 + 1 + 2 + (2 + 4M + 4KM) = 20007 cm = 20 ms. (M= 20 y K=249).
; - Retardo_10ms :
2 + 1 + 2 + (2 + 4M + 4KM) = 10007 cm = 10 ms. (M= 10 y K=249).
; - Retardo_5ms :
2 + 1 + 2 + (2 + 4M + 4KM) = 5007 cm = 5 ms. (M= 5 y K=249).
; - Retardo_2ms :
2 + 1 + 2 + (2 + 4M + 4KM) = 2007 cm = 2 ms. (M= 2 y K=249).
; - Retardo_1ms :
2 + 1 + (2 + 4M + 4KM) = 1005 cm = 1 ms. (M= 1 y K=249).
;
; RETARDOS de 0.5 hasta 20 segundos -------------------------------------------------------------------------;
Retardo_20s
; La llamada "call" aporta 2 ciclos mquina.
movlw d'200'
; Aporta 1 ciclo mquina. Este es el valor de "N".
goto
Retardo_1Decima
; Aporta 2 ciclos mquina.
Retardo_10s
; La llamada "call" aporta 2 ciclos mquina.
movlw d'100'
; Aporta 1 ciclo mquina. Este es el valor de "N".
goto
Retardo_1Decima
; Aporta 2 ciclos mquina.
Retardo_5s
; La llamada "call" aporta 2 ciclos mquina.
movlw d'50'
; Aporta 1 ciclo mquina. Este es el valor de "N".
goto
Retardo_1Decima
; Aporta 2 ciclos mquina.
Retardo_2s
; La llamada "call" aporta 2 ciclos mquina.
movlw d'20'
; Aporta 1 ciclo mquina. Este es el valor de "N".
goto
Retardo_1Decima
; Aporta 2 ciclos mquina.
Retardo_1s
; La llamada "call" aporta 2 ciclos mquina.
movlw d'10'
; Aporta 1 ciclo mquina. Este es el valor de "N".
goto
Retardo_1Decima
; Aporta 2 ciclos mquina.
Retardo_500ms
; La llamada "call" aporta 2 ciclos mquina.
movlw d'5'
; Aporta 1 ciclo mquina. Este es el valor de "N".
;
; El prximo bloque "Retardo_1Decima" tarda:
; 1 + N + N + MxN + MxN + KxMxN + (K-1)xMxN + MxNx2 + (K-1)xMxNx2 +
; + (M-1)xN + Nx2 + (M-1)xNx2 + (N-1) + 2 + (N-1)x2 + 2 =
; = (2 + 4M + 4MN + 4KM) ciclos mquina. Para K=249, M=100 y N=1 supone 100011
; ciclos mquina que a 4 MHz son 100011 s = 100 ms = 0,1 s = 1 dcima de segundo.
;
Retardo_1Decima
movwf R_ContC
; Aporta 1 ciclo mquina.
R1Decima_BucleExterno2
movlw d'100'
; Aporta Nx1 ciclos mquina. Este es el valor de "M".
movwf R_ContB
; Aporta Nx1 ciclos mquina.
R1Decima_BucleExterno
movlw d'249'
; Aporta MxNx1 ciclos mquina. Este es el valor de "K".
movwf R_ContA
; Aporta MxNx1 ciclos mquina.
R1Decima_BucleInterno
nop
; Aporta KxMxNx1 ciclos mquina.
decfsz R_ContA,F
; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar).
goto
R1Decima_BucleInterno
; Aporta (K-1)xMxNx2 ciclos mquina.
decfsz R_ContB,F
; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar).
goto
R1Decima_BucleExterno
; Aporta (M-1)xNx2 ciclos mquina.
decfsz R_ContC,F
; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto
R1Decima_BucleExterno2
; Aporta (N-1)x2 ciclos mquina.
return
; El salto del retorno aporta 2 ciclos mquina.
;
;En total estas subrutinas tardan:
; - Retardo_20s:
2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 20000807 cm = 20 s.
;
(N=200, M=100 y K=249).
33
; - Retardo_10s:
;
; - Retardo_5s:
;
; - Retardo_2s:
;
; - Retardo_1s:
;
; - Retardo_500ms:
;
;
;
;
;
;
===================================================================
Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
E. Palacios, F. Remiro y L. Lpez.
Editorial Ra-Ma. www.ra-ma.es
===================================================================
34
35
2.1.- Ejemplo6.asm
(Entrenador Bsico 1)
Diagrama de Flujo
Encender displays
dependiendo de PC0
Elegimos PIC
List p=16f877 , f=inhx32
Asignacin de nombres de
RFS a direcciones.
#include <p16f877.inc>
; Igualdades
; Registros
CBLOCK 0X20
ENDC
Seccin de Configuracin
COMIENZO
RP0 1
TRISD 00000000 B
TRISC (0) 1
ORG 0X05
; Ir al Banco 1
; Poner el Puerto D como
salida de datos.
; Poner PC0 como entrada de
Datos
ADCON1 00000110 B ; Configuro las patillas de los
PUERTOS A y D como seales
digitales.
TRISE 00000000 B
RP0 0
PORTD 11111111 B
SI
PCO =
1?
NO
; Encender Display de UNIDADES
PORTE 00000001 B
36
0x00
GOTO COMIENZO
BCF STATUS,RP1
; Selecciono la pagina 1 de la memoria
BSF STATUS,RP0
MOVLW B'00000000' ; Configuro el PD como salidas.
MOVWF TRISD
BSF TRISC,0
CLRF PORTE
; Configuro el PE como salidas.
BCF STATUS,RP0
; Selecciono la pagina 0 de la memoria
MOVLW B'11111111'
MOVWF PORTD
BTFSS PORTC,0
GOTO DECENAS
MOVLW B'00000001'
MOVWF PORTE
GOTO SEG1
MOVLW B'00000010'
MOVWF PORTE
GOTO SEG1
37
END
2.2.- Ejemplo7.asm
(Entrenador Bsico 1)
1
Diagrama de Flujo
CONTADOR 00000001 B
Contar pulsos
procedentes de PC0 y
llevarlos al Display de
PORTE 00000001 B
Elegimos PIC
List p=16f877 , f=inhx32
NO
PCO = 0?
Asignacin de nombres de
RFS a direcciones.
#include <p16f877.inc>
; Igualdades
NMAYOR EQU
SI
W CONTADOR
0X0A
TABLA
; Registros
CONTADOR 00000000 B
CBLOCK 0X20
PORT D W
CONTADOR
CONTADOR CONTADOR +1
ENDC
SI
Seccin de Configuracin
COMIENZO
RP0 1
TRISD 00000000 B
TRISC (0) 1
CONTADOR =
NMAYOR ?
ORG 0X05H
; Ir al Banco 1
; Poner el Puerto D como
salida de datos.
; Poner PC0 como entrada de
Datos
ADCON1 00000110 B ; Configuro las patillas de los
PUERTOS A y D como seales
digitales.
TRISE 00000000 B ; Poner el Puerto E como
salida de datos.
RP0 0
; Ir al Banco 0
NO
Subrutina
TABLA
PCL PCL + W
RETLW B'00111111'
00H
RETLW B'00000110'
01H
RETLW B'01011011'
02H
RETLW B'01001111'
03H
RETLW B'01100110'
04H
1
38
title " Contar pulsos procedentes de PC0 y llevarlos al Display de Unidades "
EQU 0X0A
00h
GOTO COMIENZO
BSF STATUS,RP0
CLRF TRISD
MOVLW 0X06
MOVWF ADCON1
CLRF TRISE
BSF PORTC,0
BCF STATUS,RP0
CLRF CONTADOR
MOVLW B'00111111'
MOVWF PORTD
39
INCF CONTADOR
MOVLW B'00000001'
MOVWF PORTE
;*************************** Principal *****************************************************************************
SEGUIR
BTFSC PORTC,0
GOTO SEGUIR
MOVF CONTADOR,W
CALL TABLA
SEG1
INCF CONTADOR,F
MOVWF PORTD
MOVF CONTADOR,W
XORLW NMAYOR
BTFSS STATUS,Z
GOTO SEG1
CLRF CONTADOR
BTFSS PORTC,0
GOTO SEG1
GOTO SEGUIR
ADDWF PCL,F
RETLW B'00111111'
RETLW B'00000110'
RETLW B'01011011'
RETLW B'01001111'
RETLW B'01100110'
RETLW B'01101101'
RETLW B'01111101'
RETLW B'00000111'
RETLW B'01111111'
RETLW B'01101111'
END
40
2.3.- Ejemplo8.asm
(Entrenador Bsico 1)
Diagrama de Flujo
1
Contar pulsos
procedentes de PC0 y
llevarlos al Display de
Unidades y Decenas
Seccin de Configuracin
COMIENZO
; Ir al Banco 1
Elegimos PIC
List p=16f877 , f=inhx32
Asignacin de nombres de
RFS a direcciones.
#include <p16f877.inc>
; Igualdades
NMAYOR
RP0 1
ORG 0X05H
EQU D100
MOSTRAR_DISPLAY
; Registros
CBLOCK 0X20
CONTADOR
NO
PCO = 0?
DISPLAY
UNIDADES
DECENAS
CENTENAS
SI
PULSOS CONTADOR
DIVIDENDO
DIVISOR
COCIENTE
RESTO
CONTADOR CONTADOR +1
ENDC
N0
CONTADOR =
NMAYOR ?
SI
CONTADOR 00000000 B
1
MOSTRAR_DISPLAY
SI
NO
PCO = 1?
41
Subrutina de
MOSTRAR_DISPLAY
Subrutina de
BIN_BCD
BIN_BCD
DIVISOR D100
W PULSOS
W UNIDADES
BCD_7SEG
PORTD W
DIVIDIR
CENTENAS COCIENTE
PORTE 00000001 B
DIVISOR D10
; Temporizar. Perder tiempo con dos NOP
W RESTO
; Deshabilitar display de las UNIDADES y DECENAS
PORTE 00000000 B
DIVIDIR
DECENAS COCIENTE
W DECENAS
BCD_7SEG
PORTD W
UNIDADES RESTO
RETUR
N
PORTE 00000010 B
Subrutina de
DIVIDIR
COCIENTE 00000000 B
PORTE 00000000 B
DIVIDENDO W
RETUR
N
RESTO DIVIDENDO
Subrutina BCD_7SEG
DIVIDENDO DIVIDENDO - DIVISOR
PCL PCL + W
SI
DIVIDENDO <
0?
RETLW B'00111111'
RETLW B'00000110'
RETLW B'01011011'
RETLW B'01001111'
RETLW B'01100110'
RETLW B'01101101'
RETLW B'01111101'
RETLW B'00000111'
RETLW B'01111111'
NO
COCIENTE COCIENTE + 1
RETURN
42
EQU
D'100'
GOTO COMIENZO
BSF STATUS,RP0
MOVLW 0X06
43
MOVWF ADCON1
CLRF TRISD
CLRF TRISE
MOVLW B'11111111'
MOVWF TRISC
BCF STATUS,RP0
CLRF PULSOS ;
CALL MOSTRAR_DISPLAY
BTFSC PORTC,0
GOTO SEGUIR
MOVF CONTADOR,W
MOVWF PULSOS
INCF CONTADOR,F
MOVF CONTADOR,W
XORLW NMAYOR
BTFSS STATUS,Z
GOTO SEG1
CLRF CONTADOR
SEG1
CALL MOSTRAR_DISPLAY
BTFSS PORTC,0
GOTO SEG1
GOTO SEGUIR
ADDWF PCL,F
RETLW B'00111111'
RETLW B'00000110'
RETLW B'01011011'
RETLW B'01001111'
RETLW B'01100110'
RETLW B'01101101'
RETLW B'01111101'
RETLW B'00000111'
RETLW B'01111111'
RETLW B'01101111'
CALL BIN_BCD
MOVF UNIDADES,W
CALL BCD_7SEG
MOVWF PORTD
MOVLW B'00000001'
MOVWF PORTE
NOP
NOP
MOVLW B'00000000'
MOVWF PORTE
44
NOP
NOP
MOVF DECENAS,W
CALL BCD_7SEG
MOVWF PORTD
MOVLW B'00000010'
MOVWF PORTE
NOP
NOP
MOVLW B'00000000'
MOVWF PORTE
NOP
NOP
RETURN
;***************************** Subrutina de Binario a BCD ********************************************************
BIN_BCD
seg3
clrf COCIENTE
movwf DIVIDENDO
movf DIVIDENDO,w
movwf RESTO
movf DIVISOR,w
subwf DIVIDENDO,f
btfss STATUS,C
goto seg3
incf COCIENTE
goto seg2
RETURN
END
45
46
3.1.- Ejemplo9.asm
(Entrenador Bsico 2)
Diagrama de Flujo
Contar pulsos
procedentes de PC0 y
llevarlos al Display de
Unidades y Decenas
1
Seccin de Configuracin
COMIENZO
RP0 1
ORG 0X05H
; Ir al Banco 1
Elegimos PIC
List p=16f877 , f=inhx32
Asignacin de nombres de
RFS a direcciones.
TRISC 11111111 B
#include <p16f877.inc>
EQU D100
CONTADOR CONTADOR +1
; Registros
RP0 0
; Ir al Banco 0
CBLOCK 0X20
CONTADOR
DISPLAY
NO
PCO = 0?
UNIDADES
DECENAS
CENTENAS
SI
DIVIDENDO
DIVISOR
COCIENTE
RESTO
PULSOS CONTADOR
ENDC
MOSTRAR_DISPLAY
CONTADOR CONTADOR +1
ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa
N0
CONTADOR =
NMAYOR ?
SI
CONTADOR 00000000 B
SI
NO
PCO = 1?
47
Subrutina de
BIN_BCD
Subrutina de
MOSTRAR_DISPLAY
DIVISOR D100
BIN_BCD
W PULSOS
W UNIDADES
DIVIDIR
BCD_7SEG
CENTENAS COCIENTE
PORTD W
DIVISOR D10
W DECENAS
W RESTO
BCD_7SEG
DIVIDIR
PORTB W
DECENAS COCIENTE
RETUR
N
UNIDADES RESTO
RETUR
N
Subrutina
BCD_7SEG
PCL PCL + W
Subrutina de
DIVIDIR
RETLW B'00111111'
00H
RETLW B'00000110'
01H
RETLW B'01011011'
02H
RETLW B'01001111'
03H
RETLW B'01100110'
DIVIDENDO W
RESTO DIVIDENDO
RETURN
48
EQU
D'100'
GOTO COMIENZO
COMIENZO
ORG 05h
BSF STATUS,RP0
MOVLW 0X06
49
MOVWF ADCON1
CLRF TRISD
CLRF TRISE
CLRF TRISB
MOVLW B'11111111'
MOVWF TRISC
BCF STATUS,RP0
CLRF CONTADOR
MOVLW B'00111111'
MOVWF PORTD
MOVWF PORTB
MOVLW B'00000011'
MOVWF PORTE
INCF CONTADOR
SEG1
BTFSC PORTC,0
GOTO SEGUIR
MOVF CONTADOR,W
MOVWF PULSOS
CALL MOSTRAR_DISPLAY ; Mostramos los datos en los Displays
INCF CONTADOR,F
; Incrementamos el CONTADOR de Pulsos.
MOVF CONTADOR,W
XORLW NMAYOR
; Preguntamos si hemos llegado al mximo pulso a contar.
BTFSS STATUS,Z
GOTO SEG1
CLRF CONTADOR
; Reseteamos CONTADOR
BTFSS PORTC,0
; Preguntamos si sigue pulsado PC0
GOTO SEG1
GOTO SEGUIR
50
movf RESTO,w
movwf UNIDADES
RETURN
;****************************** Subrutina de Dividir **************************************************************
DIVIDIR
seg2
seg3
clrf COCIENTE
movwf DIVIDENDO
movf DIVIDENDO,w
movwf RESTO
movf DIVISOR,w
subwf DIVIDENDO,f
btfss STATUS,C
goto seg3
incf COCIENTE
goto seg2
RETURN
ADDWF PCL,F
RETLW B'00111111'
RETLW B'00000110'
RETLW B'01011011'
RETLW B'01001111'
RETLW B'01100110'
RETLW B'01101101'
RETLW B'01111101'
RETLW B'00000111'
RETLW B'01111111'
RETLW B'01101111'
END
51
52
4.1.- PWM_1.asm
Diagrama de Flujo
1
Control de un
Servomotor de
Posicin con PWM
a travs del Puerto
Elegimos PIC
List p=16f876 , f=inhx32
Asignacin de nombres de
RFS a direcciones.
#include <p16f876.inc>
Retardo 20ms
; Igualdades
PERIODO
EQU D255
; Registros
CBLOCK 0X20
ENDC
Seccin de Configuracin
COMIENZO
RP0 1
TRISB 11111111 B
TRISC (2) 0
PR2 #PERIODO
RP0 0
ORG 0X05H
; Ir al Banco 1
; Poner Puerto B como entrada
de datos
;Habilitamos PC2 como salida
para atacar el Servomotor 1.
; Cargamos el Periodo de la
seal de PWM
; Ir al Banco 0
T2CON 00000111 B
; Cargamos el valor preescalar
del PWM Interno, para fijar el periodo.
CCP1CON 00001100 B ;Cargamos los 2 BIT menos significativos
del nivel alto de la Seal PWM y
configuramos y lanzamos PWM.
Salida de seal por RC2
53
title " Control de un Servomotor de Posicin con PWM a travs del Puerto B "
;Programa para PIC 16F876a.
;Velocidad del Reloj = 1 MHz.
;Reloj instruccin: 250 kHz = 4 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;**************************** Elegimos PIC **********************************************************************
list p=16f876, f=inhx32
;*************** Asignacin de etiquetas de Registros de Funciones especiales a direcciones ***********
#include <p16f876.inc> ; Este fichero contiene los nombres y direcciones de los
; registros de funciones especiales.
; Este fichero esta localizado en el directorio
; con el nombre MPASM.
;**************************** Igualdades *************************************************************************
PERIODO
EQU 0xFF
0X00
GOTO COMIENZO
BSF STATUS,RP0
BCF STATUS,RP1
MOVLW B'11111111'
MOVWF TRISB
BCF TRISC,2
MOVLW PERIODO
MOVWF PR2
BCF STATUS,RP0
MOVLW B'00000111'
MOVWF T2CON
MOVLW B'00001100'
MOVWF CCP1CON
;Inicio de Programa
;(Una posicin detrs del vector de Interrupcin).
; Banco1
COMF PORTB,W
MOVWF CCPR1L
CALL Retardo_20ms
GOTO SEG1
;************************** Librerias *******************************************************************************
INCLUDE <RETARDOS.INC>
END
54
4.2.- PWM_CAD.asm
Diagrama de Flujo
1
Seccin de Configuracin
Control de un
Servomotor de Posicin
con PWM a travs de un
Potencimetro
COMIENZO
ORG 0X05H
RP0 1
; Ir al Banco 1
TRISB 00000000 B
Elegimos PIC
List p=16f876 , f=inhx32
TRISA (5) 1
ADCON1 00000000
RP0 0
ADCON0 00100001
RP0 1
; Ir al Banco 0
; Ir al Banco 1
TRISC (2) 0
PR2 #PERIODO
; Cargamos el Periodo de la
seal de PWM
; Ir al Banco 0
#include <p16f876.inc>
RP0 0
; Igualdades
PERIODO
EQU D255
; Representa el Periodo de
la seal de PWM.
T2CON 00000111 B
; Cargamos el valor preescalar
del PWM Interno, para fijar el periodo.
CCP1CON 00001100 B ;Cargamos los 2 BIT menos significativos
del nivel alto de la Seal PWM y
configuramos y lanzamos PWM.
Salida de seal por RC2
; Registros
CBLOCK 0X20
ENDC
Retardo_20ms
NO
GO_DONE = 0
?
SI
; Cargamos el registro que contiene el dato
digital, en el registro que contiene el nivel alto
de la seal de PWM.
CCPR1L ADRESH
55
EQU 0xFF
0X00
GOTO COMIENZO
BSF STATUS,RP0
BCF STATUS,RP1
;Inicio de Programa
;(Una posicin detrs del vector de Interrupcin).
;Banco1
MOVLW B'00000000'
MOVWF TRISB
BSF TRISA,5
MOVLW B'00000000'
MOVWF ADCON1
BCF STATUS,RP0
MOVLW B'00100001'
MOVWF ADCON0
BSF STATUS,RP0
56
BCF TRISC,2
MOVLW PERIODO
MOVWF PR2
BCF STATUS,RP0
MOVLW B'00000111'
MOVWF T2CON
MOVLW B'00001100'
MOVWF CCP1CON
CALL Retardo_20ms
57
58
5.1.- Ejempl10.asm
( Entrenador Bsico 3 )
1
Diagrama de Flujo
Seccin de Configuracin
COMIENZO
RP0 1
ORG 0X05H
; Ir al Banco 1
TRISB 00000001 B
Interrupcin
Externa
Elegimos PIC
List p=16f876 , f=inhx32
Asignacin de nombres de
RFS a direcciones.
#include <p16f877.inc>
CONTADOR 00000000 B
; Igualdades
; Cargar el Puntero
TABLAD = 40
NDATOS = 8
NDATOS1 = D10
TIEMPOH = 0XC0
TIEMPOL = 0X00
FSR #TABLAD
W CONTADOR
TABLA
; Registros
CBLOCK 0X20
CONTADOR
W_TEMP
STATUS_TEMP
PIR1_TEMP
PORTB_TEMP
TMR1H_TEMP
TMR1L_TEMP
T1CON_TEMP
CONTADOR1
(FSR) W
PORTC W
ENDC
TIEMPO
ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa
FSR FSR +1
Vector de Interrupcin
; Incrementar CONTADOR
ORG 04H
GOTO INTERRU
CONTADOR CONTADOR +1
NO
SI
CONTADOR =
NDATOS ?
59
Rutina de Interrupcin
INTERRU
Subrutina de TABLA
NO
INTF = 1?
PCL PCL + W
SI
RETFI
E
; Salvar Registros
W W_TEMP
STATUS STATUS_TEMP
PIR1_TEMP PIR1
PORTB_TEMP PORTB
TMR1H_TEMP TMR1H
TMR1L_TEMP TMR1L
T1CON_TEMP T1CON
RETLW B'11111110'
RETLW B'11111101'
RETLW B'11111011'
RETLW B'11110111'
RETLW B'11101111'
RETLW B'11011111'
RETLW B'10111111'
; Resetear CONTADOR1
Subrutina de
TIEMPO
CONTADOR1 00000000 B
TIEMPO
T1CON 00110001 B
; Limpiar el Puerto B
PORTB 00000000 B
TMR1IF =
1?
NO
SI
TIEMPO
; Borrar Flag
TMR1IF 0
TIEMPO
; Incrementar CONTADOR1
RETURN
CONTADOR1 CONTADOR1 +1
NO
RETFIE
CONTADOR1
= NDATOS1 ?
; Recuperar Registros
SI
; Borrar Flag de la INT
INTF 0
T1CON T1CON_TEMP
TMR1L TMR1L_TEMP
TMR1H TMR1H_TEMP
PORTB PORTB_TEMP
PIR1 PIR1_TEMP
STATUS STATUS_TEMP
W W_TEMP
60
EQU 40
NDATOS EQU 8
NDATOS1 EQU 0A
TIEMPOH EQU 0XC0
TIEMPOL EQU 0X00
;***************************** Registros *************************************************************************
CBLOCK 0X20
CONTADOR
W_TEMP
STATUS_TEMP
PIR1_TEMP
PORTB_TEMP
TMR1H_TEMP
TMR1L_TEMP
T1CON_TEMP
CONTADOR1
ENDC
;**************************** Seccin Cdigo de Reset ********************************************************
ORG
00h
GOTO COMIENZO
61
BSF STATUS,RP0
; Selecciono la pagina 1 de la memoria
MOVLW 0X01
MOVWF TRISB
BCF TRISE,2
CLRF TRISC
BCF OPTION_REG,INTEDG
BCF STATUS,RP0
; Selecciono la pagina 0 de la memoria
CLRF PORTB
BSF PORTE,2
MOVLW B10010000
MOVWF INTCON
CLRF CONTADOR
MOVLW TABLAD
MOVWF FSR
SEGUIR
MOVF CONTADOR,W
CALL TABLA
MOVWF INDF
MOVWF PORTC
CALL TIEMPO
INCF FSR
INCF CONTADOR
MOVF CONTADOR,W
XORLW NDATOS
BTFSC STATUS,Z
GOTO RESETEO
GOTO SEGUIR
ADDWF PCL,F
RETLW B'11111110'
RETLW B'11111101'
RETLW B'11111011'
RETLW B'11110111'
RETLW B'11101111'
RETLW B'11011111'
RETLW B'10111111'
RETLW B'01111111'
62
MOVLW TIEMPOH
MOVWF TMR1H
MOVLW TIEMPOL
MOVWF TMR1L
MOVLW B00110001
MOVWF T1CON
SEG1
BTFSS PIR1,TMR1IF
GOTO SEG1
BCF PIR1,TMR1IF
RETURN
BTFSS INTCON,INTF
RETFIE
MOVWF W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP
MOVF PIR1,W
MOVWF PIR1_TEMP
MOVF PORTB,W
MOVWF PORTB_TEMP
MOVF TMR1H,W
MOVWF TMR1H_TEMP
MOVF TMR1L,W
MOVWF TMR1L_TEMP
MOVF T1CON,W
MOVWF T1CON_TEMP
CLRF CONTADOR1
SEGUIR1
MOVLW B00001110
MOVWF PORTB
CALL TIEMPO
CALL TIEMPO
CLRF PORTB
CALL TIEMPO
CALL TIEMPO
INCF CONTADOR1
MOVF CONTADOR1,W
XORLW NDATOS1
BTFSC STATUS,Z
GOTO SEGUIR2
GOTO SEGUIR1
SEGUIR2
BCF INTCON,INTF
MOVF T1CON_TEMP,W
MOVWF T1CON
MOVF TMR1L_TEMP,W
MOVWF TMR1L
MOVF TMR1H_TEMP,W
MOVWF TMR1H
MOVF PORTB_TEMP,W
MOVWF PORTB
MOVF PIR1_TEMP,W
MOVWF PIR1
SWAPF STATUS_TEMP,W
MOVWF STATUS
63
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
END
5.2.- Ejemp_11.asm
( Entrenador Bsico 3 )
1
Diagrama de Flujo
Seccin de Configuracin
COMIENZO
Conversin
Analgica / Digital
Elegimos PIC
List p=16f877 , f=inhx32
Asignacin de nombres de
RFS a direcciones.
#include <p16f877.inc>
RP0 1
ORG 0X05H
; Ir al Banco 1
TRISA (0) 1
; Poner PORTA(0) como entrada.
TRISE(2) 1
;Poner PORTE(2)como salida de datos.
TRISB 00000000 B
; Poner Puerto B como salida
de dato
TRISC 00000000 B
; Poner Puerto C como salida
de dato
ADCON1 00001110 B ;Seleccionar PA0 como entrada analgica
;Los 8 BIT mas significativos se quedan en
ARDES y los 2 BIT memos significativos se
quedan en ADRESL.
RP0 0
; Ir al Banco 0
ADCON0 00000001B ; Elegimos PA0 y habilitamos el Conversor
PORTC 11111111 B ;Apagar Leds del PUERTO C
PORTE(2) 1
; Igualdades
Retardo_10micros
Retardo_10micros
; Registros
CBLOCK 0X20
ENDC
NO
GO_DONE = 0
?
SI
; Cargamos los 8 bits ms significativos que
estn en ADRESH en el Puerto B
PORTB ADRESH
64
00h
GOTO COMIENZO
BSF STATUS,RP0
BSF TRISA,0
BCF TRISE,2
CLRF TRISB
CLRF TRISC
MOVLW B'00001110'
MOVWF ADCON1
BCF STATUS,RP0
MOVLW B'11111111'
MOVWF PORTC
BSF PORTE,2
MOVLW B'00000001'
MOVWF ADCON0
;Ir al Banco 1
;Poner PORTA(0)como entrada.
;Poner PORTE(2)como salida de datos.
;Poner PORTB como salida de datos.
;Poner PORTC como salida de datos.
;Seleccionar PA0 como entrada analgica
;Los 8 BIT mas significativos se quedan en ADRESH.
;Los 2 BIT memos significativos se quedan en ADRESL.
;Ir al Banco 0
;Apagar Leds del PUERTO C
;Elegimos PA0 y habilitamos el Conversor
BSF ADCON0,GO_DONE
;Lanzamos el Conversor
65
SEG1
CALL Retardo_10micros
CALL Retardo_10micros
BTFSC ADCON0,GO_DONE
GOTO SEG1
MOVF ADRESH,W
MOVWF PORTB
BSF STATUS,RP0
COMF ADRESL,W
BCF STATUS,RP0
MOVWF PORTC
GOTO SEG2
5.3.- Ejemp_12.asm
( Entrenador Bsico 3 )
Diagrama de Flujo
1
Contar pulsos del
exterior utilizando
el TIMER0
Seccin de Configuracin
COMIENZO
Elegimos PIC
List p=16f877 , f=inhx32
Asignacin de nombres de
RFS a direcciones.
#include <p16f877.inc>
; Igualdades
ORG 0X05H
RP0 1
; Ir al Banco 1
TRISB 00000000 B
; Poner Puerto B como salida
de dato
ADCON1 00000110 B ; Seleccionar PORTA y PORTE como
entrada digitales.
TRISA (4) 1
; Poner PORTA(4) como entrada.
OPTION_REG B'00111000' ; Configurar el TIMER0 como contador
de pulsos y la cuenta se realiza por
flanco de bajada en la patilla
R4/T0CKI y sin preescalar.
TRISE 00000000 B
; Poner Puerto E como salida
de dato
RP0 0
; Ir al Banco 0
PORTB 00000000 B ;Apagar Leds del PUERTO B
PORTE(2) 1
;Habilitar los Leds del Puerto B
NDATOS = D'15'
; Cargar la cuenta inicial en el registro TMR0
; Registros
TMR0 D00
CBLOCK 0X20
ENDC
NO
TMR0 = NDATOS
?
SI
1
FIN
66
title " Contar pulsos del exterior utilizando un Temporizador TIMER 0 "
;Programa para PIC 16F877.
;Velocidad del Reloj:4 MHz.
;Reloj instruccin: 1 MHz = 1 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;**************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;**************************** Asignacin de Registros de Funciones especiales a direcciones ***********
#include <p16f877.inc>
EQU D'15'
BSF STATUS,RP0
CLRF TRISB
MOVLW B'00000110'
MOVWF ADCON1
MOVLW 0x10
MOVWF TRISA
MOVLW B'00111000'
MOVWF OPTION_REG
CLRF TRISE
BCF STATUS,RP0
CLRF PORTB
BSF PORTE,2
MOVLW D00
MOVWF TMR0
SEGUIR1
MOVF TMR0,W
MOVWF PORTB
XORLW NDATOS
BTFSC STATUS,Z
GOTO FINAL
GOTO SEGUIR1
FINAL
GOTO FINAL
67
5.4.- Ejemp_13.asm
( Entrenador Bsico 3 )
Diagrama de Flujo
1
Transferir una Tabla de datos de
memoria EPROM a RAM y Puerto
B
utilizando como subrutina de
tiempo el TIMER0 y el
W CONTADOR
TABLA
Elegimos PIC
List p=16f877 , f=inhx32
Asignacin de nombres de
RFS a direcciones.
;Cargar el Acumulador
donde apunta el
puntero FSR
(FSR) W
#include <p16f877.inc>
;Cargar el Acumulador
en el PORTB.
; Igualdades
PORTB W
TABLAD = 30H
NDATOS = D05
TIEMPO1 = D'00'
TIEMPO2 = D'20'
;Cargar el registro
CONT_TI con el dato
TIEMPO2
; Registros
CONT_TI #TIEMPO2
CBLOCK 0X20
CONTADOR
CONT_TI
ENDC
TIEMPO
CONT_TI CONT_TI -1
Seccin de Configuracin
COMIENZO
ORG 0X05H
RP0 1
; Ir al Banco 1
TRISB 00000000 B
; Poner Puerto B como salida
de dato
ADCON1 00000110 B ; Seleccionar PORTA y PORTE como
entrada digitales.
TRISE 00000000 B
; Poner Puerto E como salida
de dato
OPTION_REG B'00000111' ; Configurar el TIMER0 como
Temporizador y con preescalar
de 256.
RP0 0
; Ir al Banco 0
PORTB 00000000 B ;Apagar Leds del PUERTO B
PORTE(2) 1
;Habilitar los Leds del Puerto B
CONTADOR 00000000B ; Limpiar CONTADOR.
FSR #TABLAD ; Cargar el Puntero.
CON_TI =
0?
NO
SI
; Incrementar Puntero
FSR FSR +1
; Incrementar CONTADOR
CONTADOR CONTADOR +1
CONTADOR = NDATOS
?
NO
SI
FIN
68
Subrutina de TIEMPO
Subrutina de TABLA
PCL PCL + W
TMR0 #TIEMPO1
NO
T0IF = 1 ?
RETLW B'00000010'
RETLW B'00000100'
RETLW B'00001000'
RETLW B'00000100'
RETLW B'00000010'
SI
; Borrar flag
T0IF 0
RETURN
title " Transferir una Tabla de datos de memoria EPROM a RAM y Puerto B
title " utilizando como subrutina de tiempo el TIMER 0 "
title " direccionamiento indirecto "
;Programa para PIC 16F877.
;Velocidad del Reloj:20 MHz.
;Reloj instruccin: 1 MHz = 200 nS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;**************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;************ Asignacin de etiquetas de Registros de Funciones especiales a direcciones ************
#include <p16f877.inc> ; Este fichero contiene los nombres y direcciones de los
; registros de funciones especiales.
; Este fichero esta localizado en el directorio
; con el nombre MPASM.
;**************************** Igualdades ***********************************************************************
TABLAD
EQU 30H
NDATOS
EQU 5
TIEMPO1
TIEMPO2
EQU D'00'
EQU D'20'
69
CBLOCK 0X20
CONTADOR
CONT_TI
ENDC
;**************************** Seccin Cdigo de Reset ******************************************************
ORG
00h
GOTO COMIENZO
BSF STATUS,RP0
CLRF TRISB
MOVLW B'00000110'
MOVWF ADCON1
CLRF TRISE
MOVLW B'00000111'
MOVWF OPTION_REG
BCF STATUS,RP0
CLRF PORTB
BSF PORTE,2
CLRF CONTADOR
MOVLW TABLAD
MOVWF FSR
SEG2
MOVF CONTADOR,W
CALL TABLA
MOVWF INDF
MOVWF PORTB
MOVLW TIEMPO2
MOVWF CONT_TI
CALL TIEMPO
DECFSZ CONT_TI,F
GOTO SEG2
INCF FSR
INCF CONTADOR
MOVF CONTADOR,W
XORLW NDATOS
BTFSC STATUS,Z
GOTO $
GOTO SEGUIR
;Parar.
70
TABLA
ADDWF PCL,F
RETLW 01H
RETLW 02H
RETLW 04H
RETLW 08H
RETLW 04H
RETLW 02H
MOVLW TIEMPO1
MOVWF TMR0
BTFSS INTCON,T0IF
GOTO SEG1
BCF INTCON,T0IF
RETURN
END
5.5.- Ejemp_14.asm
( Entrenador Bsico 3 )
Diagrama de Flujo
DIGITO 00000000 B
W DIGITO
ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa
Elegimos PIC
List p=16f877 , f=inhx32
;Cargar datos de la subrutina
TABLA
Seccin de Configuracin
Asignacin de nombres de
RFS a direcciones.
COMIENZO
#include
<p16f877.inc>
;Subrutina
que detecta
el nmero
mayor
DE_MAYOR
; Igualdades
;Incrementar
el registro
N_DATOS
= D5 DIGITO
; Asignamos el
Nmero de
DIGITO DIGITO +1
datos de la
tabla
ORG 0X05H
RP0 1
; Ir al Banco 1
TRISB 00000000 B
; Poner Puerto B como salida
de dato
ADCON1 00000110 B ; Seleccionar PORTA y PORTE como
entrada digitales.
TRISE 00000000 B
; Poner Puerto E como salida
de dato
RP0 0
; Ir al Banco 0
PORTB 00000000 B
PORTE(2) 1
2
NO
Subrutina de TABLA
SI
PCL PCL + W
FIN
RETLW 3FH
RETLW 06H
RETLW 5BH
RETLW 4FH
RETLW 06H
71
Subrutina de detectar el
nmero mayor de una tabla
DE_MAYOR
REGISTRO >
SI
NO
MAYOR REGISTRO
RETURN
EQU D'5'
ENDC
;**************************** Seccin Cdigo de Reset *******************************************************
ORG
00h
GOTO COMIENZO
BSF STATUS,RP0
CLRF TRISB
MOVLW B00000110
MOVWF ADCON1
CLRF TRISE
BCF STATUS,RP0
CLRF PORTB
BSF PORTE,2
SEGUIR
MOVF DIGITO,W
73
CALL TABLA
CALL DE_MAYOR
INCF DIGITO,F
MOVF DIGITO,W
XORLW N_DATOS
BTFSS STATUS,Z
GOTO SEGUIR
PARAR
MOVF MAYOR,W
MOVWF PORTB
GOTO PARAR
ADDWF PCL,F
RETLW 3FH
RETLW 06H
RETLW 5BH
RETLW 4FH
RETLW 06H
RETORNO
MOVWF REGISTRO
SUBWF MAYOR,W
; W F-W
BTFSC STATUS,C
GOTO RETORNO
MOVF REGISTRO,W
MOVWF MAYOR
RETURN
END
74
75
6.1.- T_S_A.asm
( Entrenador Bsico 4 )
Diagrama de Flujo
Transmisin Serie
Asncrona
Elegimos PIC
List p=16f876 , f=inhx32
Asignacin de nombres de
RFS a direcciones.
#include <p16f876.inc>
DATO_ANTERIOR PORTB
; Igualdades
;Comienzo de la transmisin
de los datos serie
NUMERO_TRANSMISIONES = D5
TXREG PORTB
; Registros
CBLOCK 0X20
Ha terminado
la transmisin ?
CONTADOR
DATO_ANTERIOR
ENDC
NO
TRMT = 1 ?
SI
ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa
; Decrementamos CONTADOR
CONTADOR CONTADOR -1
Seccin de Configuracin
COMIENZO
RP0 1
TRISB 11111111 B
de dato
SPBRG D10
TXSTA 00100000 B
RP0 0
ORG 0X05H
CONTADOR =
0?
; Ir al Banco 1
; Poner Puerto B como entrada
; Cargar la velocidad de transmisin
de datos
Baud Rate = Fosc/(64(X+1))
Baud Rate = 1MHz/(64(10+1)) =
1420 BIT por segundo
; Configuracin de la transmisin
serie de datos (Modo Asncrono y
baja velocidad.
; Ir al Banco 0
SPEN 1
NO
SI
NO
Si el PORTB no
cambia
no se transmite
PORTB =
DATO_ANTERIOR ?
SI
76
EQU D'05'
0X00
GOTO COMIENZO
; Inicio de Programa
;(Una posicin detrs del vector de Interrupcin)
MOVLW B'00100000'
77
MOVWF TXSTA
BCF STATUS,RP0
BSF RCSTA,SPEN
MOVLW NUMERO_TRANSMISIONES
MOVWF CONTADOR
SEG1
MOVF PORTB,W
MOVWF DATO_ANTERIOR
MOVWF TXREG
BSF STATUS,RP0
BTFSS TXSTA,TRMT
GOTO SEG2
BCF STATUS,RP0
DECFSZ CONTADOR,F
GOTO SEG1
SEG2
SEG3
MOVF PORTB,W
; Si el PORTB no cambia no se transmite.
SUBWF DATO_ANTERIOR,W
BTFSC STATUS,Z
GOTO SEG3
GOTO SEG0
END
78
6.2.- R_S_A.asm
( Entrenador Bsico 4 )
Diagrama de Flujo
RP0 1
TRISB 00000000 B
de dato
BRGH 0
SPBRG D10
Asignacin de nombres de
RFS a direcciones.
#include <p16f876.inc>
SYNC 0
; Igualdades
ORG 0X05H
; Ir al Banco 1
; Poner Puerto B como salida
;Trabajar con velocidad baja de
recepcin.
; Cargar la velocidad de transmisin
de datos
Baud Rate = Fosc/(64(X+1))
Baud Rate = 1MHz/(64(10+1)) =
1420 BIT por segundo
; Habilitamos la recepcin asncrona.
; Registros
; Ir al Banco 0
RCSTA 10010000 B
CBLOCK 0X20
DATO
W_TEMP
STATUS_TEMP
ENDC
Vector de Interrupcin
Rutina de Interrupcin
INTERRU
ORG 04H
GOTO INTERRU
NO
RCIF = 1?
1
RETFIE
SI
; Salvar Registros
RETFI
E
W_TEMP W
STATUS_TEMP STATUS
RCIF 0
; Recuperar Registros
STATUS STATUS_TEMP
W W_TEMP
79
ENDC
;**************************** Seccin Cdigo de Reset ***************************************************
ORG
0X00
GOTO COMIENZO
;Vector de Interrupcin.
COMIENZO
ORG 0X05
;Inicio de Programa
;(Una posicin detrs del vector de Interrupcin).
BSF STATUS,RP0
BCF STATUS,RP1
CLRF TRISB
BCF TXSTA,BRGH
; Banco 1
MOVLW 0X0A
MOVWF SPBRG
BCF TXSTA,SYNC
80
MOVLW B'11000000'
MOVWF INTCON
MOVLW B'00100000'
MOVWF PIE1
BCF STATUS,RP0
MOVLW B'10010000'
MOVWF RCSTA
COMF DATO,W
MOVWF PORTB
GOTO PRINCIPAL
BTFSS PIR1,RCIF
RETFIE
SALVAR
MOVWF W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP
; Salvamos Registros
MOVF RCREG,W
MOVWF DATO
;Recuperamos Registros.
BCF PIR1,RCIF
RETFIE
;Retorno de Interrupcin.
END
81
6.3.- T1_S_RF.asm
( Entrenador Bsico 4 )
Diagrama de Flujo
Transmisin Serie
Asncrona
Utilizando la Librera de
Elegimos PIC
List p=16f876 , f=inhx32
; Leer PORTB
W PORTB
Asignacin de nombres de
RFS a direcciones.
#include <p16f876.inc>
; Igualdades
LANZAR_DATO_SERIE
; Registros
CBLOCK 0X20
DATO_ANTERIOR
NO
ENDC
Si el PORTB no
cambia
no se transmite
SI
PORTB =
DATO_ANTERIOR ?
Seccin de Configuracin
COMIENZO
RP0 1
TRISB 11111111 B
de dato
RP0 0
ORG 0X05H
; Ir al Banco 1
; Poner Puerto B como entrada
; Ir al Banco 0
CONFIGURACION_TRANS_SERIE
82
0X00
GOTO COMIENZO
COMIENZO
; Inicio de Programa
;(Una posicin detrs del vector de Interrupcin)
BSF STATUS,RP0
MOVLW B'11111111'
MOVWF TRISB
BCF STATUS,RP0
; Ir al banco 1
; Poner el Puerto B como entrada de Datos
; Ir al banco 0
CALL CONFIGURACION_TRANS_SERIE
;*************************** Principal **************************************************************************
SEG1
MOVF PORTB,W
MOVWF DATO_ANTERIOR
;Leer PORTB
83
CALL LANZAR_DATO_SERIE
SEG2
MOVF PORTB,W
;Si el PORTB no cambia no se transmite.
SUBWF DATO_ANTERIOR,W
BTFSC STATUS,Z
GOTO SEG2
GOTO SEG1
6.4.- RE1_S_RF.asm
( Entrenador Bsico 4 )
Diagrama de Flujo
Seccin de Configuracin
COMIENZO
Elegimos PIC
List p=16f876 , f=inhx32
ORG 0X05H
RP0 1
; Ir al Banco 1
TRISB 00000000 B
de dato
RP0 0
; Ir al Banco 0
Asignacin de nombres de
RFS a direcciones.
CONFIGURACION_RECEP_SERIE
#include <p16f876.inc>
; Igualdades
; Cargar el registro DATO en el PORTB
PORTB DATO_SERIE_VALIDO
; Registros
CBLOCK 0X20
W_TEMP
STATUS_TEMP
ENDC
Rutina de Interrupcin
INTERRU
NO
RCIF = 1?
RETFIE
SI
Vector de Interrupcin
ORG 04H
GOTO INTERRU
; Salvar Registros
RETFI
E
; Recuperar Registros
STATUS STATUS_TEMP
W W_TEMP
W_TEMP W
STATUS_TEMP STATUS
84
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************
ORG
0X00
GOTO COMIENZO
;Vector de Interrupcin.
COMIENZO
ORG 0X05
;Inicio de Programa
;(Una posicin detrs del vector de Interrupcin).
BSF STATUS,RP0
CLRF TRISB
BCF STATUS,RP0
CALL CONFIGURACION_RECEP_SERIE
85
COMF DATO_SERIE_VALIDO,W
MOVWF PORTB
GOTO PRINCIPAL
BTFSS PIR1,RCIF
RETFIE
MOVWF W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP
;Recuperamos Registros.
;Retorno de Interrupcin.
86
6.5.- T_S_RF.INC
( Entrenador Bsico 4 )
Diagrama de Flujo
; Igualdades
TODOCERO = 00000000 B
LLAVE_ENTRADA = 01011010 B
; Registros
CBLOCK
DATO_TRANSMITIDO
CONTADOR_TRANSMISIN
ENDC
;Seccin de Configuracin
CONFIGURACION_TRANS_SERIE
RPO 1
SPBRG 0X0A
; Ir al Banco 1
; Configuracin de la transmisin
serie de datos (Modo Asncrono y baja
velocidad.
; Ir al Banco 0
RETUR
N
87
LANZAR_DATO_SERIE
DATO _ TRANSMITIDO W
; Lanzar TODOCERO
TXREG #TODOCERO
NO
Ha
terminado la
transmisin ?
TRMT = 1 ?
SI
; Lanzar LLAVE_ENTRADA
TXREG #LLAVE_ENTRADA
NO
CONTADOR_TRANSMISIN =
0?
SI
NO
Ha
terminado la
transmisin ?
TRMT = 1 ?
; Decrementar el registro CONTADOR_TRANSMISION
SI
CONTADOR_TRANSMISION CONTADOR_TRANSMISIN - 1
; Lanzar DATO_TRANSMITIDO
TXREG #DATO_TRANSMITIDO
NO
Ha
terminado la
transmisin ?
SI
TRMT = 1 ?
RETUR
N
88
EQU B'00000000'
LLAVE_ENTRADA
BCF STATUS,RP0
BCF STATUS,RP1
; Ir al Banco 0.
BSF RCSTA,SPEN
RETURN
;*************************** Lanzar Llaves y Muestra Digital ***********************************************
LANZAR_DATO_SERIE
SEG1_TRANSMISION
REPETIR_TRANSMISION
MOVWF DATO_TRANSMITIDO
MOVLW d'10'
MOVWF CONTADOR_TRANSMISION
MOVLW TODOCERO ;Lanzar llave TODOCERO.
MOVWF TXREG
;Transmisin de Datos en Serie.
BSF STATUS,RP0
BTFSS TXSTA,TRMT ;Preguntamos si se ha transmitido el dato.
GOTO SEG1_TRANSMISION
BCF STATUS,RP0
MOVLW LLAVE_ENTRADA
MOVWF TXREG
89
BSF STATUS,RP0
BTFSS TXSTA,TRMT ;Preguntamos si se ha transmitido el dato.
GOTO SEG2_TRANSMISION
BCF STATUS,RP0
;Lanzar DATO_TRANSMITIDO.
MOVF DATO_TRANSMITIDO,W
MOVWF TXREG
;Transmisin de Datos en Serie.
BSF STATUS,RP0
BTFSS TXSTA,TRMT
;Preguntamos si se ha transmitido el dato.
GOTO SEG3_TRANSMISION
SEG2_TRANSMISION
SEG3_TRANSMISION
BCF STATUS,RP0
DECFSZ CONTADOR_TRANSMISION,F
GOTO REPETIR_TRANSMISION
RETURN
( Entrenador Bsico 4 )
Diagrama de Flujo
R_S_RF.INC
; Igualdades
LLAVE_ENTRADA = B'01011010'
; Llave Comn.
; Registros
CBLOCK
DATO_SERIE1
DATO_SERIE2
DATO_SERIE_VALIDO
ENDC
Seccin de Configuracin
CONFIGURACION_RECEP_SERIE
RP0 1
; Ir al Banco 1
BRGH 0
SPBRG D10
; Habilitamos la recepcin
asncrona.
INTCON 11000000 B
PIE1 00100000 B
RP0 0
RCSTA 10010000 B
; Ir al Banco 0
; Configurar y lanzar la recepcin
serie (Habilitar puerto serie, 8 BIT y
recepcin continua).
RETURN
90
RECEPCION_DATO_SERIE
NO
W RCREG
Ha llegado la llave de
entrada ?
W = LLAVE_ENTRADA ?
SI
; Borramos flag de Recepcin
RETURN
RCIF 0
NO
Ha llegado
un
nuevo dato ?
RCIF = 1 ?
DATO_SERIE_VALIDO DATO_SERIE1
DATO_SERIE1 RCREG
NO
Ha llegado la llave de
entrada ?
RCREG =
SI
; Borramos flag de Recepcin
DATO_SERIE2 RCREG
RCIF 0
NO
Ha llegado
un
nuevo dato ?
RCIF = 1 ?
SI
91
ORG 0X04
GOTO INTERRUPCION
;**************************** Registros****************************************************************************
CBLOCK
DATO_SERIE1
DATO_SERIE2
DATO_SERIE_VALIDO
ENDC
;**************************** Seccin de Configuracin *********************************************************
CONFIGURACION_RECEP_SERIE
BSF STATUS,RP0
BCF STATUS,RP1
; Banco 1
BCF TXSTA,BRGH
MOVLW 0X0A
MOVWF SPBRG
BCF TXSTA,SYNC
MOVLW B'11000000'
MOVWF INTCON
MOVLW B'00100000'
MOVWF PIE1
BCF STATUS,RP0
BCF STATUS,RP1
; Banco 0
MOVLW B'10010000'
MOVWF RCSTA
RETURN
92
MOVF RCREG,W
XORLW LLAVE_ENTRADA
BTFSS STATUS,Z
GOTO SALIR _ SERIE
NO_DATO_SERIE1
BCF PIR1,RCIF
BTFSS PIR1,RCIF
GOTO NO_DATO_SERIE1
MOVF RCREG,W
MOVWF DATO_SERIE1
NO_LLAVE_ENTRADA
BCF PIR1,RCIF
BTFSS PIR1,RCIF
GOTO NO_LLAVE_ENTRADA
MOVF RCREG,W
;Preguntamos si ha llegado la Llave
"LLAVE_ENTRADA".
XORLW LLAVE_ENTRADA
BTFSS STATUS,Z
;Si es correcta la Llave volvemos a
preguntar.
GOTO SALIR _ SERIE
;No es correcta la Llave volvemos al PP
previa recuperacin de registros.
NO_DATO_SERIE2
BCF PIR1,RCIF
BTFSS PIR1,RCIF
GOTO NO_DATO_SERIE2
MOVF RCREG,W
MOVWF DATO_SERIE2
MOVF DATO_SERIE1,W
SUBWF DATO_SERIE2,F
BTFSS STATUS,Z
GOTO SALIR _ SERIE
VALIDAR_DATO_SERIE
MOVF DATO_SERIE1,W
MOVWF DATO_SERIE_VALIDO ; El Dato se queda cargado en el Registro
DATO_SERIE_VALIDO
SALIR_SERIE
BCF PIR1,RCIF
RETURN
END
93
6.7.- T_M_S_RF.INC
( Entrenador Bsico 4 )
Diagrama de Flujo
; Igualdades
TODOCERO = 00000000 B
; Registros
CBLOCK
DATO_TRANSMITIDO
CONTADOR_TRANSMISIN
LLAVE-ENTRADA
ENDC
;Seccin de Configuracin
CONFIGURACION_TRANS_SERIE
RPO 1
SPBRG D39
; Ir al Banco 1
; Configuracin de la transmisin
serie de datos (Modo Asncrono y baja
velocidad.
; Ir al Banco 0
RETUR
N
94
LANZAR_DATO_SERIE
DATO _ TRANSMITIDO W
; Lanzar TODOCERO
TXREG #TODOCERO
NO
Ha
terminado la
transmisin ?
TRMT = 1 ?
SI
; Lanzar LLAVE_ENTRADA
TXREG #LLAVE_ENTRADA
NO
CONTADOR_TRANSMISIN =
0?
SI
NO
Ha
terminado la
transmisin ?
TRMT = 1 ?
; Decrementar el registro CONTADOR_TRANSMISION
SI
CONTADOR_TRANSMISION CONTADOR_TRANSMISIN - 1
; Lanzar DATO_TRANSMITIDO
TXREG #DATO_TRANSMITIDO
NO
Ha
terminado la
transmisin ?
SI
TRMT = 1 ?
RETUR
N
95
EQU B'00000000'
BCF STATUS,RP1
BSF STATUS,RP0
MOVLW D'39'
MOVWF SPBRG
MOVLW B'00100000'
MOVWF TXSTA
; Ir al Banco 1.
BCF STATUS,RP0
BCF STATUS,RP1
; Ir al Banco 0.
BSF RCSTA,SPEN
RETURN
SEG1_TRANSMISION
MOVWF DATO_TRANSMITIDO
MOVLW d'10'
MOVWF CONTADOR_TRANSMISION
MOVLW TODOCERO ;Lanzar llave TODOCERO.
MOVWF TXREG
;Transmisin de Datos en Serie.
BSF STATUS,RP0
BTFSS TXSTA,TRMT
;Preguntamos si se ha transmitido el dato.
GOTO SEG1_TRANSMISION
96
REPETIR_TRANSMISION
SEG2_TRANSMISION
SEG3_TRANSMISION
BCF STATUS,RP0
;Lanzar llave LLAVE_ENTRADA.
MOVF LLAVE_ENTRADA,W
MOVWF TXREG
;Transmisin de Datos en Serie.
BSF STATUS,RP0
BTFSS TXSTA,TRMT ;Preguntamos si se ha transmitido el dato.
GOTO SEG2_TRANSMISION
BCF STATUS,RP0
;Lanzar DATO_TRANSMITIDO.
MOVF DATO_TRANSMITIDO,W
MOVWF TXREG
;Transmisin de Datos en Serie.
BSF STATUS,RP0
BTFSS TXSTA,TRMT
;Preguntamos si se ha transmitido el dato.
GOTO SEG3_TRANSMISION
BCF STATUS,RP0
DECFSZ CONTADOR_TRANSMISION,F
GOTO REPETIR_TRANSMISION
RETURN
97
6.8.- R_M_S_RF.INC
( Entrenador Bsico 4 )
Diagrama de Flujo
R_S_M_RF.INC
; Igualdades
; Registros
CBLOCK
DATO_SERIE1
DATO_SERIE2
DATO_SERIE_VALIDO
LLAVE_ENTRADA
ENDC
Seccin de Configuracin
CONFIGURACION_RECEP_SERIE
RP0 1
; Ir al Banco 1
BRGH 0
SPBRG D39
; Habilitamos la recepcin
asncrona.
INTCON 11000000 B
PIE1 00100000 B
RP0 0
RCSTA 10010000 B
; Ir al Banco 0
; Configurar y lanzar la recepcin
serie (Habilitar puerto serie, 8 BIT y
recepcin continua).
RETURN
98
RECEPCION_DATO_SERIE
RCIF 0
RETURN
NO
Ha llegado
un
nuevo dato ?
RCIF = 1 ?
DATO_SERIE_VALIDO DATO_SERIE1
DATO_SERIE1 RCREG
NO
Ha llegado la llave de
entrada ?
RCREG =
SI
; Borramos flag de Recepcin
DATO_SERIE2 RCREG
RCIF 0
NO
Ha llegado
un
nuevo dato ?
RCIF = 1 ?
SI
99
ORG 0X04
GOTO INTERRUPCION
; Se pregunta primero en la rutina de interrupcin serie que llave de entrada ha llegado y se carga la
llave de entrada que corresponda. (Ejemplo Proyecto de Transmisin de datos)
; La Subrutina de Recepcin Serie devuelve el dato valido en el Registro DATO_SERIE_VALIDO
;**************************** Igualdades ***********************************************************************
;**************************** Registros*************************************************************************
CBLOCK
DATO_SERIE1
DATO_SERIE2
DATO_SERIE_VALIDO
LLAVE_ENTRADA
ENDC
;**************************** Seccin de Configuracin ******************************************************
CONFIGURACION_RECEP_SERIE
BSF STATUS,RP0
BCF STATUS,RP1
BCF TXSTA,BRGH
BSF TRISC,7
MOVLW D'39'
; Banco 1
;Trabajar con velocidad baja de recepcin.
; Cargar la Velocidad de
Recepcin de Datos.
MOVWF SPBRG
BCF TXSTA,SYNC
MOVLW B'11000000'
MOVWF INTCON
MOVLW B'00100000'
MOVWF PIE1
BCF STATUS,RP0
BCF STATUS,RP1
; Banco 0
MOVLW B'10010000'
MOVWF RCSTA
RETURN
100
BCF PIR1,RCIF
NO_DATO_SERIE1
BTFSS PIR1,RCIF
GOTO NO_DATO_SERIE1
MOVF RCREG,W
MOVWF DATO_SERIE1
NO_LLAVE_ENTRADA
BCF PIR1,RCIF
BTFSS PIR1,RCIF
GOTO NO_LLAVE_ENTRADA
MOVF RCREG,W
;Preguntamos si ha llegado la Llave
"LLAVE_ENTRADA".
XORWF LLAVE_ENTRADA,W
BTFSS STATUS,Z
;Si es correcta la Llave volvemos a
preguntar.
GOTO SALIR_SERIE
;No es correcta la Llave volvemos al PP
previa recuperacin de registros.
NO_DATO_SERIE2
BCF PIR1,RCIF
BTFSS PIR1,RCIF
GOTO NO_DATO_SERIE2
MOVF RCREG,W
MOVWF DATO_SERIE2
MOVF DATO_SERIE1,W
SUBWF DATO_SERIE2,F
BTFSS STATUS,Z
GOTO SALIR_SERIE
VALIDAR_DATO_SERIE
SALIR_SERIE
MOVF DATO_SERIE1,W
MOVWF DATO_SERIE_VALIDO
BCF PIR1,RCIF
RETURN
101
102
7.1.- Tecla0.asm
( Entrenador Bsico 5 )
Diagrama de Flujo
1
Manejo del Teclado
utilizando la tcnica
de polling
Elegimos PIC
List p=16f877 , f=inhx32
Asignacin de nombres de
RFS a direcciones.
#include <p16f877.inc>
Se ha pulsado
alguna tecla?
NO
Cy = 1?
; Igualdades
SI
; Registros
; Llevar el dato a el Puerto C.
CBLOCK 0x20
ENDC
COMIENZO
PORTC W
ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa
Teclado_LeeHex
Seccin de Configuracin
ORG 0x05
; Inicio de Programa
RETUR
N
RP0 1
TRISC 00000000 B
RP0 0
; Ir al Banco 1
; Poner el Puerto C como salida de datos.
; Ir al Banco 0
PORTC 00000000 B
; Limpiar el PORTC
103
COMIENZO
ORG
; Inicio de Programa
BCF
BSF
CLRF
BCF
CLRF
CALL
STATUS,RP1
STATUS,RP0
TRISC
STATUS,RP0
PORTC
Teclado_Inicializa
; Ir al Banco 1
; Poner el PORTC como salida de datos.
; Ir al Banco 0
; Limpiar el PORTC
; Configura las lneas del teclado.
CALL Teclado_LeeOrdenTecla
CALL Teclado_LeeHex
BTFSS STATUS,C
GOTO SEG1
MOVWF PORTC
CALL Teclado_EsperaDejePulsar
GOTO SEG1
104
7.2.- Tecl_01.asm
( Entrenador Bsico 5 )
Diagrama de Flujo
Manejo del Teclado
utilizando la tcnica
Rutina de Interrupcin
INTERRUP
de polling
Elegimos PIC
List p=16f877 , f=inhx32
Asignacin de nombres de
RFS a direcciones.
#include <p16f877.inc>
; Llevar el dato a el Puerto C.
PORTC W
; Igualdades
; Registros
CBLOCK 0x20
ENDC
Teclado_LeeHex
RBIF 0
ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa
RETFIE
ORG O4H
; Direccin del vector de Interrupcin
GOTO INTERRUP
Seccin de Configuracin
ORG 0x05
; Inicio de Programa
COMIENZO
RP0 1
TRISC 00000000 B
RP0 0
; Ir al Banco 1
; Poner el Puerto C como salida de datos.
; Ir al Banco 0
PORTC 00000000 B
; Limpiar el PORTC
105
GOTO COMIENZO
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC
BCF STATUS,RP0
CLRF PORTC
CALL Teclado_Inicializa
MOVLW B'10001000'
MOVWF INTCON
; Ir al Banco 1
; Poner el PORTC como salida de datos.
; Ir al Banco 0
; Limpiar el Puerto C
; Configura las lneas del teclado.
; Habilita la interrupcin RBI y la general.
106
SLEEP
GOTO PRINCIPAL
CALL Teclado_LeeHex
MOVWF PORTC
CALL Teclado_EsperaDejePulsar
BCF
INTCON,RBIF
RETFIE
107
7.3.- Tecl_02.asm
( Entrenador Bsico 5 )
Diagrama de Flujo
Manejo del Teclado
utilizando la tcnica
Rutina de Interrupcin
INTERRUP
de polling
Elegimos PIC
List p=16f877 , f=inhx32
Asignacin de nombres de
RFS a direcciones.
#include <p16f877.inc>
; Llevar el dato a el Puerto C.
PORTC W
; Igualdades
; Registros
CBLOCK 0x20
ENDC
HEX_7SEG
PORTD W
ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa
Seccin de Configuracin
ORG 0x05
; Inicio de Programa
COMIENZO
RP0 1
TRISC 00000000 B
ADCON1 00000111 B
TRISE 00000000 B
TRISD 00000000 B
RP0 0
PE0 1
PORTC 00000000 B
; Ir al Banco 1
; Poner el Puerto C como salida de datos.
; Habilitar el PORTE como seales digitales.
; Poner el Puerto E como salida de datos.
; Poner el Puerto D como salida de datos.
; Ir al Banco 0
; Habilitar el display de las unidades.
; Limpiar el PORTC
Teclado_LeeHex
RETFIE
108
GOTO COMIENZO
GOTO INTERRUP
;*********************************** Seccin de Configuracin *********************************************************
ORG
COMIENZO
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC
MOVLW 0X07
MOVWF ADCON1
CLRF TRISE
CLRF TRISD
; Ir al Banco 1
; Poner el PORTC como salida de datos.
; Habilitar el PORTE como seales digitales.
; Poner el PORTE como salida de datos.
; Poner el PORTD como salida de datos.
109
BCF STATUS,RP0
BSF PORTE,0
CLRF PORTC
CALL Teclado_Inicializa
MOVLW B'10001000'
MOVWF INTCON
; Ir al Banco 0
; Habilitar el display de las unidades.
; Limpiar el Puerto C
; Configura las lneas del teclado.
; Habilita la interrupcin RBI y la general.
SLEEP
GOTO PRINCIPAL
CALL Teclado_LeeHex
MOVWF PORTC
CALL HEX_7SEG
MOVWF PORTD
CALL Teclado_EsperaDejePulsar
BCF INTCON,RBIF
RETFIE
7.4.- HEX_7SEG.INC
( Entrenador Bsico 5 )
Diagrama de Flujo
Librera
HEX_7SEG.INC
HEX_7SEG
RETLW 3Fh
RETLW
PCL PCL + W
RETLW
5Bh
; El cdigo 7 segmentos
RETLW
4Fh
; El cdigo 7 segmentos
RETLW
66h
; El cdigo 7 segmentos
RETLW
6Dh
; El cdigo 7 segmentos
RETLW
7Dh
; El cdigo 7 segmentos
RETLW
07h
; El cdigo 7 segmentos
RETLW
7Fh
; El cdigo 7 segmentos
110
Librera HEX_7SEG.INC
;************************************ HEX_7SEG.INC ******************************************************************
; Transforma un cdigo hexadecimal en 7 segmentos.
;***************************************************************************************************************************
HEX_7SEG
ADDWF
PCL,F
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
3Fh
06h
5Bh
4Fh
66h
6Dh
7Dh
07h
7Fh
67h
77h
7Ch
39h
5Eh
79h
71h
7.5.-TECLADO.INC
( Entrenador Bsico 5 )
111
; que no tienen por qu coincidir con lo serigrafiado sobre ellas. El paso del nmero de orden
; de la tecla al valor que hay serigrafiado sobre la misma se hace con una tabla de conversin.
;************************************** ZONA DE DATOS **************************************************************
CBLOCK
Tecl_TeclaOrden
ENDC
Tecl_UltimaTecla
EQU
d'15'
Teclado_LeeHex
Tecl_FinLeeHex
call
btfss
goto
call
Teclado_LeeOrdenTecla
STATUS,C
Tecl_FinLeeHex
Tecl_ConvierteOrdenEnHex
bsf
STATUS,C
return
;
Tecl_ConvierteOrdenEnHex
addwf PCL,F
DT
DT
DT
DT
7h,8h,9h,0Fh
4h,5h,6h,0Eh
1h,2h,3h,0Dh
0Ah,0h,0Bh,0Ch
Teclado_FinTablaHex
; Esta tabla se sita al principio de la librera con el propsito de que no supere la
; posicin 0FFh de memoria ROM de programa. De todas formas, en caso que as fuera
; visualizara el siguiente mensaje de error en el proceso de ensamblado:
112
;
IF (Teclado_FinTablaHex > 0xFF)
ERROR
"Atencin: La tabla ha superado el tamao de la pgina de los"
MESSG
"primeros 256 bytes de memoria ROM. NO funcionar correctamente."
ENDIF
;*************************************** Subrutina "Teclado_Inicializa" ************************************************
;
; Esta subrutina configura las lneas del Puerto B segn la conexin del teclado realizada
; y comprueba que no hay pulsada tecla alguna al principio.
Teclado_Inicializa
bsf
movlw
movwf
bcf
bcf
call
return
STATUS,RP0
; Configura las lneas del puerto:
b'11110000'
; <RB7:RB4> entradas, <RB3:RB0> salidas
PORTB
OPTION_REG,NOT_RBPU ; Habilita resistencia de Pull-Up del Puerto B.
STATUS,RP0
; Acceso al banco 0.
Teclado_EsperaDejePulsar
;
;
;
; ************************************Subrutina "Teclado_EsperaDejePulsar" ***************************************
;
;Permanece en esta subrutina mientras siga pulsada la tecla.
;
Teclado_Comprobacin
EQU b'11110000'
Teclado_EsperaDejePulsar
movlw Teclado_Comprobacion; Pone a cero las cuatro lneas de salida del
movwf PORTB
; Puerto B.
Teclado_SigueEsperando
call
movf
sublw
btfss
goto
Retardo_20ms
; Espera a que se estabilicen los niveles de tensin.
PORTB,W
; Lee el Puerto B.
Teclado_Comprobacion; Si es lo mismo que escribi es que ya no pulsa
STATUS,Z
; tecla alguna.
Teclado_SigueEsperando
return
;*********************************** Subrutina "Teclado_LeeOrdenTecla" ********************************************
;
; Lee el teclado, obteniendo el orden de la tecla pulsada.
;
; Salida:
En (W) el nmero de orden de la tecla pulsada. Adems Carry se pone a "1" si
;
se pulsa una tecla a "0" si no se pulsa tecla alguna.
Teclado_LeeOrdenTecla:
clrf
Tecl_TeclaOrden
movlw b'11111110'
Tecl_ChequeaFila
movwf PORTB
Tecl_Columna1
btfss
goto
PORTB,4
Tecl_GuardaValor
113
incf
Tecl_TeclaOrden,F
Tecl_Columna2
btfss
goto
incf
PORTB,5
Tecl_GuardaValor
Tecl_TeclaOrden,F
; columnas.
Tecl_Columna3
btfss
goto
incf
PORTB,6
Tecl_GuardaValor
Tecl_TeclaOrden,F
Tecl_Columna4
btfss
goto
incf
PORTB,7
Tecl_GuardaValor
Tecl_TeclaOrden,F
;
; Comprueba si ha chequeado la ltima tecla, en cuyo caso sale. Para ello testea si
; el contenido del registro Tecl_TeclaOrden es igual al nmero de teclas del teclado.
Tecl_TerminaColumnas
movlw
subwf
btfsc
goto
bsf
rlf
goto
Tecl_UltimaTecla
Tecl_TeclaOrden,W
STATUS,C
Tecl_NoPulsada
STATUS,C
PORTB,W
Tecl_ChequeaFila
; (W) = (Tecl_TeclaOrden)-Tecl_UltimaTecla.
; C=0?, (W) negativo?, (Tecl_TeclaOrden)<15?
; No, se ha llegado al final del chequeo.
; S. Va a chequear la siguiente fila.
; Apunta a la siguiente fila.
Tecl_NoPulsada
bcf
goto
STATUS,C
Tecl_FinTecladoLee
Tecl_GuardaValor
movf
bsf
Tecl_TeclaOrden,W
STATUS,C
Tecl_FinTecladoLee
return
;
;
;
;
;
===================================================================
Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
E. Palacios, F. Remiro y L. Lpez.
Editorial Ra-Ma. www.ra-ma.es
===================================================================
114
115
8.1.- LCD_01.asm
( Entrenador Bsico 6 )
GOTO COMIENZO
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf STATUS,RP0
call
LCD_Inicializa
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
; Ir al Banco 0.
; Inicializar el LCD.
movlw
call
movlw
call
movlw
'H'
LCD_Caracter
'o'
LCD_Caracter
'l'
116
call
LCD_Caracter
movlw 'a'
call
LCD_Caracter
sleep
END
8.2.- LCD_02.asm
( Entrenador Bsico 6 )
GOTO COMIENZO
117
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf STATUS,RP0
call
LCD_Inicializa
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
; Ir al Banco 0.
; Inicializar el LCD.
movlw
call
call
movlw
call
call
movlw
call
call
movlw
call
call
call
call
goto
'H'
LCD_Caracter
Retardo_500ms
'o'
LCD_Caracter
Retardo_500ms
'l'
LCD_Caracter
Retardo_500ms
'a'
LCD_Caracter
Retardo_500ms
LCD_Borra
Retardo_500ms
Principal
8.3.- LCD_03.asm
( Entrenador Bsico 6 )
title " Programa ejemplo para comprender la utilizacin de las subrutinas "
title "LCD_ByteCompleto, LCD_Byte, LCD_Nibble y LCD_DosEspaciosBlancos"
;************************************** LCD_03.asm *******************************************************************
;
; Programa ejemplo para comprender la utilizacin de las subrutinas "LCD_ByteCompleto",
; "LCD_Byte", "LCD_Nibble" y "LCD_DosEspaciosBlancos"
;
; Para ello se van a utilizar sucesivamente y en este orden las subrutinas:
; "LCD_ByteCompleto", "LCD_DosEspaciosBlancos", "LCD_Byte",
; "LCD_DosEspaciosBlancos" y "LCD_Nibble" para dos nmeros que sern:
;
; - En la primera lnea del LCD un numero con el nibble alto no cero. Por ejemplo: 1Dh.
; - En la segunda lnea del LCD un numero con el nibble alto igual a cero. Ejemplo: 0Dh.
;
; As por ejemplo, para los nmeros "1D" y "0D" se visualizara (donde "#" viene a significar
; espacio en blanco):
; "1D##1D##D" (Primera lnea).
; "0D###D##D" (Segunda lnea).
; *************************************************************************************************************************
118
EQU
0x1D
EQU
GOTO COMIENZO
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf STATUS,RP0
call
LCD_Inicializa
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
; Ir al Banco 0.
; Inicializar el LCD.
movlw Numero_NoCeroAlto
call
LCD_ByteCompleto
call
LCD_DosEspaciosBlancos
movlw Numero_NoCeroAlto
call
LCD_Byte
call
LCD_DosEspaciosBlancos
119
movlw Numero_NoCeroAlto
call
LCD_Nibble
call
LCD_Linea2
movlw Numero_CeroAlto
call
LCD_ByteCompleto
call
LCD_DosEspaciosBlancos
movlw Numero_CeroAlto
call
LCD_Byte
call
LCD_DosEspaciosBlancos
movlw Numero_CeroAlto
call
LCD_Nibble
sleep
8.4.- LCD_04.asm
( Entrenador Bsico 6 )
120
NumeroCarga EQU
D'59'
; Cuenta inicial.
GOTO COMIENZO
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf STATUS,RP0
call
LCD_Inicializa
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
; Ir al Banco 0.
; Inicializar el LCD.
movlw NumeroCarga
movwf Contador
Visualiza
call
decfsz
goto
call
call
call
goto
VisualizaContador
Contador,F
Visualiza
VisualizaContador
LCD_Borra
Retardo_5s
Principal
call
movf
call
call
call
LCD_Linea1
Contador,W
BIN_a_BCD
LCD_Byte
Retardo_500ms
return
;*********************************************** Librerias ****************************************************************
INCLUDE <RETARDOS.INC>
INCLUDE <BIN_BCD.INC>
INCLUDE <LCD_4BIT.INC>
END
8.5.- LCD_05.asm
( Entrenador Bsico 6 )
121
title " Visualizar en la pantalla del LCD los pulsos generados del exterior "
;************************************************* LCD_05.asm *********************************************************
; Cada vez que presiona el pulsador conectado al pin RA4 incrementa un contador
; visualizado en el centro de la primera lnea de la pantalla.
; **************************************************************************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz.
;Reloj instruccin: 250 KHz = 4 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;***************** Asignacin de nombres de Registros de Funciones especiales a direcciones *****************
#include <p16f877.inc>
GOTO COMIENZO
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bsf
Pulsador
bcf STATUS,RP0
call
LCD_Inicializa
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
; Lnea del pulsador se configura como entrada.
; Ir al Banco 0.
; Inicializar el LCD.
122
clrf
call
Contador
Visualiza
btfss
call
goto
Pulsador
IncrementaVisualiza
Principal
; Lee el pulsador.
; Si pulsa salta a incrementar y visualizar el
; contador
call
btfsc
goto
incf
Retardo_20ms
Pulsador
Fin_Incrementa
Contador,F
movlw
call
movf
call
call
D'7'
LCD_PosicionLinea1
Contador,W
BIN_a_BCD
LCD_Byte
EsperaDejePulsar
btfss
goto
Pulsador
EsperaDejePulsar
Fin_Incrementa
return
Visualiza
8.6.- LCD_06.asm
( Entrenador Bsico 6 )
title " Visualizar en la pantalla del LCD los pulsos generados del exterior "
title " hasta un nmero mximo, se resetea y comienza de nuevo la cuenta "
;************************************** LCD_06.asm ********************************************************************
; Cada vez que presiona el pulsador conectado al pin RA4, incrementa un contador que se
; visualiza en la pantalla. Cuando llegue a su valor mximo (por ejemplo 6) se resetea y
; comienza de nuevo la cuenta.
;***************************************************************************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz.
;Reloj instruccin: 250 KHz = 4 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
123
ValorMaximo
EQU
D'6'
GOTO COMIENZO
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bsf
Pulsador
bcf STATUS,RP0
call
LCD_Inicializa
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
clrf
call
Contador
Visualiza
btfss
call
goto
Pulsador
IncrementaVisualiza
Principal
; Lee el pulsador.
; Si pulsa salta a incrementar y visualizar el
; contador
Visualiza
call
btfsc
goto
call
movlw
call
movf
call
call
Retardo_20ms
Pulsador
Fin_Incrementa
IncrementaContador
D'7'
LCD_PosicionLinea1
Contador,W
BIN_a_BCD
LCD_Byte
124
EsperaDejePulsar
btfss
goto
Fin_Incrementa
return
Pulsador
EsperaDejePulsar
incf
movf
sublw
btfss
clrf
Contador,F
Contador,W
ValorMaximo
STATUS,C
Contador
; Incrementa el contador
; Ha superado su valor mximo?
; (W)<- #ValorMaximo-(Contador).
; Si C =1 salta una instruccin. (Contador)> #ValorMaximo
; Lo inicializa si ha superado su valor mximo.
return
;*********************************************** Libreras ****************************************************************
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
INCLUDE <BIN_BCD.INC>
END
8.7.- LCD_07.asm
( Entrenador Bsico 6 )
title " Mientras se mantenga presionado el pulsador conectado al pin RA4, incrementa un contador"
title " que se visualiza en la pantalla del LCD."
;************************************************* LCD_07.asm *********************************************************
; Mientras se mantenga presionado el pulsador conectado al pin RA4, incrementa un contador
; que se visualiza en la pantalla. Cuando llegue a su valor mximo (por ejemplo 59) se resetea
; y comienza de nuevo la cuenta. Se mantiene 200 ms en cada cuenta.
;***************************************************************************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz.
;Reloj instruccin: 250 KHz = 4 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;******************** Asignacin de nombres de Registros de Funciones especiales a direcciones **************
#include <p16f877.inc>
125
ValorMaximo
EQU
D'59'
GOTO COMIENZO
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bsf
Pulsador
bcf STATUS,RP0
call
LCD_Inicializa
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
clrf
call
Contador
Visualiza
btfss
call
goto
Pulsador
IncrementaVisualiza
Principal
; Lee el pulsador.
; Si pulsa salta a incrementar y visualizar el
; contador
Visualiza
Fin_Incrementa
call
btfsc
goto
call
Retardo_20ms
Pulsador
Fin_Incrementa
IncrementaContador
movlw
call
movf
call
call
call
D'7'
LCD_PosicionLinea1
Contador,W
BIN_a_BCD
LCD_Byte
Retardo_200ms
return
126
incf
movf
sublw
btfss
clrf
Contador,F
Contador,W
ValorMaximo
STATUS,C
Contador
; Incrementa el contador
; Ha superado su valor mximo?
; (W)<- #ValorMaximo-(Contador).
; Si C =1 salta una instruccin. (Contador)> #ValorMaximo
; Lo inicializa si ha superado su valor mximo.
return
;*********************************************** Libreras ****************************************************************
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
INCLUDE <BIN_BCD.INC>
END
8.8.- LCD_08.asm
( Entrenador Bsico 6 )
title " Mientras se mantenga presionado el pulsador conectado al pin RA4, incrementa un contador"
title " que se visualiza en la pantalla del LCD en formato decimal ,Hexadecimal y binario."
;************************************** LCD_08.asm ********************************************************************
; Mientras se mantenga presionado el pulsador conectado al pin RA4, se incrementa un contador
; visualizado en la pantalla en tres formatos: decimal, hexadecimal y binario. Un ejemplo:
; Primera Lnea:
"CE 206"
; Segunda Lnea:
"11001110"
;**************************************************************************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz.
;Reloj instruccin: 250 KHz = 4 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;**************** Asignacin de nombres de Registros de Funciones especiales a direcciones ******************
#include <p16f877.inc>
127
CBLOCK 0x20
Contador
Auxiliar
Desplaza
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG
GOTO COMIENZO
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bsf
Pulsador
bcf STATUS,RP0
call
LCD_Inicializa
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
clrf
call
; Inicializa contador y
; lo visualiza.
Contador
VisualizaContador
Fin
btfsc
goto
call
btfsc
goto
incf
call
call
goto
Pulsador
Fin
Retardo_20ms
Pulsador
Fin
Contador,F
VisualizaContador
Retardo_200ms
Principal
; Lee el pulsador.
; Si no pulsa salta a final.
; Espera a que se estabilicen los niveles de tensin.
; Vuelve a leer el pulsador.
; Incrementa el contador.
; Se incrementara de nuevo cuando pase este
; tiempo.
call
movf
LCD_Borra
Contador,W
call
call
LCD_ByteCompleto
; Visualiza en HEXADECIMAL.
LCD_TresEspaciosBlancos
; Como separador.
movf
call
movwf
movf
call
movf
call
Contador,W
BIN_a_BCD
Auxiliar
BCD_Centenas,W
LCD_Nibble
Auxiliar,W
LCD_ByteCompleto
call
LCD_Linea2
movlw D'8'
; Borra la pantalla.
; A continuacin visualiza el contador.
128
VisualizaBit
movwf
movf
movwf
rlf
movlw
btfss
movlw
call
decfsz
goto
Auxiliar
Contador,W
Desplaza
Desplaza,F
'1'
STATUS,C
'0'
LCD_Caracter
Auxiliar,F
VisualizaBit
return
;*********************************************** Librerias ****************************************************************
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
INCLUDE <BIN_BCD.INC>
END
8.9.- Mens_01.asm
( Entrenador Bsico 6 )
129
LCD_ValorCaracter
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG
GOTO COMIENZO
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf STATUS,RP0
call
LCD_Inicializa
clrf
LCD_ApuntaCaracter
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
; Ir al Banco 0.
; Inicializar el LCD.
; Se visualizara la primera posicin del mensaje.
movf
call
LCD_ApuntaCaracter,W
Mensajes
movwf LCD_ValorCaracter
movf LCD_ValorCaracter,F
LCD_NoUltimoCaracter
Fin
btfsc
STATUS,Z
goto
Fin
call
incf
LCD_Caracter
LCD_ApuntaCaracter,F
goto
LCD_VisualizaOtroCaracter
sleep
addwf PCL,F
Mensaje0
8.10.- Mens_02.asm
( Entrenador Bsico 6 )
130
; librera LCD_MENS.INC
;**************************************************************************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz.
;Reloj instruccin: 250 KHz = 4 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;**************** Asignacin de nombres de Registros de Funciones especiales a direcciones ******************
#include <p16f877.inc>
GOTO COMIENZO
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf STATUS,RP0
call
LCD_Inicializa
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como senales digitales.
; Ir al Banco 0.
; Inicializar el LCD.
movlw Mensaje0
; Apunta donde se encuentra el mensaje.
call
LCD_Mensaje
; Visualiza el mensaje.
sleep
; Pasa a modo bajo consumo.
;********************************* Subrutina "Mensajes" ****************************************************************
Mensajes
addwf PCL,F
Mensaje0
131
INCLUDE <LCD_4BIT.INC>
INCLUDE <LCD_MENS.INC>
INCLUDE <RETARDOS.INC>
END
8.11.- Mens_03.asm
( Entrenador Bsico 6 )
title " Visualizacin de varios mensajes fijo utilizando la librera LCD_MENS.INC "
;************************************ Mensaje_03.asm ******************************************************************
; En la pantalla se visualizan varios mensajes, uno detrs de otro. Cada mensaje permanece
; durante 2 segundos. Entre mensaje y mensaje la pantalla se apaga durante unos 200 ms.
;***************************************************************************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz.
;Reloj instruccin: 250 KHz = 4 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;***************** Asignacin de nombres de Registros de Funciones especiales a direcciones *****************
#include <p16f877.inc>
GOTO COMIENZO
;Comienzo del Programa
;*********************************** Seccin de Configuracin *********************************************************
ORG
COMIENZO
clrf PORTA
bsf STATUS,RP0
movlw 0x06
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
132
movwf ADCON1
bcf STATUS,RP0
call
LCD_Inicializa
; Ir al Banco 0.
; Inicializar el LCD.
movlw
call
movlw
call
movlw
call
call
goto
Mensaje0
Visualiza
Mensaje1
Visualiza
Mensaje2
Visualiza
Retardo_5s
Principal
; Apunta al mensaje 0.
; Apunta al mensaje 1.
; Apunta al mensaje 2.
; Permanece apagada durante este tiempo.
; Repite la visualizacin de todos los mensajes.
call
call
call
call
LCD_Mensaje
Retardo_2s
LCD_Borra
Retardo_200ms
return
;********************************* Subrutina "Mensajes" ****************************************************************
Mensajes
addwf PCL,F
Mensaje0
Mensaje1
Mensaje2
8.12.- Mens_03B.asm
( Entrenador Bsico 6 )
title " Visualizacin de varios mensajes fijo utilizando la librera LCD_MENS.INC "
title " Cuando se visualiza el ultimo mensaje el proceso se repite "
;************************************ Mens_03B.asm *******************************************************************
; En la pantalla se visualizan varios mensajes, uno detrs de otro. Cada mensaje permanece
; durante 2 segundos. Entre mensaje y mensaje la pantalla se apaga durante unos 200 mS.
;***************************************************************************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz.
;Reloj instruccin: 250 KHz = 4 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
133
EQU
D'6'
GOTO COMIENZO
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf STATUS,RP0
call
LCD_Inicializa
clrf
Contador
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
; Ir al Banco 0.
; Inicializar el LCD.
; Inicializa el registro Contador.
movlw
subwf
btfss
goto
clrf
call
call
ValorMaximo
Contador,W
STATUS,C
Visualiza
Contador
LCD_Borra
Retardo_5s
Visualiza
call
call
movf
call
call
call
LCD_Borra
Retardo_200ms
Contador,W
ApuntaMensaje
LCD_Mensaje
Retardo_2s
134
incf
goto
Contador,F
Principal
; Incrementa el contador.
; Repite el proceso.
addwf PCL,F
retlw
retlw
retlw
retlw
retlw
retlw
Mensaje0
Mensaje1
Mensaje2
Mensaje3
Mensaje4
Mensaje5
addwf PCL,F
Mensaje0
Mensaje1
Mensaje2
Mensaje3
Mensaje4
DT "
Mensaje5
8.13.- Mens_04.asm
( Entrenador Bsico 6 )
title " Visualizacin de mensajes parpadeantes en dos lneas del LCD "
;************************************ Mens_04.asm *********************************************************************
; En las dos lneas de la pantalla apareceren dos mensajes parpadeantes.
;***************************************************************************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz.
;Reloj instruccin: 250 KHz = 4 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;************************************** Elegimos PIC ********************************************************************
135
GOTO COMIENZO
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf STATUS,RP0
call
LCD_Inicializa
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
; Ir al Banco 0.
; Inicializar el LCD.
movlw
call
call
movlw
call
call
call
call
goto
Mensaje0
LCD_Mensaje
LCD_Linea2
Mensaje1
LCD_Mensaje
Retardo_500ms
LCD_Borra
Retardo_500ms
Principal
addwf PCL,F
Mensaje0
Mensaje1
136
INCLUDE <LCD_4BIT.INC>
INCLUDE <LCD_MENS.INC>
INCLUDE <RETARDOS.INC>
END
8.14.- Mens_05.asm
( Entrenador Bsico 6 )
GOTO COMIENZO
clrf
PORTA
; Reseteamos el PORTA.
137
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf STATUS,RP0
call
LCD_Inicializa
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
; Ir al Banco 0.
; Inicializar el LCD.
movlw MensajeFijo
call
LCD_Mensaje
seguir
call
movlw
call
call
call
call
call
goto
LCD_Linea2
MensajeParpadeante
LCD_Mensaje
Retardo_500ms
LCD_Linea2
LCD_LineaEnBlanco
Retardo_500ms
seguir
addwf PCL,F
MensajeFijo
MensajeParpadeante
8.15.- Mens_06.asm
( Entrenador Bsico 6 )
138
EQU
Pulsador PORTA,4
D'4'
; El contador a visualizar.
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG
GOTO COMIENZO
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bsf
Pulsador
bcf STATUS,RP0
call
LCD_Inicializa
clrf
Contador
call
Visualiza
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
; Lnea del pulsador configurada como entrada.
; Ir al Banco 0.
; Inicializar el LCD.
; Inicializa contador y los visualiza por primera vez.
btfsc
goto
call
btfsc
goto
call
call
EsperaDejePulsar
Fin
Pulsador
Fin
Retardo_20ms
Pulsador
Fin
IncrementaContador
Visualiza
btfss
goto
goto
; Lee el pulsador.
; Espera estabilicen niveles de tensin.
; Vuelve a leer el pulsador.
; Incrementa el contador.
; Visualiza el mensaje correspondiente.
Pulsador
EsperaDejePulsar
Principal
incf
Contador,F
; Incrementa el contador.
139
movf Contador,W
sublw ValorMaximo-1
btfss STATUS,C
clrf
Contador
return
call
movlw
call
movf
call
call
call
movf
call
call
return
LCD_Borra
MensajeN
LCD_Mensaje
Contador,W
BIN_a_BCD
LCD_Byte
LCD_Linea2
Contador,W
ApuntaMensaje
LCD_Mensaje
Mensaje0
Mensaje1
Mensaje2
Mensaje3
addwf PCL,F
Mensaje0
Mensaje1
Mensaje2
Mensaje3
MensajeN
<LCD_MENS.INC>
<LCD_4BIT.INC>
<RETARDOS.INC>
<BIN_BCD.INC>
END
8.16.- Mens_07.asm
( Entrenador Bsico 6 )
title " El modulo LCD visualiza un mensaje largo (ms de 16 caracteres) que se desplaza "
;**************************************************** Mens_07.asm *****************************************************
;
; El modulo LCD visualiza un mensaje largo (ms de 16 caracteres) que se desplaza a lo largo
; de la pantalla. Se utiliza la subrutina LCD_MensajeMovimiento de la librera LCD_MENS.INC.
140
;***************************************************************************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz.
;Reloj instruccin: 250 KHz = 4 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;*********** Asignacin de nombres de Registros de Funciones especiales a direcciones ***********************
#include <p16f877.inc>
GOTO COMIENZO
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf STATUS,RP0
call
LCD_Inicializa
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
; Ir al Banco 0.
; Inicializar el LCD.
movlw Mensaje0
; Apunta al mensaje.
call
LCD_MensajeMovimiento
goto
Principal
; Repite la visualizacin.
;***************************************** Subrutina "Mensajes" ********************************************************
Mensajes
addwf PCL,F
Mensaje0
DT "
"
141
; Subrutina LCD_MensajeMovimiento.
; Subrutinas de control del LCD.
; Subrutinas de retardos.
END
8.17.- Mens_08.asm
( Entrenador Bsico 6 )
GOTO COMIENZO
clrf
bsf
PORTA
STATUS,RP0
; Reseteamos el PORTA.
; Ir al Banco 1.
142
movlw 0x06
movwf ADCON1
bsf
Pulsador
bcf STATUS,RP0
call
LCD_Inicializa
movlw MensajeQuiniela
call
LCD_Mensaje
;************************************* Principal **************************************************************************
Principal
btfss
call
goto
Pulsador
IncrementaVisualiza
Principal
; Lee el pulsador.
; Si pulsa salta a incrementar y visualizar el
; contador
incf
movlw
call
movf
andlw
call
call
Contador,F
D'7'
LCD_PosicionLinea2
Contador,W
b'00011111'
SignoQuiniela
LCD_Caracter
return
;******************************************** Subrutina "SignoQuiniela" ************************************************
SignoQuiniela addwf PCL,F
DT
addwf PCL,F
MensajeQuiniela
<RETARDOS.INC>
<BIN_BCD.INC>
<LCD_4BIT.INC>
<LCD_MENS.INC>
END
8.18.- Mens_09.asm
( Entrenador Bsico 6 )
title " La pantalla del LCD visualiza un mensaje en funcin de un pulsador "
;*********************************************** Mens_09.asm **********************************************************
; En pantalla visualiza "Cerrado" o "Abierto" segn si un pulsador esta presionado o no.
;***************************************************************************************************************************
;Programa para PIC 16F877.
143
GOTO COMIENZO
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bsf
Pulsador
bcf STATUS,RP0
call
LCD_Inicializa
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
; Lnea del pulsador que se configura como entrada.
; Ir al Banco 0.
; Inicializar el LCD.
movlw MensajePulsador
call
LCD_Mensaje
call
movlw
btfsc
movlw
call
goto
LCD_Linea2
MensajeCerrado
Pulsador
MensajeAbierto
LCD_Mensaje
Principal
144
Mensajes
addwf PCL,F
MensajePulsador
MensajeAbierto
MensajeCerrado
DT "
DT "
DT "
Pulsador"
abIERto", 0x00
CErraDO", 0x00
( Entrenador Bsico 6 )
8.19.- BIN_BCD.INC
clrf
clrf
movwf
BCD_Resta10
movlw
subwf
btfss
goto
BCD_IncrementaDecenas
BCD_Centenas
; Carga los registros con el resultado inicial.
BCD_Decenas
; En principio las centenas y decenas a cero.
BCD_Unidades
; Se carga el nmero binario a convertir.
.10
; A las unidades se les va restando 10 en cada
BCD_Unidades,W
; pasada. (W)=(BCD_Unidades) -10.
STATUS,C
; C = 1?, (W) positivo?, (BCD_Unidades)>=10?
BIN_BCD_Fin
; No, es menor de 10. Se acab.
movwf BCD_Unidades
; Recupera lo que queda por restar.
incf
BCD_Decenas,F
; Incrementa las decenas y comprueba si ha
movlw .10
; llegado a 10. Lo hace mediante una resta.
subwf BCD_Decenas,W
; (W)=(BCD_Decenas)-10).
btfss STATUS,C
; C = 1?, (W) positivo?,
(BCD_Decenas)>=10?
goto
BCD_Resta10
; No. Vuelve a dar otra pasada, restndole
; 10 a las unidades.
BCD_IncrementaCentenas
clrf
incf
BCD_Decenas
BCD_Centenas,F
145
goto
BIN_BCD_Fin
BCD_Resta10
swapf BCD_Decenas,W
addwf BCD_Unidades,W
return
( Entrenador Bsico 6 )
8.20.- LCD_4BIT.INC
;
;
;
;
;
===================================================================
Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
E. Palacios, F. Remiro y L. Lpez.
Editorial Ra-Ma. www.ra-ma.es
===================================================================
EQU
D16
#DEFINE LCD_PinRS
#DEFINE LCD_PinRW
#DEFINE LCD_PinEnable
PORTA,0
PORTA,1
PORTA,2
146
#DEFINE LCD_BusDatos
PORTB
LCD_2Lineas4Bits5x7
LCD_Borra
LCD_CursorOFF
LCD_CursorIncr
return
;***************************************** Subrutina "LCD_EscribeLCD" **********************************************
; Enva el dato del registro de trabajo W al bus de dato y produce un pequeo pulso en el pin
; Enable del LCD. Para no alterar el contenido de las lneas de la parte baja del Puerto B que
; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas lneas y despus se
; vuelve a enviar este dato sin cambiarlo.
LCD_EscribeLCD
andlw
movwf
movf
andlw
iorwf
b'11110000'
LCD_Dato
LCD_BusDatos,W
b'00001111'
LCD_Dato,F
bsf
movf
movwf
movlw
andwf
bcf
STATUS,RP0
TRISB,W
LCD_GuardaTRISB
b'00001111'
PORTB,F
STATUS,RP0
movf
LCD_Dato,W
147
movwf LCD_BusDatos
bsf
LCD_PinEnable
bcf
LCD_PinEnable
movlw b'00000110'
goto
LCD_EnviaComando
LCD_Linea1
movlw b'10000000'
goto
LCD_EnviaComando
LCD_Linea2
movlw b'11000000'
goto
LCD_EnviaComando
LCD_PosicionLinea1
iorlw
goto
b'10000000'
LCD_EnviaComando
LCD_PosicionLinea2
iorlw
goto
b'11000000'
LCD_EnviaComando
LCD_OFF
movlw b'00001000'
goto
LCD_EnviaComando
; Pantalla apagada.
LCD_CursorON
movlw b'00001110'
goto
LCD_EnviaComando
LCD_CursorOFF
movlw b'00001100'
goto
LCD_EnviaComando
LCD_Borra
movlw b'00000001'
goto
LCD_EnviaComando
bcf
goto
LCD_PinRS
LCD_Envia
148
LCD_Carcter
bsf
call
LCD_PinRS
LCD_CodigoCGROM
LCD_Envia
movwf LCD_GuardaDato
call
LCD_EscribeLCD
swapf LCD_GuardaDato,W
call
btfss
LCD_EscribeLCD
LCD_PinRS
call
call
Retardo_2ms
Retardo_50micros
return
;************************************** Subrutina "LCD_CodigoCGROM **********************************************
; A partir del carcter ASCII nmero 127 los cdigos de los caracteres definidos en la
; tabla CGROM del LM016L no coinciden con los cdigos ASCII. As por ejemplo, el cdigo
; ASCII de la "" en la tabla CGRAM del LM016L es EEh.
;
; Esta subrutina convierte los cdigos ASCII de la "", "" y otros, a cdigos CGROM para que
; que puedan ser visualizado en el mdulo LM016L.
;
; Entrada:
En (W) el cdigo ASCII del carcter que se desea visualizar.
; Salida:
En (W) el cdigo definido en la tabla CGROM.
LCD_CodigoCGROM
movwf LCD_Dato
LCD_EnheMinuscula
sublw
btfss
goto
movlw
movwf
goto
''
; Es la ""?
STATUS,Z
LCD_EnheMayuscula ; No es "".
b'11101110'
; Cdigo CGROM de la "".
LCD_Dato
LCD_FinCGROM
LCD_EnheMayuscula movf
sublw
btfss
goto
movlw
movwf
goto
LCD_Dato,W
''
STATUS,Z
LCD_Grado
b'11101110'
LCD_Dato
LCD_FinCGROM
LCD_Grado
movf
sublw
btfss
goto
movlw
movwf
LCD_Dato,W
''
STATUS,Z
LCD_FinCGROM
b'11011111'
LCD_Dato
movf
LCD_Dato,W
LCD_FinCGROM
; No es "".
; Cdigo CGROM de la "". (No hay smbolo para
; la "" mayscula en la CGROM).
; No es "".
; Cdigo CGROM del smbolo "".
return
; ************************* Subrutina "LCD_DosEspaciosBlancos" y "LCD_LineaBlanco" **************************
; Visualiza espacios en blanco.
149
LCD_LineaEnBlanco
movlw LCD_CaracteresPorLinea
goto
LCD_EnviaBlancos
LCD_UnEspacioBlanco
movlw .1
goto
LCD_EnviaBlancos
LCD_DosEspaciosBlancos
movlw .2
goto
LCD_EnviaBlancos
LCD_TresEspaciosBlancos
movlw .3
LCD_EnviaBlancos
movwf LCD_Auxiliar1
LCD_EnviaOtroBlanco
movlw
call
decfsz
goto
''
; Esto es un espacio en blanco.
LCD_Caracter
; Visualiza tanto espacios en blanco como
LCD_Auxiliar1,F
; se haya cargado en (LCD_Auxiliar1).
LCD_EnviaOtroBlanco
return
; **************************** Subrutinas "LCD_ByteCompleto" y "LCD_Byte" ***************************************
; Subrutina "LCD_ByteCompleto", visualiza el byte que almacena el registro W en el
; lugar actual de la pantalla. Por ejemplo, si (W)=b'10101110' visualiza "AE".
;
; Subrutina "LCD_Byte" igual que la anterior, pero en caso de que el nibble alto sea cero
; visualiza en su lugar un espacio en blanco. Por ejemplo si (W)=b'10101110' visualiza "AE"
; y si (W)=b'00001110', visualiza " E" (un espacio blanco delante).
;
; Utilizan la subrutina "LCD_Nibble" que se analiza ms adelante.
LCD_Byte
movwf
andlw
btfss
goto
movlw
call
goto
LCD_Auxiliar2
b'11110000'
STATUS,Z
LCD_VisualizaAlto
''
LCD_Caracter
LCD_VisualizaBajo
LCD_ByteCompleto
movwf LCD_Auxiliar2
LCD_VisualizaAlto
swapf LCD_Auxiliar2,W
call
LCD_Nibble
LCD_VisualizaBajo
movf
call
LCD_Auxiliar2,W
LCD_Nibble
return
; **************************************** Subrutina "LCD_Nibble" *****************************************************
; Visualiza en el lugar actual de la pantalla, el valor hexadecimal que almacena en el nibble
; bajo del registro W. El nibble alto de W no es tenido en cuenta. Ejemplos:
; - Si (W)=b'01010110', se visualizar "6".
; - Si (W)=b'10101110', se visualizar "E".
LCD_Nibble
andlw b'00001111'
movwf LCD_Auxiliar1
sublw 0x09
150
btfss
goto
movf
addlw
goto
LCD_EnviaByteLetra
LCD_FinVisualizaDigito goto
;
;
;
;
;
STATUS,C
; letra.
LCD_EnviaByteLetra
LCD_Auxiliar1,W
'0'
; El nmero se pasa a carcter ASCII
LCD_FinVisualizaDigito ; sumndole el ASCII del cero y lo visualiza.
movf LCD_Auxiliar1,W
addlw 'A'-0x0A
LCD_Caracter
===================================================================
Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
E. Palacios, F. Remiro y L. Lpez.
Editorial Ra-Ma. www.ra-ma.es
===================================================================
8.21.- LCD_MENS.INC
( Entrenador Bsico 6 )
; Los mensajes tienen que estar situados dentro de las 256 primeras posiciones de la
; memoria de programa, es decir, no pueden superar la direccin 0FFh.
; *********************************************Subrutina "LCD_Mensaje" **********************************************
;
; Visualiza por pantalla el mensaje apuntado por el registro W.
;
; Los mensajes deben localizarse dentro de una zona encabezada por la etiqueta "Mensajes" y que
; tenga la siguiente estructura:
;
; Mensajes
addwf PCL,F
; Etiqueta obligatoria!
; Mensaje0
DT ".. ..", 0x00
; Posicin inicial del mensaje.
;
; Mensaje terminado en 0x00.
; Mensaje1
;
...
;
...
; FinMensajes
;
; La llamada a esta subrutina se realizar siguiendo este ejemplo:
;
151
;
;
;
movlw Mensaje0
call
LCD_Mensaje
LCD_Mensaje
movwf
movlw
subwf
decf
LCD_ApuntaCaracter
Mensajes
LCD_ApuntaCaracter,F
LCD_ApuntaCaracter,F
LCD_VisualizaOtroCaracter
movf
call
movwf
movf
btfsc
goto
LCD_ApuntaCaracter,W
Mensajes
LCD_ValorCaracter
LCD_ValorCaracter,F
STATUS,Z
LCD_FinMensaje
LCD_Caracter
LCD_ApuntaCaracter,F
LCD_VisualizaOtroCaracter
LCD_NoUltimoCaracter
call
incf
goto
LCD_FinMensaje
return
LCD_ApuntaCaracter
Mensajes
LCD_ApuntaCaracter,F
LCD_ApuntaCaracter,F
LCD_CursorPosicion
LCD_Borra
LCD_CaracteresPorLinea
LCD_CursorPosicion,W
STATUS,Z
LCD_NoEsFinalLinea
LCD_PrimeraPosicion
clrf
call
LCD_VisualizaCaracter
movlw
subwf
btfss
goto
152
LCD_EsFinalLinea
;
call
call
movlw
subwf
goto
Retardo_100ms
Retardo_200ms
LCD_CaracteresPorLinea-1
LCD_ApuntaCaracter,F
LCD_PrimeraPosicion
LCD_NoEsFinalLinea
movf
call
movwf
movf
btfsc
goto
LCD_ApuntaCaracter,W
Mensajes
LCD_ValorCaracter
LCD_ValorCaracter,F
STATUS,Z
LCD_FinMovimiento
LCD_NoUltimoCaracter2
call
incf
LCD_Caracter
LCD_CursorPosicion,F
incf
goto
LCD_ApuntaCaracter,F
LCD_VisualizaCaracter
LCD_FinMovimiento
return
;
;
;
;
;
===================================================================
Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
E. Palacios, F. Remiro y L. Lpez.
Editorial Ra-Ma. www.ra-ma.es
===================================================================
153
154
9.1.- Tecla_01.asm
( Entrenador Bsico 7 )
title " La pantalla del LCD visualiza el orden de la tecla pulsada utilizando la tcnica de polling"
;************************************** Tecla_01.asm *******************************************************************
; El modulo LCD visualiza el orden de la tecla pulsada expresado en decimal. Utiliza
; tcnica Polling o lectura constante del puerto al que esta conectado el teclado.
; **************************************************************************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz.
;Reloj instruccin: 250 KHz = 4 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;******************* Asignacin de nombres de Registros de Funciones especiales a direcciones ***************
#include <p16f877.inc>
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG
GOTO COMIENZO
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf STATUS,RP0
call
LCD_Inicializa
call
Teclado_Inicializa
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
; Ir al Banco 0.
; Inicializar el LCD.
; Configura las lneas del teclado.
155
Principal
Fin
call
btfss
Teclado_LeeOrdenTecla
STATUS,C
goto
Fin
; Lee el teclado.
; Si se pulsa alguna tecla el Cy=1 y salta una
instruccin.
; No, por tanto sale.
movwf GUARDA_TECLA
call
Teclado_EsperaDejePulsar
movf
call
GUARDA_TECLA,W
BIN_a_BCD
; Lo pasa a BCD.
call
LCD_ByteCompleto
; Visualiza en pantalla.
goto
Principal
<TECLADO.INC>
<BIN_BCD.INC>
<LCD_4BIT.INC>
<RETARDOS.INC>
END
9.2.- Tecla_02.asm
( Entrenador Bsico 7 )
title " La pantalla del LCD visualiza el valor hexadecimal de la tecla pulsada utilizando la
tcnica de polling"
;************************************** Tecla_02.asm *******************************************************************
; En pantalla aparece el valor hexadecimal de la tecla pulsada. Se esta leyendo constantemente
; el teclado mediante tcnica Polling.
;***************************************************************************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz.
;Reloj instruccin: 250 KHz = 4 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;***************** Asignacin de nombres de Registros de Funciones especiales a direcciones *****************
#include <p16f877.inc>
156
CBLOCK 0x20
GUARDA_TECLA
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG
GOTO COMIENZO
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf STATUS,RP0
call
LCD_Inicializa
call
Teclado_Inicializa
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
; Ir al Banco 0.
; Inicializar el LCD.
; Configura las lneas del teclado.
Fin
movwf GUARDA_TECLA
call
Teclado_EsperaDejePulsar
movf
call
GUARDA_TECLA,W
LCD_Nibble
goto
Principal
9.3.- Tecl_03.asm
( Entrenador Bsico 7 )
title " La pantalla del LCD visualiza el valor hexadecimal de la tecla pulsada utilizando
tcnicas de interrupcin "
;************************************************* Tecl_03.asm *********************************************************
; El modulo LCD visualiza el valor hexadecimal de la tecla pulsada. Para la lectura del
; teclado se utiliza la interrupcin RBI o por cambio en las lneas <RB7:RB4> del Puerto B.
; **************************************************************************************************************************
;Programa para PIC 16F877.
157
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG
GOTO COMIENZO
GOTO Interrup
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf STATUS,RP0
call
LCD_Inicializa
call
Teclado_Inicializa
movlw b'10001000'
movwf INTCON
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
; Ir al Banco 0.
; Inicializar el LCD.
; Configura las lneas del teclado.
; Habilita la interrupcin RBI y la general.
sleep
; Espera en modo bajo consumo que pulse teclado.
goto
Principal
;************************************ Rutina de Interrupcin "Interrup" *************************************************
Interrupcall
Teclado_LeeHex
158
movwf
call
movf
call
movf
bcf
retfie
GUARDA_TECLA
Teclado_EsperaDejePulsar
GUARDA_TECLA,W
LCD_Nibble
PORTB,w
INTCON,RBIF
9.4.- Tecla_04.asm
( Entrenador Bsico 7 )
title " La pantalla del LCD visualiza caracteres espaoles en funcin de la tecla pulsada "
;************************************************** Tecla_04.asm *******************************************************
; Supone un teclado con los 16 primeros caracteres del alfabeto espaol. Por tanto hay
; que cambiar la tabla respecto de los ejercicios anteriores. Lo que se va escribiendo por
; el teclado aparece en pantalla como si fuera un teclado alfabtico.
;***************************************************************************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz.
;Reloj instruccin: 250 KHz = 4 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;**************** Asignacin de nombres de Registros de Funciones especiales a direcciones ******************
#include <p16f877.inc>
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG
159
GOTO COMIENZO
GOTO Interrup
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf STATUS,RP0
call
LCD_Inicializa
call
Teclado_Inicializa
movlw b'10001000'
movwf INTCON
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
; Ir al Banco 0.
; Inicializar el LCD.
; Configura las lneas del teclado.
; Habilita la interrupcin RBI y la general.
sleep
goto
ORDEN DE TECLA:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
TECLADO UTILIZADO:
A B C D
E F G H
I J K L
M N O P
Teclado_LeeOrdenTecla
movwf GUARDA_TECLA
call
Teclado_EsperaDejePulsar
movf GUARDA_TECLA,W
call
Tecl_ConvierteOrdenEnASCII
call
LCD_Caracter
movf
bcf
retfie
PORTB,W
INTCON,RBIF
DT
"ABCD"
; Primera fila del teclado.
DT
"EFGH"
; Segunda fila del teclado.
DT
"IJKL"
; Tercera fila del teclado.
DT
"MNO"
; Cuarta fila del teclado.
;*********************************************** Libreras ****************************************************************
INCLUDE <TECLADO.INC>
160
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
END
9.5.- Tecla_05.asm
( Entrenador Bsico 7 )
title " La pantalla del LCD aparece un mensaje en movimiento y fijo en la primera lnea "
title " y en la segunda lnea visualiza la tecla pulsada "
;************************************************* Tecla_05.asm ********************************************************
; Primero aparece un mensaje de presentacin en movimiento. Luego en la primera lnea aparece
; un mensaje esttico y lo que se va escribiendo por el teclado aparece en la segunda fila.
;***************************************************************************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz.
;Reloj instruccin: 250 KHz = 4 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;*************** Asignacin de nombres de Registros de Funciones especiales a direcciones *******************
#include <p16f877.inc>
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG
GOTO COMIENZO
GOTO Interrup
;Ir a rutina de Interrupcin
;*********************************** Seccin de Configuracin *********************************************************
COMIENZO
clrf
PORTA
; Reseteamos el PORTA.
161
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf STATUS,RP0
call
LCD_Inicializa
movlw
call
call
movlw
call
call
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
; Ir al Banco 0.
; Inicializar el LCD.
call
Teclado_Inicializa
movlw b'10001000'
movwf INTCON
sleep
goto
Teclado_LeeHex
movwf GUARDA_TECLA
call
Teclado_EsperaDejePulsar
movf
call
GUARDA_TECLA,W
LCD_Nibble
movf
bcf
retfie
PORTB,W
INTCON,RBIF
addwf PCL,F
MensajePresentacion
DT "
"
DT "Estudia Desarrollo de Productos Electrnicos"
DT "
", 0x00
MensajePulsa
<TECLADO.INC>
<LCD_4BIT.INC>
<LCD_MENS.INC>
<RETARDOS.INC>
END
9.6.- Tecla_06.asm
( Entrenador Bsico 7 )
title " La pantalla del LCD aparece la tecla pulsada primero "
title " la lnea 1 y despus en la lnea 2 repitindose el proceso "
162
EQU
EQU
d'16'
d'32'
ENDC
;*********************************** Seccin Cdigo de Reset *********************************************************
ORG
GOTO COMIENZO
GOTO Interrup
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
163
bcf
call
STATUS,RP0
LCD_Inicializa
; Ir al Banco 0.
; Inicializar el LCD.
call
Teclado_Inicializa
movlw b'10001000'
movwf INTCON
clrf
ContadorCaracteres
sleep
goto
call
movwf
call
movf
movlw
subwf
btfsc
call
movlw
subwf
btfss
goto
call
clrf
EscribeCaracter
Teclado_LeeHex
GuardaTecla
Teclado_EsperaDejePulsar
GuardaTecla,W
CaracteresUnaLinea
ContadorCaracteres,W
STATUS,Z
LCD_Linea2
CaracteresDosLineas
ContadorCaracteres,W
STATUS,Z
EscribeCaracter
LCD_Borra
ContadorCaracteres
incf
movf
call
ContadorCaracteres,F
GuardaTecla,W
LCD_Nibble
movf
bcf
PORTB,W
INTCON,RBIF
retfie
;*********************************************** Libreras ****************************************************************
INCLUDE <TECLADO.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
END
9.7.- Tecla_07.asm
( Entrenador Bsico 7 )
title " La pantalla del LCD aparece la tecla pulsada si esta es decimal "
title " si se pulsa otra tecla borra pantalla "
164
GOTO COMIENZO
GOTO Interrup
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf STATUS,RP0
call
LCD_Inicializa
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
call
Teclado_Inicializa
movlw b'10001000'
; Ir al Banco 0.
; Inicializar el LCD.
165
movwf INTCON
;************************************* Principal **************************************************************************
Principal
sleep
; Espera en modo bajo consumo que pulse teclado.
goto
Principal
;************************************ Rutina de Interrupcin "Interrup" *************************************************
Interrup
BorraPantalla
limpiar_flag
call
movwf
call
movf
sublw
btfss
goto
movf
call
goto
call
Teclado_LeeHex
GuardaValor
Teclado_EsperaDejePulsar
GuardaValor,W
0x09
STATUS,C
BorraPantalla
GuardaValor,W
LCD_Nibble
limpiar_flag
LCD_Borra
movf
bcf
retfie
PORTB,W
INTCON,RBIF
; Comprueba si es mayor de 9.
; Si no es un carcter numrico salta a borrar.
; Recupera el valor ledo y lo
; visualiza en la pantalla.
; Borra la pantalla.
( Entrenador Bsico 7 )
9.8.- Tecla_08.asm
Hex: A+6+F=1F
Dec: 10+06+15=31
(Primera Lnea)
(Segunda Lnea)
;***************************************************************************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz.
;Reloj instruccin: 250 KHz = 4 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;**************** Asignacin de nombres de Registros de Funciones especiales a direcciones ******************
166
#include <p16f877.inc>
GOTO COMIENZO
GOTO Interrup
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf STATUS,RP0
call
LCD_Inicializa
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
call
clrf
movlw
movwf
; Ir al Banco 0.
; Inicializar el LCD.
Teclado_Inicializa
ContadorTeclasPulsadas
b'10001000'
INTCON
sleep
goto
MACRO
Operando,Caracter
movf GuardaValor,W
movwf Operando
call
LCD_Nibble
167
movlw Caracter
call
LCD_Caracter
; Visualiza el signo '+' o '-' segn corresponda.
incf
ContadorTeclasPulsadas,F
ENDM
;******************************* Macro "VisualizaDec" ******************************************************************
VisualizaDec
MACRO
movf
call
call
movlw
call
Operando,Caracter
Operando,W
BIN_a_BCD
LCD_ByteCompleto
Caracter
LCD_Caracter
ENDM
;************************************ Rutina de Interrupcin "Interrup" ************************************************
Interrupcall
Teclado_LeeHex
movwf GuardaValor
call
Teclado_EsperaDejePulsar
movf ContadorTeclasPulsadas,W
addwf PCL,F
goto
PrimeraTeclaPulsada
goto
SegundaTeclaPulsada
goto
TerceraTeclaPulsada
PrimeraTeclaPulsada
call
LCD_Borra
movlw MensajeHex
call
LCD_Mensaje
VisualizaHex Operando1,'+'
goto
FinInterrupcion
FinInterrupcion
VisualizaHex Operando3,'='
movf Operando1,W
addwf Operando2,W
addwf Operando3,W
movwf Resultado
call
LCD_Byte
; Visualiza el resultado.
call
LCD_Linea2
; Ahora visualiza la segunda lnea.
movlw MensajeDec
; En pantalla el mensaje "Dec:"
call
LCD_Mensaje
VisualizaDec Operando1,'+'
VisualizaDec Operando2,'+'
VisualizaDec Operando3,'='
VisualizaDec Resultado,' '
clrf
ContadorTeclasPulsadas
; Resetea este contador.
movf PORTB,W
; Necesario en proteus para limpiar flag.
bcf
INTCON,RBIF
retfie
addwf PCL,F
168
MensajeHex
MensajeDec
DT
DT
<TECLADO.INC>
<LCD_4BIT.INC>
<LCD_MENS.INC>
<RETARDOS.INC>
<BIN_BCD.INC>
END
9.8.- Tecla_09.asm
( Entrenador Bsico 7 )
;
;
;
;***************************************************************************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz.
;Reloj instruccin: 250 KHz = 4 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;************** Asignacin de nombres de Registros de Funciones especiales a direcciones ********************
#include <p16f877.inc>
169
(FinClaveSecreta-ClaveSecreta)
#DEFINE CerraduraSalida
PORTA,3
GOTO COMIENZO
GOTO Interrup
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf
CerraduraSalida
bcf STATUS,RP0
call
LCD_Inicializa
call
InicializaTodo
call
Teclado_Inicializa
movlw b'10001000'
movwf INTCON
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
; Define como salida.
; Ir al Banco 0.
; Inicializar el LCD.
; Inicializa el resto de los registros.
; Configura las lneas del teclado.
; Habilita la interrupcin RBI y la general.
sleep
goto
call
Teclado_LeeHex
; Segn va introduciendo los dgitos de la clave, estos van siendo almacenados a partir de
; las posiciones RAM "ClaveTecleada" mediante direccionamiento indirecto y utilizando el
; FSR como apuntador. Por cada dgito ledo en pantalla se visualiza un asterisco.
movwf INDF
call Teclado_EsperaDejePulsar
movlw '*'
170
call
incf
incf
movlw
subwf
btfss
goto
LCD_Caracter
FSR,F
ContadorCaracteres,F
LongitudClave
ContadorCaracteres,W
STATUS,C
Fin_Interr
LCD_Borra
ContadorCaracteres
ClaveTecleada
FSR
; Borra la pantalla.
; Va a leer el primer carcter almacenado en ROM.
; Apunta a la primera posicin de RAM donde se ha
; guardado la clave tecleada.
INDF,W
GuardaClaveTecleada
ContadorCaracteres,W
LeeClaveSecreta
GuardaClaveTecleada,W
STATUS,Z
ClaveIncorr
FSR,F
ContadorCaracteres,F
LongitudClave
ContadorCaracteres,W
STATUS,C
Comp_Claves
LCD_Linea2
MensajeAbraPuerta
LCD_Mensaje
CerraduraSalida
goto
Retardo
segundos.
ClaveIncorr
movlw MensajeClaveIncorrecta
call
LCD_Mensaje
goto Retardo1
Retardo
Retardo1
call
call
call
Fin_Interr
movf
bcf
Retardo_2s
Retardo_500ms
InicializaTodo
PORTB,W
INTCON,RBIF
171
retfie
;*********************************** Subrutina "InicializaTodo" ********************************************************
InicializaTodo bcf
clrf
movlw
movwf
call
movlw
call
call
CerraduraSalida
ContadorCaracteres
ClaveTecleada
FSR
LCD_Borra
MensajeTeclee
LCD_Mensaje
LCD_Linea2
; Desactiva la cerradura.
; Inicializa este contador.
; FSR apunta a la primera direccin de la RAM
; donde se va a almacenar la clave tecleada.
; Borra la pantalla.
; Aparece el mensaje para que introduzca la clave.
; Los asteriscos se visualizan en la segunda lnea.
return
;************************************ Subrutina "Mensajes" *************************************************************
Mensajes
addwf PCL,F
MensajeTeclee
MensajeClaveCorrecta
MensajeAbraPuerta
MensajeClaveIncorrecta
DT
DT
DT
DT
addwf PCL,F
ClaveSecreta
DT
DT
4h,5h,6h,1h
7h,8h
FinClaveSecreta
;*********************************************** Libreras ****************************************************************
INCLUDE
INCLUDE
INCLUDE
INCLUDE
<TECLADO.INC>
<LCD_4BIT.INC>
<LCD_MENS.INC>
<RETARDOS.INC>
172
173
10.1.- Tecla_10.asm
;
;
;
;***************************************************************************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz.
;Reloj instruccin: 250 KHz = 4 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;****************** Asignacin de nombres de Registros de Funciones especiales a direcciones ****************
#include <p16f877.inc>
(FinClaveSecreta-ClaveSecreta)
174
GOTO COMIENZO
GOTO Interrup
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
clrf TRISD
clrf TRISC
bcf STATUS,RP0
movlw D'09'
movwf PORTC
clrf ContadorPAP
call
LCD_Inicializa
call
InicializaTodo
call
Teclado_Inicializa
movlw b'10001000'
movwf INTCON
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como seales digitales.
; Poner el PORTD como salida de datos.
; Poner el PORTC como salida de datos.
; Ir al Banco 0.
; Inicializar el motor PAP en una posicin inicial.
; Inicializar el LCD.
; Inicializa el resto de los registros.
; Configura las lneas del teclado.
; Habilita la interrupcin RBI y la general.
sleep
goto
Teclado_LeeHex
; Segn va introduciendo los dgitos de la clave, estos van siendo almacenados a partir de
; las posiciones RAM "ClaveTecleada" mediante direccionamiento indirecto y utilizando el
; FSR como apuntador. Por cada digito ledo en pantalla se visualiza un asterisco.
movwf INDF
call Teclado_EsperaDejePulsar
movlw '*'
call
LCD_Caracter
incf
FSR,F
175
incf
movlw
subwf
btfss
goto
ContadorCaracteres,F
LongitudClave
ContadorCaracteres,W
STATUS,C
Fin_Interr
LCD_Borra
ContadorCaracteres
ClaveTecleada
FSR
; Borra la pantalla.
; Va a leer el primer carcter almacenado en ROM.
; Apunta a la primera posicin de RAM donde se ha
; guardado la clave tecleada.
INDF,W
GuardaClaveTecleada
ContadorCaracteres,W
LeeClaveSecreta
GuardaClaveTecleada,W
STATUS,Z
ClaveIncorr
FSR,F
ContadorCaracteres,F
LongitudClave
ContadorCaracteres,W
STATUS,C
Comp_Claves
inc_cont_pap
esperar
movf ContadorPAP,W
call codigos_PAP
movwf PORTC
call
Retardo_100ms
movlw D'08'
subwf ContadorPAP,W
btfss STATUS,Z
goto inc_cont_pap
goto esperar
incf ContadorPAP,F
goto Abrir_puerta
; Abrir puerta
bcf
bsf
call
movlw
PORTD,1
PORTD,0
LCD_Linea1
MensajeAbraPuerta
176
call
call
movlw
call
call
call
LCD_Mensaje
LCD_Linea2
Tiempo1
LCD_Mensaje
Retardo_2s
LCD_Borra
Cerrar_puerta bsf
PORTD,1
bcf
PORTD,0
decf ContadorPAP,F
sigui_codigo
movf ContadorPAP,W
call codigos_PAP
movwf PORTC
call
Retardo_100ms
decfsz ContadorPAP,F
goto
sigui_codigo
movf ContadorPAP,W
call codigos_PAP
movwf PORTC
call
Retardo_100ms
goto
ir_inicializar
; Cerrar la puerta
; Marcar el LED de Cerrado.
ClaveIncorr
movlw MensajeClaveIncorrecta
call
LCD_Mensaje
call
Retardo_500ms
ir_inicializar
call InicializaTodo
movlw B'11110000'
; Inicializar proceso.
; Necesario en proteus para que el teclado pueda
interrumpir.
movwf PORTB
Fin_Interr
movf
bcf
PORTB,W
INTCON,RBIF
retfie
;*********************************** Subrutina "InicializaTodo" ********************************************************
InicializaTodo bsf
bcf
clrf
movlw
movwf
call
movlw
call
call
PORTD,1
PORTD,0
ContadorCaracteres
ClaveTecleada
FSR
LCD_Borra
MensajeTeclee
LCD_Mensaje
LCD_Linea2
return
;************************************ Subrutina "Mensajes" *************************************************************
Mensajes
addwf PCL,F
MensajeTeclee
DT
MensajeClaveCorrecta DT
MensajeAbraPuerta
DT
MensajeEsperar
DT
MensajeClaveIncorrecta
177
Tiempo1
DT
addwf PCL,F
DT
DT
4h,5h,6h,1h
7h,8h
FinClaveSecreta
;****************************************** Subrutina "Motor_PAP" *****************************************************
codigos_PAP
addwf PCL,F
DT
09h,08h,0Ch,04h,06h,02h,03h,01h
<TECLADO.INC>
<LCD_4BIT.INC>
<LCD_MENS.INC>
<RETARDOS.INC>
; Fin del programa.
178
179
( Entrenador Bsico 8 )
11.1.- I2C1.asm
title " Leer un dato del circuito integrado expansor de bus PCF8476 y transmitirlo a travs "
title " del bus I2C al microprocesador. Transferir el dato del microprocesador a otro C.I. PCF8476"
;******************************************** I2C1.asm ******************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:4 MHz.
;Reloj instruccin: 1 MHz = 1 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;********** Asignacin de nombres de Registros de Funciones especiales a direcciones ************************
#include <p16f877.inc>
GOTO COMIENZO
CALL Bit_start_I2C
MOVLW ESCLAVO1
179
CALL Transmitir_dato_I2C
;
;
;
;
CALL Recibir_dato_I2C
MOVWF GUARDAR_DATO
CALL ReStart_I2C
COMF GUARDAR_DATO,W
CALL Transmitir_dato_I2C
CALL Bit_stop_I2C
GOTO RECIBIR
; Repetir proceso.
END
11.2.- I2C2.asm
( Entrenador Bsico 8 )
title " Leer un dato del circuito integrado expansor de bus PCF8476 y transmitirlo a travs "
title " del bus I2C al microprocesador. Transferir el dato del microprocesador a otro C.I. PCF8476"
title " interrumpiendo un programa principal "
;******************************************** I2C2.asm ******************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:4 MHz.
;Reloj instruccin: 1 MHz = 1 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;************** Asignacin de nombres de Registros de Funciones especiales a direcciones ********************
#include <p16f877.inc>
180
GOTO COMIENZO
0X04
GOTO INTERRUP
; Ir a la rutina de Interrupcin.
; Ir al Banco 1.
BCF OPTION_REG,INTEDG
BCF OPTION_REG,7
BSF INTCON,INTF
BSF INTCON,INTE
BSF INTCON,GIE
BCF STATUS,RP0
; Ir al Banco 0.
CALL Bit_start_I2C
MOVLW ESCLAVO1
CALL Transmitir_dato_I2C
CALL Recibir_dato_I2C
MOVWF GUARDAR_DATO
receptor.
181
CALL ReStart_I2C
TRANSMITIR MOVLW ESCLAVO2
CALL Transmitir_dato_I2C
COMF GUARDAR_DATO,W
CALL Transmitir_dato_I2C
CALL Bit_stop_I2C
BCF INTCON,INTF
RETFIE
;*************************************************** LIBRERIAS *********************************************************
INCLUDE <I2C.INC>
END
11.3.- I2C3.asm
( Entrenador Bsico 8 )
title " Realizar una conversin Analgica / Digital y transmitirla a los expansores de bus PCF8476 "
;******************************************** I2C3.asm ******************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:4 MHz.
;Reloj instruccin: 1 MHz = 1 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;**************** Asignacin de nombres de Registros de Funciones especiales a direcciones ******************
#include <p16f877.inc>
182
CBLOCK 0X20
GUARDAR_DATO
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG
GOTO COMIENZO
BSF STATUS,RP0
BSF TRISA,5
MOVLW B'00000000'
MOVWF ADCON1
BCF STATUS,RP0
MOVLW B'00100001'
MOVWF ADCON0
; Ir al Banco 1.
; Configuracion del Conversor Analogico/Digital.
CALL Retardo_100ms
BSF ADCON0,GO_DONE
BTFSC ADCON0,GO_DONE
GOTO SEG1
SEG1
MOVF ADRESH,W
; Preguntamos si el dato convertido es idntico al anterior.
SUBWF GUARDAR_DATO,W
BTFSC STATUS,Z
GOTO SEG2
MOVF ADRESH,W
; Guardamos dato nuevo.
MOVWF GUARDAR_DATO
CALL Bit_start_I2C
MOVLW ESCLAVO2
CALL Transmitir_dato_I2C
MOVF GUARDAR_DATO,W
CALL Transmitir_dato_I2C
CALL Bit_stop_I2C
CALL Bit_start_I2C
MOVLW ESCLAVO1
CALL Transmitir_dato_I2C
183
;
;
COMF GUARDAR_DATO,W
CALL Transmitir_dato_I2C
CALL Bit_stop_I2C
GOTO SEG2
;************************************************** LIBRERIAS **********************************************************
INCLUDE <I2C.INC>
INCLUDE <Retardos.INC>
END
184
186
12.1.- I2C4.asm
title " Leer datos cada vez que activamos un Pulsador, de circuitos integrados expansores
title " de bus PCF8476 y transmitirlo a travs del bus I2C al microprocesador. "
title " Transferir los datos del microprocesador a otros C.I. PCF8476"
;******************************************** I2C4.asm ******************************************************************
;Programa para PIC 16F877.
;Velocidad del Reloj:4 MHz.
;Reloj instruccin: 1 MHz = 1 uS.
;Perro Guardin deshabilitado.
;Tipo de Reloj XT.
;Proteccin de Cdigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;*************** Asignacin de nombres de Registros de Funciones especiales a direcciones *******************
#include <p16f877.inc>
EQU
EQU
EQU
EQU
B'01000001'
B'01000011'
B'01001000'
B'01001100'
0X00
GOTO COMIENZO
; Ir al Banco 1
; Poner PB0 como entrada de datos.
; Ir al Banco 0
187
SEG1
SEG2
BTFSC PORTB,0
GOTO SEG1
CALL Bit_start_I2C
MOVLW ESCLAVO1
CALL Transmitir_dato_I2C
CALL Recibir_dato_I2C
MOVWF GUARDAR_DATO
CALL ReStart_I2C
MOVLW ESCLAVO3
CALL Transmitir_dato_I2C
MOVF GUARDAR_DATO,W
CALL Transmitir_dato_I2C
CALL Bit_stop_I2C
CALL Bit_start_I2C
MOVLW ESCLAVO2
CALL Transmitir_dato_I2C
CALL Recibir_dato_I2C
MOVWF GUARDAR_DATO
CALL ReStart_I2C
MOVLW ESCLAVO4
CALL Transmitir_dato_I2C
MOVF GUARDAR_DATO,W
CALL Transmitir_dato_I2C
CALL Bit_stop_I2C
BTFSS PORTB,0
GOTO SEG2
GOTO SEG1
END
12.2.- I2C5.asm
EQU
EQU
EQU
EQU
B'01000001'
B'01000011'
B'01001000'
B'01001100'
0X00
GOTO COMIENZO
0X04
GOTO INTERRUP
; Ir a la Rutina de Interrupcin
189
BSF STATUS,RP0
BCF OPTION_REG,INTEDG
BCF OPTION_REG,7
BSF INTCON,RBIF
BSF INTCON,RBIE
BSF INTCON,GIE
BCF STATUS,RP0
; Ir al Banco 1
; Interrupcin por flanco descendente.
; Activamos las resistencias PULL-UP del PORTB
; Ponemos a 1 la Bandera de Interrupcin de
; las Patilla (RB7..RB4).
; Permitimos las Interrupciones de las Patilla (RB7..RB4).
; Activamos todas las Interrupciones.
; Ir al Banco 0
CALL Bit_start_I2C
MOVLW ESCLAVO1
CALL Transmitir_dato_I2C
CALL Recibir_dato_I2C
MOVWF GUARDAR_DATO
CALL ReStart_I2C
MOVLW ESCLAVO3
CALL Transmitir_dato_I2C
MOVF GUARDAR_DATO,W
CALL Transmitir_dato_I2C
CALL Bit_stop_I2C
CALL Bit_start_I2C
MOVLW ESCLAVO2
CALL Transmitir_dato_I2C
CALL Recibir_dato_I2C
MOVWF GUARDAR_DATO
CALL ReStart_I2C
MOVLW ESCLAVO4
CALL Transmitir_dato_I2C
190
transmisor.
MOVF GUARDAR_DATO,W
CALL Transmitir_dato_I2C
CALL Bit_stop_I2C
MOVF PORTB,W
BCF
INTCON,RBIF
RETFIE
;************************************************** LIBRERIAS *********************************************************
INCLUDE <I2C.INC>
END
191
192
( Entrenador Bsico 9 )
13.1.- I2C6.asm
title " Leer constantemente la entrada analogica ANI0 del Esclavo 1 (PCF8591) "
title " y visualiza la tension en la pantalla del modulo LCD."
;******************************************** I2C6.asm ******************************************************************
;Programa para PIC 16F876.
;Velocidad del Reloj:1 MHz.
;Reloj instruccion: 250 KHz = 4 uS.
;Perro Guardian deshabilitado.
;Tipo de Reloj XT.
;Proteccion de Codigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f876, f=inhx32
;******************** Asignacion de nombres de Registros de Funciones especiales a direcciones **************
#include <p16f876.inc>
EQU
EQU
b'10011110'
b'10011111'
GOTO COMIENZO
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf
STATUS,RP0
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como senales digitales.
call
; Inicializar el LCD.
LCD_Inicializa
193
call Config_transmision_I2C
; Configuracion Bus_I2C
call
Bit_start_I2C
movlw Esclavo1_Escritura_sensor
call Transmitir_dato_I2C
movlw b'00000000'
call
Transmitir_dato_I2C
call
ReStart_I2C
movlw Esclavo1_Lectura_sensor
call Transmitir_dato_I2C
call
Recibir_dato_I2C
call
Bit_stop_I2C
call
LCD_Linea1
movlw Mensaje1
call
LCD_Mensaje
call Bit_start_I2C
movlw Esclavo1_Lectura_sensor
CALL Transmitir_dato_I2C
call
Recibir_dato_I2C
call
Bit_stop_I2C
call
Visualiza
goto
Principal
194
;
;
;
Visualiza
movwf
call
movlw
call
movf
call
movf
call
movlw
call
movf
call
movf
call
movlw
call
Auxiliar
LCD_Linea2
MensajeTension
LCD_Mensaje
Auxiliar,W
BIN_a_BCD
BCD_Centenas,W
LCD_Nibble
'.'
LCD_Caracter
BCD_Decenas,W
LCD_Nibble
BCD_Unidades,W
LCD_Nibble
MensajeVoltios
LCD_Mensaje
; Lo guarda.
; Se sita al principio de la primera lnea.
; Visualiza la tensin deseada.
; Recupera el dato a visualizar y lo
; pasa a BCD.
; Visualiza las centenas que corresponden a las
; unidades de voltios.
; Visualiza el punto decimal.
; Visualiza las decenas que corresponden a las
; dcimas de voltios.
; Visualiza las unidades que corresponden a las
; centsimas de voltios.
return
;*********************************** Subrutina "Mensajes" **************************************************************
Mensajes
addwf PCL,F
MensajeTension
MensajeVoltios
Mensaje1
<RETARDOS.INC>
<BIN_BCD.INC>
<LCD_4BIT.INC>
<LCD_MENS.INC>
<I2C.INC>
END
13.2.- I2C7.asm
( Entrenador Bsico 9 )
195
title " En la salida analogica del Esclavo 2 (PCF8591) que trabaja como DAC se
obtiene una tension seleccionada "
title " por un pulsador conectado a la linea RB6 del PIC. La tension varia entre
0,50 y 2,50 V en "
title " saltos de 0,25 V y se visualiza en el modulo LCD."
;******************************************** I2C7.asm ******************************************************************
;Programa para PIC 16F876.
;Velocidad del Reloj:1 MHz.
;Reloj instruccion: 250 KHz = 4 uS.
;Perro Guardian deshabilitado.
;Tipo de Reloj XT.
;Proteccion de Codigo: OFF.
;************************************** Elegimos PIC ********************************************************************
list p=16f876, f=inhx32
;****************** Asignacion de nombres de Registros de Funciones especiales a direcciones ****************
#include <p16f876.inc>
EQU
#DEFINE IncrementarPulsador
b'10010010'
PORTB,6
GOTO COMIENZO
196
ORG 0X05
Mensajes
addwf PCL,F
MensajeTension
MensajeVoltios
clrf
bsf
movlw
movwf
PORTA
STATUS,RP0
0x06
ADCON1
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como senales digitales.
bcf
STATUS,RP0
call
call
LCD_Inicializa
Config_transmision_I2C
bsf
bsf
bcf
STATUS,RP0
IncrementarPulsador
STATUS,RP0
call
call
call
CargaInicialContador
PCF8591_DAC
Visualiza
movlw b'10001000'
movwf INTCON
; Configuracion Bus_I2C
sleep
goto
Retardo_20ms
btfsc IncrementarPulsador
goto
FinInterrupcion
IncrementarTensionDeseada
FinInterrupcion
call
call
IncrementaContador
PCF8591_DAC
call
call
btfss
goto
movf
Visualiza
Retardo_100ms
IncrementarPulsador
IncrementarTensionDeseada
PORTB,W
197
bcf
retfie
INTCON,RBIF
call
Bit_start_I2C
movlw PCF8591_DireccionEscritura
CALL Transmitir_dato_I2C
movlw b'01000000'
call
Transmitir_dato_I2C
movf
call
PCF8591_Dato,W
Transmitir_dato_I2C
movf
call
call
PCF8591_Dato,W
Transmitir_dato_I2C
Bit_stop_I2C
movf
PCF8591_Dato,W
return
;************************** Subrutinas "IncrementaContador" y "CargaInicialContador" ****************************
CBLOCK
Contador
ENDC
ValorMinimo
ValorMaximo
SaltoIncremento
EQU
EQU
d'50'
d'250'
EQU d'25'
IncrementaContador
movlw
addwf
btfsc
goto
movf
sublw
btfsc
goto
movlw
movwf
movf
return
SaltoIncremento
Contador,F
STATUS,C
CargaInicialContador
Contador,W
ValorMaximo
STATUS,C
FinIncrementar
ValorMinimo
Contador
Contador,W
CargaInicialContador
FinIncrementar
198
movwf
call
movlw
call
movf
call
movf
call
movlw
call
movf
call
movf
call
movlw
call
return
Auxiliar
LCD_Linea1
MensajeTension
LCD_Mensaje
Auxiliar,W
BIN_a_BCD
BCD_Centenas,W
LCD_Nibble
'.'
LCD_Caracter
BCD_Decenas,W
LCD_Nibble
BCD_Unidades,W
LCD_Nibble
MensajeVoltios
LCD_Mensaje
; Lo guarda.
; Se situa al principio de la primera linea.
; Visualiza la tension deseada.
; Recupera el dato a visualizar y lo
; pasa a BCD.
; Visualiza las centenas que corresponden a las
; unidades de voltios.
; Visualiza el punto decimal.
; Visualiza las decenas que corresponden a las
; decimas de voltios.
; Visualiza las unidades que corresponden a las
; centesimas de voltios.
<I2C1.INC>
<RETARDOS.INC>
<BIN_BCD.INC>
<LCD_4BIT.INC>
<LCD_MENS.INC>
END
13.3.- I2C8.asm
( Entrenador Bsico 9 )
title " Leer constantemente la entrada analogica ANI0 del Esclavo 1(PCF8591),
llevarla al Esclavo 2(PCF8591) "
title " y visualiza la tension en la pantalla del modulo LCD."
;******************************************** I2C8.asm ******************************************************************
;Programa para PIC 16F876.
;Velocidad del Reloj:1 MHz.
;Reloj instruccion: 250 KHz = 4 uS.
;Perro Guardian deshabilitado.
;Tipo de Reloj XT.
;Proteccion de Codigo: OFF.
;************************************** Elegimos PIC ********************************************************************
199
EQU
EQU
b'10011110'
b'10011111'
Esclavo2_Escritura
EQU
b'10010010'
GOTO COMIENZO
clrf PORTA
bsf STATUS,RP0
movlw 0x06
movwf ADCON1
bcf
STATUS,RP0
; Reseteamos el PORTA.
; Ir al Banco 1.
; Poner el PORTA como senales digitales.
call
; Inicializar el LCD.
LCD_Inicializa
call Config_transmision_I2C
; Configuracion Bus_I2C
call
Bit_start_I2C
movlw Esclavo1_Escritura_sensor
call Transmitir_dato_I2C
200
movlw b'00000000'
call
Transmitir_dato_I2C
call
ReStart_I2C
movlw Esclavo1_Lectura_sensor
call Transmitir_dato_I2C
call
Recibir_dato_I2C
call
Bit_stop_I2C
call
LCD_Linea1
movlw Mensaje1
call
LCD_Mensaje
call Bit_start_I2C
movlw Esclavo1_Lectura_sensor
CALL Transmitir_dato_I2C
call
Recibir_dato_I2C
call
movwf
call
movf
call
goto
Bit_stop_I2C
Dato_ADC
Visualiza
Dato_ADC,w
Esclavo2_DAC
Principal
Visualiza
movwf Auxiliar
; Lo guarda.
call
LCD_Linea2
; Se situa al principio de la primera linea.
movlw MensajeTension
; Visualiza la tension deseada.
201
call
movf
call
movf
call
movlw
call
movf
call
movf
call
movlw
call
LCD_Mensaje
Auxiliar,W
BIN_a_BCD
BCD_Centenas,W
LCD_Nibble
'.'
LCD_Caracter
BCD_Decenas,W
LCD_Nibble
BCD_Unidades,W
LCD_Nibble
MensajeVoltios
LCD_Mensaje
return
;*********************************** Subrutina "Mensajes" **************************************************************
Mensajes
addwf PCL,F
MensajeTension
DT " Ve = ", 0x00
MensajeVoltios DT " V ", 0x00
Mensaje1
DT "Seal del Sensor", 0X00
;**************************************** Subrutina "Esclavo2_DAC " **************************************************
; Escribe en el Esclavo 2 con el dato del registro W para su conversion a tension analagica.
Esclavo2_DAC
movwf Dato_DAC
call
Bit_start_I2C
movlw Esclavo2_Escritura
CALL Transmitir_dato_I2C
movlw b'01000000'
call
Transmitir_dato_I2C
movf
call
Dato_DAC,W
Transmitir_dato_I2C
movf
call
call
Dato_DAC,W
Transmitir_dato_I2C
Bit_stop_I2C
return
;*************************************************** LIBRERIAS *********************************************************
INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE
<RETARDOS.INC>
<BIN_BCD.INC>
<LCD_4BIT.INC>
<LCD_MENS.INC>
<I2C1.INC>
END
13.4.- I2C.INC
( Entrenador Bsico 9 )
202
BSF STATUS,RP0
BSF TRISC,4
BSF TRISC,3
MOVLW 0X09
MOVWF SSPADD
BCF STATUS,RP0
BCF PIR1,SSPIF
BSF SSPCON,SSPM3
BCF SSPCON,SSPM2
BCF SSPCON,SSPM1
BCF SSPCON,SSPM0
BSF SSPCON,SSPEN
GOTO VOLVER
Bit_start_I2C
BSF STATUS,RP0
BSF SSPCON2,SEN
BCF STATUS,RP0
BTFSS PIR1,SSPIF
GOTO $-1
BCF
PIR1,SSPIF
GOTO VOLVER
Transmitir_dato_I2C
MOVWF SSPBUF
BCF STATUS,RP0
BTFSS PIR1,SSPIF
GOTO $-1
BCF
PIR1,SSPIF
BSF STATUS,RP0
BCF STATUS,RP0
GOTO VOLVER
Recibir_dato_I2C
BSF STATUS,RP0
BSF SSPCON2,RCEN
203
BCF STATUS,RP0
BTFSS PIR1,SSPIF
GOTO $-1
BCF
PIR1,SSPIF
MOVF SSPBUF,W
BSF STATUS,RP0
BSF SSPCON2,ACKDT
BSF SSPCON2,ACKEN
BCF STATUS,RP0
BTFSS PIR1,SSPIF
GOTO $-1
BCF
PIR1,SSPIF
GOTO VOLVER
Bit_stop_I2C
BSF STATUS,RP0
BSF SSPCON2,PEN
BCF STATUS,RP0
BTFSS PIR1,SSPIF
GOTO $-1
BCF
PIR1,SSPIF
GOTO VOLVER
ReStart_I2C
BSF
BSF
BCF
BTFSS
GOTO
BCF
VOLVER
RETURN
13.5.- I2C1.INC
STATUS,RP0
SSPCON2,RSEN
STATUS,RP0
PIR1,SSPIF
$-1
PIR1,SSPIF
( Entrenador Bsico 9 )
204
BSF STATUS,RP0
BSF TRISC,4
BSF TRISC,3
MOVLW 0X09
MOVWF SSPADD
BCF STATUS,RP0
BCF PIR1,SSPIF
BSF SSPCON,SSPM3
BCF SSPCON,SSPM2
BCF SSPCON,SSPM1
BCF SSPCON,SSPM0
BSF SSPCON,SSPEN
GOTO VOLVER
Bit_start_I2C
BSF STATUS,RP0
BSF SSPCON2,SEN
BCF STATUS,RP0
BTFSS PIR1,SSPIF
GOTO $-1
BCF
PIR1,SSPIF
GOTO VOLVER
Transmitir_dato_I2C
MOVWF SSPBUF
BCF STATUS,RP0
BTFSS PIR1,SSPIF
GOTO $-1
BCF
PIR1,SSPIF
GOTO VOLVER
Recibir_dato_I2C
BSF STATUS,RP0
BSF SSPCON2,RCEN
BCF STATUS,RP0
BTFSS PIR1,SSPIF
GOTO $-1
BCF
PIR1,SSPIF
MOVF SSPBUF,W
BSF STATUS,RP0
205
BSF SSPCON2,ACKDT
BSF SSPCON2,ACKEN
BCF STATUS,RP0
llegado el Dato.
BTFSS PIR1,SSPIF
GOTO $-1
BCF
PIR1,SSPIF
GOTO VOLVER
Bit_stop_I2C
BSF STATUS,RP0
BSF SSPCON2,PEN
BCF STATUS,RP0
BTFSS PIR1,SSPIF
GOTO $-1
BCF
PIR1,SSPIF
GOTO VOLVER
ReStart_I2C
BSF
BSF
BCF
BTFSS
GOTO
BCF
STATUS,RP0
SSPCON2,RSEN
STATUS,RP0
PIR1,SSPIF
$-1
PIR1,SSPIF
VOLVER
RETURN
206
207
( Entrenador Bsico 10 )
14.1.- RTS232_1.asm
title " En la pantalla del modulo LCD se visualizaran los caracteres que se reciban "
title " a travs del puerto serie del ordenador. Lo que se escriba por el teclado del "
title " ordenador aparecer en la pantalla del sistema con microcontrolador."
;************************************************* RTS232_1.asm ******************************************************
; Se utilizara un programa de comunicaciones para que el ordenador pueda enviar datos a travs
; de su puerto serie. Este programa puede ser el Hyperterminal de Windows o alguno similar.
; Programa para PIC 16F876a.
; Velocidad del Reloj:1 MHz.
; Reloj instruccin: 250 KHz = 4 uS.
; Perro Guardin deshabilitado.
; Tipo de Reloj XT.
; Proteccin de Cdigo: OFF.
; Power Reset: ON
;************************************** Elegimos PIC ********************************************************************
LIST p=16F876
;***************** Asignacin de nombres de Registros de Funciones especiales a direcciones *****************
INCLUDE <P16F876.INC>
0x20
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00
GOTO COMIENZO
BSF STATUS,RP0
MOVLW D'06'
MOVWF ADCON1
BCF STATUS,RP0
call
LCD_Inicializa
call
RS232_Inicializa
208
call
call
goto
RS232_LeeDato
LCD_Caracter
Principal
END
( Entrenador Bsico 10 )
14.2.- RTS232_2.asm
title " En el modulo LCD se visualizan los caracteres que se escriban en el teclado "
title " del ordenador y se transmiten a travs de su puerto serie. Estos datos "
title " volvern a ser enviados por el microcontrolador al ordenador, para que se
title " visualicen en su monitor."
;************************************************** RTS232_2.asm *****************************************************
; Se utilizara un programa de comunicaciones para que el ordenador pueda enviar datos
; a travs de su puerto serie, como el HyperTerminal de Windows o alguno similar.
; Concluyendo, lo que se escriba en el teclado del ordenador aparecer en la pantalla del
; modulo LCD y en el monitor del HyperTerminal.
; Programa para PIC 16F876a.
; Velocidad del Reloj:1 MHz.
; Reloj instruccin: 250 KHz = 4 uS.
; Perro Guardin deshabilitado.
; Tipo de Reloj XT.
; Proteccin de Cdigo: OFF.
; Power Reset: ON
;************************************** Elegimos PIC ********************************************************************
LIST p=16F876
;**************** Asignacin de nombres de Registros de Funciones especiales a direcciones ******************
INCLUDE <P16F876.INC>
0x20
GuardaDato
ENDC
209
GOTO COMIENZO
BSF STATUS,RP0
MOVLW D'06'
MOVWF ADCON1
BCF STATUS,RP0
call
LCD_Inicializa
call
RS232_Inicializa
call
RS232_LeeDato
movwf GuardaDato
call
LCD_Caracter
movf
call
goto
GuardaDato,W
RS232_EnviaDato
Principal
; Repite el proceso.
14.3.- RTS232_3.asm
( Entrenador Bsico 10 )
title " Lo que se escriba por el teclado se visualiza en el LCD y en el monitor del "
title " ordenador, pero en este ultimo se visualiza un solo carcter por lnea."
;************************************************ RTS232_3.asm *******************************************************
; Programa para PIC 16F876a.
; Velocidad del Reloj:1 MHz.
; Reloj instruccin: 250 KHz = 4 uS.
; Perro Guardin deshabilitado.
; Tipo de Reloj XT.
; Proteccin de Cdigo: OFF.
; Power Reset: ON
;************************************** Elegimos PIC ********************************************************************
LIST p=16F876
210
EQU
d'13'
0x20
GuardaDato
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00
GOTO COMIENZO
BSF STATUS,RP0
MOVLW D'06'
MOVWF ADCON1
BCF STATUS,RP0
call
LCD_Inicializa
call
RS232_Inicializa
call
RS232_LeeDato
movwf GuardaDato
call
LCD_Caracter
movf
call
movlw
call
GuardaDato,W
RS232_EnviaDato
RetornoCarro
RS232_EnviaDato
goto
Principal
211
( Entrenador Bsico 10 )
14.4.- RTS232_4.asm
title " En el modulo LCD se visualizan los caracteres que se escriben en el teclado "
title " del ordenador. Si pulsa la tecla Enter se comienza a escribir en la segunda "
title " lnea de la pantalla del modulo LCD. "
;************************************************ RTS232_4.asm *******************************************************
; Programa para PIC 16F876a.
; Velocidad del Reloj:1 MHz.
; Reloj instruccion: 250 KHz = 4 uS.
; Perro Guardin deshabilitado.
; Tipo de Reloj XT.
; Proteccin de Cdigo: OFF.
; Power Reset: ON
;************************************** Elegimos PIC ********************************************************************
LIST p=16F876
;***************** Asignacin de nombres de Registros de Funciones especiales a direcciones *****************
INCLUDE <P16F876.INC>
EQU
EQU
d'13'
d'10'
0x20
GuardaDato
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00
GOTO COMIENZO
BSF STATUS,RP0
MOVLW D'06'
MOVWF ADCON1
BCF STATUS,RP0
call
LCD_Inicializa
call
RS232_Inicializa
212
call
movwf
sublw
btfsc
goto
movf
call
goto
RS232_LeeDato
; Espera recibir un caracter.
GuardaDato
; Guarda el dato recibido.
RetornoCarro
; Comprueba si ha pulsado la tecla Enter.
STATUS,Z
SaltaLinea2
; Si, es Enter y por tanto salta a la linea 2.
GuardaDato,W
; No es Enter y por tanto lo visualiza
LCD_Caracter
; en el LCD.
Env_Carac_a_Ordenador
SaltaLinea2
call
call
movlw
call
LCD_Linea2
RS232_EnviaDato
CambioLinea
RS232_EnviaDato
Env_Carac_a_Ordenador
movf
call
goto
GuardaDato,W
RS232_EnviaDato
Principal
14.5.- RTS232_5.asm
( Entrenador Bsico 10 )
title " Este programa enva un mensaje grabado en la memoria de programa del "
title " microcontrolador al ordenador. Es decir, en el monitor del ordenador "
title " aparecer el mensaje grabado en el PIC."
;************************************************** RTS232_5.asm *****************************************************
; Programa para PIC 16F876a.
; Velocidad del Reloj:1 MHz.
; Reloj instruccin: 250 KHz = 4 uS.
; Perro Guardin deshabilitado.
; Tipo de Reloj XT.
; Proteccin de Cdigo: OFF.
; Power Reset: ON
;************************************** Elegimos PIC ********************************************************************
LIST p=16F876
;***************** Asignacin de nombres de Registros de Funciones especiales a direcciones *****************
INCLUDE <P16F876.INC>
213
EQU
d'13'
0x20
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00
GOTO COMIENZO
call
call
LCD_Inicializa
RS232_Inicializa
movlw
call
call
goto
Mensaje0
RS232_Mensaje
Retardo_1s
Principal
addwf PCL,F
Mensaje0
DT RetornoCarro
DT " En el I.E.S. Joan Miro de San Sebastin de los Reyes"
DT RetornoCarro
DT "
se puede estudiar el Ciclo Formativo"
DT RetornoCarro
DT "
DESARROLLO de PRODUCTOS ELECTRONICOS."
DT RetornoCarro, 0x00
<RS232_RT.INC>
<RS232MEN.INC>
<LCD_4BIT.INC>
<RETARDOS.INC>
END
214
( Entrenador Bsico 10 )
14.6.- RTS232_6.asm
title " Este programa enva varios mensajes grabados en la memoria de programa "
title " del microcontrolador al ordenador. Cada mensaje permanecer en pantalla "
title " durante unos segundos hasta que sea sustituido por el siguiente."
;************************************************** RTS232_6.asm *****************************************************
; Programa para PIC 16F876a.
; Velocidad del Reloj:1 MHz.
; Reloj instruccin: 250 KHz = 4 uS.
; Perro Guardin deshabilitado.
; Tipo de Reloj XT.
; Proteccin de Cdigo: OFF.
; Power Reset: ON
;************************************** Elegimos PIC ********************************************************************
LIST p=16F876
;**************** Asignacin de nombres de Registros de Funciones especiales a direcciones ******************
INCLUDE <P16F876.INC>
EQU
d'13'
0x20
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00
GOTO COMIENZO
Mensajes
Mensaje0
Mensaje1
215
Mensaje2
FinMensajes
IF (FinMensajes > 0xFF)
ERROR
MESSG
correctamente."
ENDIF
;*************************************** Seccin de Configuracin *****************************************************
COMIENZO
call
RS232_Inicializa
movlw
call
movlw
call
movlw
call
goto
Mensaje0
VisualizaMensaje
Mensaje1
VisualizaMensaje
Mensaje2
VisualizaMensaje
Principal
call
call
call
call
RS232_Mensaje
RS232_LineasBlanco
Retardo_1s
RS232_LineasBlanco
; Lo visualiza en el ordenador.
; Visualiza unas lineas en blanco despues del
; mensaje durante este tiempo.
; Lneas en blanco al principio del prximo mensaje.
return
;**************************************************** LIBRERIAS ********************************************************
INCLUDE <RS232MEN.INC>
INCLUDE <RS232_RT.INC>
INCLUDE <RETARDOS.INC>
END
216
( Entrenador Bsico 10 )
14.7.- RTS232_7.asm
title " En el monitor del ordenador se visualizan mensajes grabados en la memoria "
title " de programa del microcontrolador. El cambio de mensaje se ejecuta cada "
title " vez que se pulse la tecla Enter."
;************************************************* RTS232_7.asm ******************************************************
; Programa para PIC 16F876a.
; Velocidad del Reloj:1 MHz.
; Reloj instruccin: 250 KHz = 4 uS.
; Perro Guardin deshabilitado.
; Tipo de Reloj XT.
; Proteccin de Cdigo: OFF.
; Power Reset: ON
;************************************** Elegimos PIC ********************************************************************
LIST p=16F876
;********************* Asignacin de nombres de Registros de Funciones especiales a direcciones *************
INCLUDE <P16F876.INC>
EQU
d'13'
0x20
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00
GOTO COMIENZO
Mensajes
Mensaje0
Mensaje1
217
Mensaje2
FinMensajes
IF (FinMensajes > 0xFF)
ERROR
MESSG
correctamente."
ENDIF
;*************************************** Seccin de Configuracin *****************************************************
COMIENZO
call
RS232_Inicializa
call
RS232_LineasBlanco
movlw
call
movlw
call
movlw
call
goto
Mensaje0
Visualiza_y_Espera
Mensaje1
Visualiza_y_Espera
Mensaje2
Visualiza_y_Espera
Principal
call
call
RS232_Mensaje
RS232_LineasBlanco
; Lo visualiza en el ordenador.
; Visualiza unas lneas en blanco.
EsperaPulseEnter
call
xorlw
btfss
goto
RS232_LeeDato
RetornoCarro
STATUS,Z
EsperaPulseEnter
return
;**************************************************** LIBRERIAS ********************************************************
INCLUDE <RS232MEN.INC>
INCLUDE <RS232_RT.INC>
INCLUDE <RETARDOS.INC>
END
218
( Entrenador Bsico 10 )
14.8.- RTS232_8.asm
title " Programa que visualiza en el modulo LCD el cdigo ASCII en formato "
title " hexadecimal de la tecla pulsada y tambin en el monitor del ordenador "
title " en formato decimal. "
;************************************************ RTS232_8.asm *******************************************************
;
Por ejemplo:
;
;
;
;
Monitor del ordenador: " k-107", donde la "k" es la tecla pulsada y el "107" el
cdigo ASCII en formato decimal.
Pantalla del LCD: " k-6B", donde la "k" es la tecla pulsada y el "6B" el
cdigo ASCII en formato hexadecimal.
0x20
GuardaDato
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00
GOTO COMIENZO
BSF STATUS,RP0
MOVLW D'06'
MOVWF ADCON1
219
BCF
call
call
STATUS,RP0
LCD_Inicializa
RS232_Inicializa
call
movwf
call
movf
call
movlw
call
movf
call
RS232_LeeDato
GuardaDato
LCD_Borra
GuardaDato,W
LCD_Caracter
'-'
LCD_Caracter
GuardaDato,W
LCD_ByteCompleto
movlw '-'
call
RS232_EnviaDato
movf
call
movf
call
movf
call
movf
call
GuardaDato,W
; Lo pasa a BCD antes de visualizarlo.
BIN_a_BCD
BCD_Centenas,W
; Visualiza el resultado en la pantalla del
RS232_EnviaNumero ; ordenador comenzando por las centenas.
BCD_Decenas,W
RS232_EnviaNumero
BCD_Unidades,W
RS232_EnviaNumero
movlw
call
movlw
call
''
RS232_EnviaDato
''
RS232_EnviaDato
goto
Principal
<RS232_RT.INC>
<LCD_4BIT.INC>
<RETARDOS.INC>
<BIN_BCD.INC>
END
14.9.- RTS232_9.asm
( Entrenador Bsico 10 )
title " SISTEMA DE MONITORIZACION: Se trata de leer el estado de las entradas "
title " conectadas a las lneas <RB7:RB4> del Puerto B y se envia por el puerto "
title " RS232 a un terminal para monitorizar el estado de los mismos. El estado de "
title " las entradas se mostrara cada 1 segundos. "
;*************************************************** RTS232_9.asm ****************************************************
; Programa para PIC 16F876a.
; Velocidad del Reloj:1 MHz.
; Reloj instruccin: 250 KHz = 4 uS.
; Perro Guardin deshabilitado.
220
EQU
EQU
d'13'
d'10'
#DEFINE
#DEFINE
#DEFINE
#DEFINE
Entrada0
Entrada1
Entrada2
Entrada3
0x20
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00
GOTO COMIENZO
addwf PCL,F
MensajeEntradas
DT RetornoCarro, CambioLinea
DT "Entrada 3 Entrada 2 Entrada 1 Entrada 0"
DT RetornoCarro, CambioLinea
DT "------------ ------------- ------------ ------------"
DT RetornoCarro, CambioLinea, 0x00
MensajeAbierto
DT " Abierto
MensajeCerrado
DT " Cerrado
", 0x00
", 0x00
call
bsf
RS232_Inicializa
STATUS,RP0
bsf
Entrada0
Configura
como
entrada
las
lineas
correspondientes
221
bsf
bsf
bsf
bcf
Entrada1
; resto de las lineas.
Entrada2
Entrada3
OPTION_REG,NOT_RBPU
; Activa las resistencias de Pull_Up del
bcf
call
STATUS,RP0
RS232_LineasBlanco
Puerto B.
; Visualiza unas cuantas lineas en blanco.
call
call
call
goto
btfss
goto
call
goto
Entrada3
; Entrada = 1?, Entrada = Abierta?
Entrada3Cerrado
; No, esta cerrada.
VisualizaAbierto
LeeEntrada2
call
VisualizaCerrado
btfss
goto
call
goto
Entrada2
; Se repite el procedimiento para las
Entrada2Cerrado
; demas entradas.
VisualizaAbierto
LeeEntrada1
call
VisualizaCerrado
btfss
goto
call
goto
Entrada1
Entrada1Cerrado
VisualizaAbierto
LeeEntrada0
call
VisualizaCerrado
btfss
goto
call
goto
Entrada0
Entrada0Cerrado
VisualizaAbierto
FinVisualiza
call
VisualizaCerrado
call
RS232_LineasBlanco
Entrada3Cerrado
LeeEntrada2
Entrada2Cerrado
LeeEntrada1
Entrada1Cerrado
LeeEntrada0
Entrada0Cerrado
FinVisualiza
return
;*************************************** Subrutina "VisualizaAbierto" ************************************************
VisualizaAbierto
movlw MensajeAbierto
call
RS232_Mensaje
return
222
movlw MensajeCerrado
call
RS232_Mensaje
return
;************************************** Librerias ********************************************************************
INCLUDE <RS232_RT.INC>
INCLUDE <RS232MEN.INC>
INCLUDE <RETARDOS.INC>
END
14.10.- RTS23_10.asm
( Entrenador Bsico 10 )
title " SISTEMA DE MONITORIZACION: Se trata de leer el estado de las entradas "
title " conectadas a las lneas <RB7:RB4> del Puerto B y se envia por el puerto "
title " RS232 a un terminal para monitorizar el estado de los mismos. "
title " Se utilizara las interrupciones por cambio de nivel en una lnea del Puerto B, "
title " por ello, las entradas deben conectarse a la parte alta del Puerto B."
;*************************************************** RTS23_10.asm ****************************************************
; Programa para PIC 16F876a.
; Velocidad del Reloj:1 MHz.
; Reloj instruccin: 250 KHz = 4 uS.
; Perro Guardin deshabilitado.
; Tipo de Reloj XT.
; Proteccin de Cdigo: OFF.
; Power Reset: ON
;************************************** Elegimos PIC ********************************************************************
LIST p=16F876
;**************** Asignacin de nombres de Registros de Funciones especiales a direcciones ******************
INCLUDE <P16F876.INC>
EQU
EQU
d'13'
d'10'
#DEFINE
#DEFINE
#DEFINE
#DEFINE
Entrada0
Entrada1
Entrada2
Entrada3
223
0x20
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00
GOTO COMIENZO
addwf PCL,F
MensajeEntradas
DT RetornoCarro, CambioLinea
DT "Entrada 3 Entrada 2 Entrada 1 Entrada 0"
DT RetornoCarro, CambioLinea
DT "------------ ------------- ------------ ------------"
DT RetornoCarro, CambioLinea, 0x00
MensajeAbierto
DT " Abierto
MensajeCerrado
DT " Cerrado
", 0x00
", 0x00
call
bsf
bsf
bsf
bsf
bsf
bcf
bcf
call
call
call
movlw
movwf
RS232_Inicializa
STATUS,RP0
; Configura como entrada las 4 lineas correspondientes
Entrada0
; del Puerto B respetando la configuracion del
Entrada1
; resto de las lineas.
Entrada2
Entrada3
OPTION_REG,NOT_RBPU
; Activa las resistencias de Pull-Up del Puerto B.
STATUS,RP0
RS232_LineasBlanco ; Visualiza unas cuantas lineas en blanco
RS232_LineasBlanco ; para limpiar la pantalla.
LeeEntradasVisualiza ; Lee las entradas y visualiza por primera vez.
b'10001000'
; Habilita la interrupcion RBI y la general.
INTCON
sleep
goto
Principal
224
btfss
goto
call
goto
Entrada3
; Entrada = 1?, Entrada = Abierta?
Entrada3Cerrado
; No, esta cerrada.
VisualizaAbierto
LeeEntrada2
call
VisualizaCerrado
btfss
goto
call
goto
Entrada2
; Se repite el procedimiento para las
Entrada2Cerrado
; demas entradas.
VisualizaAbierto
LeeEntrada1
call
VisualizaCerrado
btfss
goto
call
goto
Entrada1
Entrada1Cerrado
VisualizaAbierto
LeeEntrada0
call
VisualizaCerrado
btfss
goto
call
goto
Entrada0
Entrada0Cerrado
VisualizaAbierto
FinVisualiza
call
VisualizaCerrado
call
bcf
RS232_LineasBlanco
INTCON,RBIF
Entrada3Cerrado
LeeEntrada2
Entrada2Cerrado
LeeEntrada1
Entrada1Cerrado
LeeEntrada0
Entrada0Cerrado
FinVisualiza
retfie
;*************************************** Subrutina "VisualizaAbierto" ************************************************
VisualizaAbierto
movlw MensajeAbierto
call
RS232_Mensaje
return
;*************************************** Subrutina "VisualizaCerrado" ************************************************
VisualizaCerrado
movlw MensajeCerrado
call
RS232_Mensaje
return
;************************************** Librerias ********************************************************************
INCLUDE <RS232_RT.INC>
INCLUDE <RS232MEN.INC>
INCLUDE <RETARDOS.INC>
END
14.11.- RTS23_11.asm
( Entrenador Bsico 10 )
225
SalidaAdelante
SalidaAtras
SalidaIzquierda
SalidaDerecha
PORTB,3
PORTB,2
PORTB,1
PORTB,0
Numero_Espacios
EQU
D'5'
TeclaAdelante
TeclaAtras
TeclaIzquierda
TeclaDerecha
EQU
EQU
EQU
EQU
't'
'b'
'a'
'l'
226
TeclaParada
EQU
''
Espacio
Retorno_de_carro
EQU
EQU
D'32'
D'13'
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00
GOTO COMIENZO
addwf PCL,F
MensajeParado
MensajeAdelante
MensajeAtras
MensajeIzquierda
MensajeDerecha
Blanco
DT " ",0x00
BSF STATUS,RP0
MOVLW D'06'
MOVWF ADCON1
BCF STATUS,RP0
call
LCD_Inicializa
call
RS232_Inicializa
bsf
STATUS,RP0
bcf
SalidaAdelante
bcf
SalidaAtras
bcf
SalidaIzquierda
bcf
SalidaDerecha
bcf
STATUS,RP0
call
Parado
227
Principal
call
call
goto
RS232_LeeDato
TesteaTeclado
Principal
TeclaPulsada
TeclaAdelante
STATUS,Z
Adelante
movf
xorlw
btfsc
goto
TeclaPulsada,W
TeclaAtras
STATUS,Z
Atras
movf
xorlw
btfsc
goto
TeclaPulsada,W
TeclaIzquierda
STATUS,Z
Izquierda
movf
xorlw
btfsc
goto
TeclaPulsada,W
TeclaDerecha
STATUS,Z
Derecha
movf
xorlw
btfss
goto
TeclaPulsada,W
TeclaParada
STATUS,Z
Fin
Parado
bcf
bcf
bcf
bcf
movlw
goto
SalidaAdelante
SalidaAtras
SalidaIzquierda
SalidaDerecha
MensajeParado
Visualiza
Adelante
bcf
bsf
bcf
bcf
movlw
goto
SalidaAtras
SalidaAdelante
SalidaIzquierda
SalidaDerecha
MensajeAdelante
Visualiza
Atras
bcf
bsf
bcf
bcf
movlw
goto
SalidaAdelante
SalidaAtras
SalidaIzquierda
SalidaDerecha
MensajeAtras
Visualiza
Izquierda
bcf
bcf
bsf
bcf
SalidaAdelante
SalidaAtras
SalidaIzquierda
SalidaDerecha
228
movlw MensajeIzquierda
goto
Visualiza
Derecha
bcf
bcf
bcf
bsf
movlw
SalidaAdelante
SalidaAtras
SalidaIzquierda
SalidaDerecha
MensajeDerecha
; Segn el estado de las salidas visualiza el estado del sistema en el visualizador LCD y en
; el monitor del ordenador.
Visualiza
movwf
call
movf
call
MensajeApuntado
LCD_Borra
MensajeApuntado,W
LCD_Mensaje
movlw Numero_Espacios
movwf Reg_Blancos
No_Fin_Blancos
movlw Espacio
call
RS232_EnviaDato
decfsz Reg_Blancos,f
goto No_Fin_Blancos
movf
call
MensajeApuntado,W
RS232_Mensaje
movlw Retorno_de_carro
call
RS232_EnviaDato
Fin
; Lo visualiza en el HyperTerminal.
; Saltamos de lineas.
return
<RS232_RT.INC>
<RS232MEN.INC>
<LCD_4BIT.INC>
<LCD_MENS.INC>
<RETARDOS.INC>
END
14.12.- RS232_RT.INC
( Entrenador Bsico 10 )
229
; - Sin paridad.
; - 1 bits de final o Stop a nivel alto.
;************************************** Subrutina "RS232_Inicializa" **************************************************
RS232_Inicializa
BSF STATUS,RP0
; Banco 1
BCF TXSTA,BRGH
MOVLW D'12'
MOVWF SPBRG
BSF TXSTA,TXEN
BCF TXSTA,SYNC
BCF STATUS,RP0
; Banco 0
BSF RCSTA,SPEN
BSF RCSTA,CREN
RETURN
;**************************** Subrutinas "RS232_EnviaDato" y "RS232_EnviaNumero" ****************************
; El microcontrolador enva un dato por la lnea de salida comenzando por el bit de menor
; peso. En dato enviado ser el que le llegue a travs del registro de trabajo W.
; Entrada:
RS232_EnviaNumero ADDLW
RS232_EnviaDato
No_transmision
'0'
MOVWF TXREG
BSF STATUS,RP0
BTFSS TXSTA,TRMT
GOTO No_transmision
BCF STATUS,RP0
RETURN
;*****************************************Subrutina "RS232_LeeDato" ************************************************
; El microcontrolador lee el dato por la lnea de entrada comenzando por el bit de menor
; peso. El dato ledo se enva finalmente en el registro de trabajo W.
RS232_LeeDato
BTFSS PIR1,RCIF
GOTO RS232_LeeDato
MOVF RCREG,W
BCF PIR1,RCIF
DATO.
RETURN
14.13.- RS232MEN.INC
( Entrenador Bsico 10 )
230
ENDC
RS232_Mensaje
movwf RS232_ApuntaCaracter
movlw Mensajes
subwf RS232_ApuntaCaracter,F
decf
RS232_ApuntaCaracter,F
RS232_VisualizaOtroCaracter movf
call
RS232_ApuntaCaracter,W
Mensajes
movwf RS232_ValorCaracter
movf RS232_ValorCaracter,F
btfsc
goto
RS232_NoUltimoCaracter
RS232_FinMensaje
STATUS,Z
RS232_FinMensaje
call
RS232_EnviaDato
; Visualiza el caracter ASCII leido.
incf
RS232_ApuntaCaracter,F
; Apunta a la posicion del siguiente
goto
RS232_VisualizaOtroCaracter ; caracter dentro del mensaje.
return
movlw
movwf
movlw
call
decfsz
d'10'
RS232_ContadorLineas
d'10'
RS232_EnviaDato
RS232_ContadorLineas,F
231
goto
R232_LineasBlancoLazo
movlw d'13'
call
RS232_EnviaDato
return
232
233
( Entrenador Bsico 11 )
15.1.- Int_T_01.asm
EQU d'50'
Salida PORTB,2
GOTO COMIENZO
Timer0_interrupcin
bsf
bcf
STATUS,RP0
Salida
; Acceso al Banco 1.
; lnea configurada como salida.
234
movlw
movwf
bcf
movlw
movwf
movlw
movwf
b'00001000'
OPTION_REG
STATUS,RP0
TMR0_Carga50us
TMR0
b'10100000'
INTCON
movlw
movwf
btfsc
goto
TMR0_Carga50us
TMR0
Salida
EstabaAlto
EstabaBajo
bsf
goto
Salida
FinInterrupcion
EstabaAlto
bcf
Salida
FinInterrupcion
bcf
retfie
INTCON,T0IF
; Comprobando con el simulador del MPLAB se obtienen unos tiempos para la onda cuadrada de
; 56 us para el nivel alto y de 55 us para el bajo.
END
15.2.- Int_T_02.asm
( Entrenador Bsico 11 )
235
EQU d'43'
Salida PORTB,3
GOTO COMIENZO
Timer0_interrupcin
bsf
bcf
movlw
movwf
bcf
movlw
movwf
movlw
movwf
STATUS,RP0
Salida
b'00001000'
OPTION_REG
STATUS,RP0
TMR0_Carga50us
TMR0
b'10100000'
INTCON
; Acceso al Banco 1.
; Esta lnea se configura como salida.
; Sin prescaler para TMR0 (se asigna al Watchdog).
; Acceso al Banco 0.
; Carga el TMR0.
; Autoriza interrupcion T0I y la general (GIE).
236
nop
movlw
movwf
btfsc
goto
TMR0_Carga50us
TMR0
Salida
EstabaAlto
nop
bsf
goto
Salida
FinInterrupcion
EstabaAlto
bcf
Salida
FinInterrupcion bcf
INTCON,T0IF
retfie
EstabaBajo
; Recarga el TMR0.
; Testea el anterior estado de la salida.
END
15.3.- Int_T_03.asm
( Entrenador Bsico 11 )
title " Led ON/OFF 500 ms utilizando la interrupcin por desbordamiento del Timer 0 "
;*********************************************** Int_T_03.asm **********************************************************
; Un LED conectado a la lnea 1 del puerto de salida se enciende durante 500 ms y apaga
; durante otros 500 ms. Los tiempos de temporizacin se realiza mediante la utilizacin
; de la interrupcin por desbordamiento del Timer 0 del PIC.
; Programa para PIC 16F84a.
; Velocidad del Reloj:1 MHz.
; Reloj instruccin: 250 KHz = 4 uS.
; Perro Guardin deshabilitado.
; Tipo de Reloj XT.
; Proteccin de Cdigo: OFF.
; Power Reset: ON
;************************************** Elegimos PIC ********************************************************************
LIST p=16F84A
;**************** Asignacin de nombres de Registros de Funciones especiales a direcciones ******************
INCLUDE <P16F84A.INC>
237
d'10'
EQU
LED
d'195'
PORTB,1
GOTO COMIENZO
Timer0_interrupcin
bsf
bcf
movlw
movwf
bcf
movlw
movwf
movlw
movwf
movlw
movwf
STATUS,RP0
LED
b'00000111'
OPTION_REG
STATUS,RP0
TMR0_Carga50ms
TMR0
Carga500ms
Registro50ms
b'10100000'
INTCON
; Acceso al Banco 1.
; Linea del LED configurada como salida.
; Prescaler de 256 para el TMR0
; Acceso al Banco 0.
; Carga el TMR0.
movlw
movwf
decfsz
goto
movlw
movwf
TMR0_Carga50ms
TMR0
Registro50ms,F
FinInterrupcion
Carga500ms
Registro50ms
; Recarga el TMR0.
; Decrementa el contador.
; Repone el contador nuevamente
238
btfsc
goto
LED
EstabaEncendido
EstabaApagado
bsf
goto
LED
FinInterrupcion
EstabaEncendido
bcf
LED
FinInterrupcion
bcf
retfie
INTCON,T0IF
; Con el simulador del MPLAB se comprueba que los tiempos son: En alto 499261 us y en
; bajo 499258 us.
END
( Entrenador Bsico 11 )
15.4.- Int_T_04.asm
title " Led ON (800 ms) Led OFF (500 ms), utilizando la
interrupcin por desbordamiento del Timer 0 "
;********************************************** Int_T_04.asm ***********************************************************
; Un LED conectado a la lnea 1 del puerto de salida se enciende durante 800 ms y apaga
; durante otros 500 ms. Los tiempos de temporizacin se realizaran mediante la utilizacin
; de la interrupcin por desbordamiento del Timer 0 del PIC.
; Programa para PIC 16F84a.
; Velocidad del Reloj:1 MHz.
; Reloj instruccin: 250 KHz = 4 uS.
; Perro Guardin deshabilitado.
; Tipo de Reloj XT.
; Proteccin de Cdigo: OFF.
; Power Reset: ON
;************************************** Elegimos PIC ********************************************************************
LIST p=16F84A
;**************** Asignacin de nombres de Registros de Funciones especiales a direcciones ******************
INCLUDE <P16F84A.INC>
d'10'
d'16'
EQU
LED
d'195'
PORTB,1
239
Registro50ms
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00
GOTO COMIENZO
Timer0_interrupcin
bsf
bcf
movlw
movwf
bcf
movlw
movwf
movlw
movwf
movlw
movwf
STATUS,RP0
LED
b'00000111'
OPTION_REG
STATUS,RP0
TMR0_Carga50ms
TMR0
Carga500ms
Registro50ms
b'10100000'
INTCON
; Acceso al Banco 1.
; Linea del LED configurada como salida.
; Prescaler de 256 asignado al TMR0
; Acceso al Banco 0.
; Carga el TMR0.
movlw
movwf
decfsz
goto
btfsc
goto
TMR0_Carga50ms
TMR0
Registro50ms,F
FinInterrupcion
LED
EstabaEncendido
; Recarga el TMR0.
; Decrementa el contador.
; Testea el ultimo estado del LED.
EstabaApagado
bsf
LED
movlw Carga800ms
goto
CargaRegistro50ms
EstabaEncendido
bcf
LED
movlw Carga500ms
240
CargaRegistro50ms
movwf Registro50ms
FinInterrupcion
bcf
retfie
INTCON,T0IF
END
( Entrenador Bsico 11 )
15.5.- Int_T_05.asm
title " Sistema multitarea ( Mostrar mensajes en el LCD y LED ON/OFF (500 ms) "
;********************************************** Int_T_05.asm ***********************************************************
; El modulo LCD visualiza constantemente un mensaje largo que se desplaza por la pantalla.
; Al mismo tiempo el diodo LED conectado a la lnea RB1 se enciende durante 500 ms y se apaga
; durante otros 500 ms a modo de segundero
; Programa para PIC 16F84a.
; Velocidad del Reloj:1 MHz.
; Reloj instruccin: 250 KHz = 4 uS.
; Perro Guardin deshabilitado.
; Tipo de Reloj XT.
; Proteccin de Cdigo: OFF.
; Power Reset: ON
;************************************** Elegimos PIC ********************************************************************
LIST p=16F84A
;***************** Asignacin de nombres de Registros de Funciones especiales a direcciones *****************
INCLUDE <P16F84A.INC>
d'10'
EQU
LED
d'195'
PORTB,1
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00
GOTO COMIENZO
241
Timer0_interrupcin
call
bsf
bcf
movlw
movwf
bcf
movlw
movwf
movlw
movwf
movlw
movwf
LCD_Inicializa
STATUS,RP0
LED
b'00000111'
OPTION_REG
STATUS,RP0
TMR0_Carga50ms
TMR0
Carga500ms
Registro50ms
b'10100000'
INTCON
movlw MensajeLargo
call
LCD_MensajeMovimiento
goto
Principal
movwf
swapf
movwf
bcf
movlw
movwf
decfsz
goto
movlw
movwf
btfsc
goto
Guarda_W
STATUS,W
Guarda_STATUS
STATUS,RP0
TMR0_Carga50ms
TMR0
Registro50ms,F
FinInterrupcion
Carga500ms
Registro50ms
LED
EstabaEncendido
; Guarda W y STATUS.
; Ya que "movf STATUS,W" corrompe el bit Z.
EstabaApagado
bsf
goto
LED
FinInterrupcion
; Lo enciende.
EstabaEncendido
bcf
LED
; Lo apaga.
FinInterrupcion
swapf
movwf
swapf
swapf
Guarda_STATUS,W
STATUS
Guarda_W,F
Guarda_W,W
; Restaura el STATUS.
242
bcf
retfie
INTCON,T0IF
addwf PCL,F
MensajeLargo DT "
"
DT "Estudia \"Desarrollo de Productos Electrnicos"."
DT "
", 0x00
;******************************************** Libreras ***************************************************************
INCLUDE <LCD_MENS.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
END
( Entrenador Bsico 11 )
15.6.- Int_T_06.asm
title " Mostrar mensajes en el LCD fijo en la primera lnea e intermitente en la "
title " segunda lnea utilizando la interrupcin del Timer 0 "
;********************************************** Int_T_06.asm ***********************************************************
; En la lnea superior de la pantalla aparece un mensaje fijo. En la lnea inferior aparece
; un mensaje intermitente que se enciende durante 500 ms y se apaga durante 300 ms.
; Programa para PIC 16F84a.
; Velocidad del Reloj:1 MHz.
; Reloj instruccin: 250 KHz = 4 uS.
; Perro Guardin deshabilitado.
; Tipo de Reloj XT.
; Proteccin de Cdigo: OFF.
; Power Reset: ON
;************************************** Elegimos PIC ********************************************************************
LIST p=16F84A
;***************** Asignacin de nombres de Registros de Funciones especiales a direcciones *****************
INCLUDE <P16F84A.INC>
10
6
EQU
d'195'
243
Intermitencia
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00
GOTO COMIENZO
Timer0_interrupcin
call
movlw
call
bsf
movlw
movwf
bcf
movlw
movwf
movlw
movwf
movlw
movwf
LCD_Inicializa
MensajeFijo
LCD_Mensaje
STATUS,RP0
b'00000111'
OPTION_REG
STATUS,RP0
TMR0_Carga50ms
TMR0
Carga500ms
Registro50ms
b'10100000'
INTCON
FinInterrupcion
movlw
movwf
decfsz
goto
comf
call
TMR0_Carga50ms
TMR0
Registro50ms,F
FinInterrupcion
Intermitencia,F
Visualiza
bcf
retfie
INTCON,T0IF
; Carga el Timer 0.
; Decrementa el contador.
; Conmuta la intermitencia
call
btfss
goto
movlw
call
LCD_Linea2
Intermitencia,0
ApagaMensaje
MensajeIntermitente
LCD_Mensaje
244
movlw Carga500ms
movwf Registro50ms
goto
FinVisualiza
ApagaMensaje call
LCD_LineaEnBlanco
movlw Carga300ms
movwf Registro50ms
FinVisualiza
return
addwf PCL,F
MensajeFijo
DT "
MensajeIntermitente
Estudia", 0x00
15.7.- Int_C_01.asm
( Entrenador Bsico 11 )
title " Generar una seal cuadrada por PB2, de frecuencia variable en "
title " funcin de PB7. El modulo LCD visualiza dicha frecuencia "
;*************************************************** Int_C_01.asm ******************************************************
; Por la lnea 2 del puerto B se genera una onda cuadrada. La frecuencia de la onda cuadrada cambia
; mediante activacin del pulsador conectado al pin 7 del puerto B, de la siguiente forma:
;
;
PULSACION FRECUENCIA
SEMIPERIODO
;
----------------- --------------------------------------------------------;
(Inicial)
10 kHz
50 us. = 1 x 50 us
;
Primera
5 kHz
100 us. = 2 x 50 us
;
Segunda
2 kHz
250 us. = 5 x 50 us
;
Tercera
1 kHz
500 us. = 10 x 50 us
;
Cuarta
500 Hz
1000 us. = 20 x 50 us
;
Quinta
200 Hz
2500 us. = 50 x 50 us
;
Sexta
100 Hz
5000 us. = 100 x 50 us
;
Septima
50 Hz
10000 us. = 200 x 50 us
; Al conectarlo por primera vez se genera una frecuencia de 10 kHz, al activar el
; pulsador cambia a 5 kHz, al actuar una segunda vez cambia a 2 kHz, y as sucesivamente.
; El modulo LCD visualizara la frecuencia generada. A la lnea de salida se puede conectar
; un altavoz que producir un pitido.
; Programa para PIC 16F84a.
; Velocidad del Reloj:1 MHz.
; Reloj instruccin: 250 KHz = 4 uS.
; Perro Guardin deshabilitado.
; Tipo de Reloj XT.
245
EQU
EQU
d'42'
d'8'
#DEFINE Salida
#DEFINE Pulsador
PORTB,2
PORTB,7
GOTO COMIENZO
;Comienzo del Programa
;**************************** Vector de interrupcin ********************************************************************
ORG 0x04
goto
ServicioInterrupcion
d'1'
d'2'
d'5'
d'10'
d'20'
d'50'
d'100'
d'200'
246
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
Mensaje10kHz
Mensaje5kHz
Mensaje2kHz
Mensaje1kHz
Mensaje500Hz
Mensaje200Hz
Mensaje100Hz
Mensaje50Hz
addwf PCL,F
MensajeFrecuencia
Mensaje10kHz
Mensaje5kHz
Mensaje2kHz
Mensaje1kHz
Mensaje500Hz
Mensaje200Hz
Mensaje100Hz
Mensaje50Hz
call
bsf
bcf
bsf
movlw
movwf
bcf
call
movlw
movwf
movlw
movwf
LCD_Inicializa
STATUS,RP0
Salida
Pulsador
b'00001000'
OPTION_REG
STATUS,RP0
EstadoInicial
TMR0_Carga50us
TMR0
b'10101000'
INTCON
goto
Principal
btfsc
call
btfsc
call
bcf
bcf
INTCON,T0IF
Timer0_interrupcin
INTCON,RBIF
Pulsador_Interrupcion
INTCON,T0IF
INTCON,RBIF
retfie
247
call
btfsc
goto
incf
movlw
Retardo_20ms
Pulsador
Fin_PulsadorInterrupcion
ApuntadorFrecuencia,F
NumeroFrec
subwf ApuntadorFrecuencia,W
btfsc
STATUS,C
clrf
movf
call
movwf
movwf
call
call
ApuntadorFrecuencia
ApuntadorFrecuencia,W
CargaContador
Semiperiodo
Timer0_ContadorA
Retardo_200ms
LCD_Linea1
movlw
call
movf
call
call
MensajeFrecuencia
LCD_Mensaje
ApuntadorFrecuencia,W
CargaMensaje
LCD_Mensaje
EsperaDejePulsar
btfss
goto
Pulsador
EsperaDejePulsar
Fin_PulsadorInterrupcion
return
EstadoInicial
movlw
movwf
decfsz
goto
movf
movwf
btfsc
goto
TMR0_Carga50us
TMR0
; Recarga el TMR0.
Timer0_ContadorA,F ; Decrementa el contador.
Fin_Timer0_interrupcin
Semiperiodo,W
; Repone el contador nuevamente.
Timer0_ContadorA
Salida
; Testea el ultimo estado de la salida.
EstabaAlto
EstabaBajo
bsf
goto
Salida
; Estaba bajo y lo pasa a alto.
Fin_Timer0_interrupcin
EstabaAlto
bcf
Salida
Fin_Timer0_interrupcin
return
248
( Entrenador Bsico 11 )
15.8.- Int_C_02.asm
title " Generar una seal cuadrada por PB2, de frecuencia variable
desde 300Hz hasta 4000Hz "
;*************************************************** Int_C_02.asm ******************************************************
; A la lnea de salida se conecta un altavoz que produce el sonido de una sirena que ser fijado
; por el diseador. En esta solucin la frecuencia es de 300 Hz, subiendo hasta 4 kHz y bajando
; despus, mas lentamente, a su valor inicial y repitiendo el proceso.
; Programa para PIC 16F84a.
; Velocidad del Reloj:1 MHz.
; Reloj instruccin: 250 KHz = 4 uS.
; Perro Guardin deshabilitado.
; Tipo de Reloj XT.
; Proteccin de Cdigo: OFF.
; Power Reset: ON
;************************************** Elegimos PIC ********************************************************************
LIST p=16F84A
;**************** Asignacin de nombres de Registros de Funciones especiales a direcciones ******************
INCLUDE <P16F84A.INC>
EQU
EQU
d'200'
d'15'
#DEFINE Salida
PORTB,2
Guarda_W
Guarda_STATUS
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
249
ORG 0X00
GOTO COMIENZO
Timer0_interrupcin
bsf
bcf
movlw
movwf
bcf
clrf
movlw
movwf
sublw
movwf
movlw
movwf
STATUS,RP0
Salida
b'00000010'
OPTION_REG
STATUS,RP0
SentidoFrecuencia
MaximoPeriodo
ApuntadorFrecuencia
d'0'
TMR0
b'10100000'
INTCON
btfss
goto
SentidoFrecuencia,0
FrecuenciaAscendente
FrecuenciaDescendente
call
Retardo_20ms
incf
ApuntadorFrecuencia,F
movlw MaximoPeriodo
subwf ApuntadorFrecuencia,W
FrecuenciaAscendente
btfsc
STATUS,C
clrf
SentidoFrecuencia
goto
Fin
call
Retardo_10ms
decf
ApuntadorFrecuencia,F
movlw MinimoPeriodo
subwf ApuntadorFrecuencia,W
Fin
btfss
STATUS,C
incf
SentidoFrecuencia,F
goto
Principal
250
Timer0_interrupcin
movwf
swapf
movwf
bcf
movf
sublw
Guarda_W
STATUS,W
Guarda_STATUS
STATUS,RP0
ApuntadorFrecuencia,W
d'0'
movwf TMR0
btfsc Salida
goto
EstabaAlto
EstabaBajo
bsf
goto
Salida
Fin_Timer0_interrupcin
EstabaAlto
bcf
Salida
Fin_Timer0_interrupcin
swapf
movwf
swapf
swapf
bcf
Guarda_STATUS,W
STATUS
Guarda_W,F
Guarda_W,W
INTCON,T0IF
retfie
;******************************************** Libreras ***************************************************************
INCLUDE <RETARDOS.INC>
END
15.9.- Int_C_03.asm
( Entrenador Bsico 11 )
title " Encender y apagar una sirena en funcin de RB7 y RB6, mostrar
en el modulo LCD como esta la sirena "
;************************************************** Int_C_03.asm *******************************************************
; Al actuar sobre el pulsador conectado a la lnea RB7 se produce la activacin de una
; sirena y el modulo LCD visualiza un mensaje del tipo "Sirena ACTIVADA".
; Para apagar la sirena hay que actuar sobre el pulsador conectado a la lnea RB6. En la
; pantalla visualiza un mensaje del tipo "Sirena APAGADA".
; Programa para PIC 16F84a.
; Velocidad del Reloj:1 MHz.
; Reloj instruccin: 250 KHz = 4 uS.
; Perro Guardin deshabilitado.
; Tipo de Reloj XT.
; Proteccin de Cdigo: OFF.
; Power Reset: ON
251
d'200'
d'15'
Salida
PORTB,2
EntradaActivar PORTB,7
EntradaApagarPORTB,6
AutorizaSirena Flags,0
Guarda_W
Guarda_STATUS
Guarda_R_ContA
Guarda_R_ContB
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00
GOTO COMIENZO
ServicioInterrupcion
call
bsf
bcf
bsf
bsf
movlw
movwf
bcf
LCD_Inicializa
STATUS,RP0
Salida
EntradaApagar
EntradaActivar
b'00000010'
OPTION_REG
STATUS,RP0
252
call
clrf
movlw
movwf
sublw
movwf
movlw
movwf
ApagarSirena
SentidoFrecuencia
MaximoPeriodo
ApuntadorFrecuencia
d'0'
TMR0
b'10101000'
INTCON
btfss
goto
AutorizaSirena
SirenaNoAutorizada
btfss
goto
call
SentidoFrecuencia,0
FrecuenciaAscendente
Retardo_20ms
incf
ApuntadorFrecuencia,F
movlw MaximoPeriodo
subwf ApuntadorFrecuencia,W
FrecuenciaAscendente
btfsc
STATUS,C
clrf
SentidoFrecuencia
goto
Fin
call
Retardo_10ms
decf
ApuntadorFrecuencia,F
movlw MinimoPeriodo
subwf ApuntadorFrecuencia,W
btfss
STATUS,C
incf
SentidoFrecuencia,F
goto
Fin
SirenaNoAutorizada
bcf
sleep
Salida
Fin
goto
Principal
movwf Guarda_W
swapf STATUS,W
253
movwf Guarda_STATUS
bcf
movf
movwf
movf
movwf
STATUS,RP0
R_ContA,W
Guarda_R_ContA
R_ContB,W
Guarda_R_ContB
btfsc
call
btfsc
INTCON,RBIF
RBI_Interrupcion
INTCON,T0IF
call
Timer0_interrupcin
swapf
movwf
swapf
swapf
movf
movwf
movf
movwf
Guarda_STATUS,W
STATUS
Guarda_W,F
Guarda_W,W
Guarda_R_ContA,W
R_ContA
Guarda_R_ContB,W
R_ContB
bcf
bcf
INTCON,RBIF
INTCON,T0IF
retfie
;**************************************** Subrutina "RBI_Interrupcion" ************************************************
RBI_Interrupcion
call
btfsc
goto
Retardo_20ms
EntradaApagar
CompruebaActivar
ApagarSirena
CALL
bcf
call
movlw
goto
Retardo_100ms
AutorizaSirena
LCD_Borra
MensajeApagado
Visualiza
CompruebaActivar
btfsc
goto
EntradaActivar
EsperaDejePulsar
ActivarSirena
CALL
bsf
call
movlw
Retardo_100ms
AutorizaSirena
LCD_Borra
MensajeActivada
Visualiza
call
LCD_Mensaje
EsperaDejePulsar
btfss
goto
btfss
goto
EntradaApagar
EsperaDejePulsar
EntradaActivar
EsperaDejePulsar
return
;********************************** Subrutina "Timer0_interrupcin" ***************************************************
; Con un prescaler de 8 el periodo variara segn el valor de ApuntadorFrecuencia entre:
254
;
;
;
;
Timer0_interrupcin
movf
sublw
movwf
btfsc
goto
ApuntadorFrecuencia,W
d'0'
; Carga en el Timer 0 con signo negativo.
TMR0
Salida
; Testea el ultimo estado de la salida.
EstabaAlto
EstabaBajo
bsf
goto
Salida
; Estaba bajo y lo pasa a alto.
Fin_Timer0_interrupcin
EstabaAlto
Fin_Timer0_interrupcin
bcf
Salida
return
addwf PCL,F
MensajeApagado
MensajeActivada
15.10.- Int_C_04.asm
( Entrenador Bsico 11 )
PULSACIN
----------------Inicial
Primera
Segunda
Tercera
Cuarta
Quinta
Sexta
Septima
Octava
Novena
Dcima
DC (%)
---------0%
10 %
20 %
30 %
40 %
50 %
60 %
70 %
80 %
90 %
100 %
SEMIPERIODO ALTO
---------------------------------0 us = 0 x 100 us
1000 us = 10 x 100 us
2000 us = 20 x 100 us
3000 us = 30 x 100 us
4000 us = 40 x 100 us
5000 us = 50 x 100 us
6000 us = 60 x 100 us
7000 us = 70 x 100 us
8000 us = 80 x 100 us
9000 us = 90 x 100 us
10000 us = 100 x 100 us
SEMIPERIODO BAJO
---------------------------------10000 us = 100 x 100 us
9000 us = 90 x 100 us
8000 us = 80 x 100 us
7000 us = 70 x 100 us
6000 us = 60 x 100 us
5000 us = 50 x 100 us
4000 us = 40 x 100 us
3000 us = 30 x 100 us
2000 us = 20 x 100 us
1000 us = 10 x 100 us
0 us = 0 x 100 us
255
; Al conectarlo por primera vez se genera un ciclo de trabajo de 0%, al presionar el pulsador
; cambia al 10%, al actuar una segunda vez cambia al 20%, y as sucesivamente.
; El modulo LCD visualiza el ciclo de trabajo vigente en cada momento.
; Programa para PIC 16F84a.
; Velocidad del Reloj:1 MHz.
; Reloj instruccin: 250 KHz = 4 uS.
; Perro Guardin deshabilitado.
; Tipo de Reloj XT.
; Proteccin de Cdigo: OFF.
; Power Reset: ON
;************************************** Elegimos PIC ********************************************************************
LIST p=16F84A
;*************** Asignacin de nombres de Registros de Funciones especiales a direcciones *******************
INCLUDE <P16F84A.INC>
EQU
EQU
d'89'
d'10'
#DEFINE Salida
#DEFINE Pulsador
PORTB,2
PORTB,7
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00
GOTO COMIENZO
ServicioInterrupcion
addwf PCL,F
Mensaje_DC
Mensaje_TantoPorCiento
256
bsf
bcf
bsf
movlw
movwf
bcf
call
call
movlw
movwf
STATUS,RP0
Salida
Pulsador
b'00001000'
OPTION_REG
STATUS,RP0
LCD_Inicializa
DC_CeroPorCiento
b'10001000'
INTCON
goto
Principal
btfsc
call
btfsc
call
bcf
bcf
INTCON,RBIF
; Interrupcion por cambio en el Puerto B?
Pulsador_Interrupcion
INTCON,T0IF
; Interrupcion por desbordamiento del TMR0?
Timer0_interrupcin
INTCON,RBIF
; Limpia flags de reconocimiento.
INTCON,T0IF
retfie
;*************************************** Subrutina "Pulsador_Interrupcion" ********************************************
; Subrutina de atencin a la interrupcin por cambio en la lnea RB7 donde se ha
; conectado un pulsador.
; Incrementa el registro (CicloTrabajo), desde 0 (que corresponde a un DC = 0%
; hasta d'100' (que corresponde a un ciclo de trabajo del 100%).
Pulsador_Interrupcion
call
btfsc
goto
bsf
Retardo_20ms
Pulsador
Fin_PulsadorInterrupcion
INTCON,T0IE
movlw
addwf
movwf
sublw
btfsc
goto
btfsc
goto
IncrementoDC
CicloTrabajo,W
CicloTrabajo
d'100'
STATUS,Z
DC_100PorCiento
STATUS,C
Visualiza
DC_CeroPorCiento
bcf
clrf
goto
Salida
CicloTrabajo
InhabilitaInterrupcionTMR0
DC_100PorCiento
Salida
d'100'
CicloTrabajo
INTCON,T0IE
InhabilitaInterrupcionTMR0
bsf
movlw
movwf
bcf
Visualiza
call
VisualizaCicloTrabajo
257
EsperaDejePulsar
btfss
goto
Pulsador
EsperaDejePulsar
Fin_PulsadorInterrupcion
movf
movwf
movlw
movwf
return
CicloTrabajo,W
Timer0_ContadorA
TMR0_Carga
TMR0
EstabaBajo
EstabaAlto
Fin_Timer0_interrupcin
movlw
movwf
decfsz
goto
btfsc
TMR0_Carga
TMR0
Timer0_ContadorA,F
Fin_Timer0_interrupcin
Salida
goto
EstabaAlto
nop
bsf
movf
movwf
nop
goto
bcf
movf
sublw
movwf
return
Salida
CicloTrabajo,W
Timer0_ContadorA
; Decrementa el contador.
;Testea el anterior estado de la
salida.
Fin_Timer0_interrupcin
Salida
CicloTrabajo,W
.100
Timer0_ContadorA
call Retardo_100ms
call
LCD_Linea1
; Visualiza el ciclo de trabajo seleccionado.
movlw Mensaje_DC
call
LCD_Mensaje
movf CicloTrabajo,W
call
BIN_a_BCD
; Lo pasa a BCD.
movf BCD_Centenas,W
; Visualiza las centenas.
btfss STATUS,Z
; Si son cero no visualiza las centenas.
goto
VisualizaCentenas
movf CicloTrabajo,W
; Vuelve a recuperar este valor.
call
BIN_a_BCD
; Lo pasa a BCD.
call
LCD_Byte
; Visualiza las decenas y unidades.
goto
VisualizaTantoPorCiento
VisualizaCentenas
call
movf
call
call
LCD_Nibble
CicloTrabajo,W
BIN_a_BCD
LCD_ByteCompleto
258
VisualizaTantoPorCiento
movlw Mensaje_TantoPorCiento
call
LCD_Mensaje
return
;******************************************** Libreras ***************************************************************
INCLUDE
INCLUDE
INCLUDE
INCLUDE
<LCD_MENS.INC>
<LCD_4BIT.INC>
<RETARDOS.INC>
<BIN_BCD.INC>
END
15.11.- Int_Re_01.asm
( Entrenador Bsico 11 )
EQU
d'195'
259
Minuto
Segundo
MedioSegundo
Registro50ms
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00
GOTO COMIENZO
Timer0_interrupcin
call
bsf
movlw
movwf
bcf
clrf
clrf
clrf
clrf
clrf
movlw
movwf
movlw
movwf
LCD_Inicializa
STATUS,RP0
b'00000111'
OPTION_REG
STATUS,RP0
Hora
Minuto
Segundo
MedioSegundo
Registro50ms
TMR0_Carga50ms
TMR0
b'10100000'
INTCON
; Acceso al Banco 1.
; Prescaler de 256 para el TMR0 y habilita
; resistencias de Pull-Up del Puerto B.
; Acceso al Banco 0.
; Inicializa todos los datos del reloj.
; Carga el TMR0.
; Activa interrupcion del TMR0 (TOIE)
; y la general (GIE).
goto
Principal
btfsc
call
INTCON,T0IF
Reloj
FinInterrupcion bcf
INTCON,T0IF
retfie
260
; y de carga del contador, resulta un total de 50000 us exactos. Es decir, el TMR0 producir
; una interrupcin cada 50 ms exactos, comprobado experimentalmente con la ventana Stopwatch del
; simulador del MPLAB.
Reloj
call
call
nop
movlw
movwf
call
btfss
goto
Retardo_50micros
Retardo_20micros
; Retardo de 71 us para
; ajustar a 50 ms exactos.
IncrementaReloj
call
btfss
goto
call
btfss
goto
call
btfss
goto
call
IncrementaMedioSegundo
STATUS,C
; Ha pasado 1 segundo?
ActualizaReloj
; No. Pues sale visualizando el reloj.
IncrementaSegundos ; Si. Incrementa el segundero.
STATUS,C
; Han pasado 60 segundos?
ActualizaReloj
; No. Pues sale visualizando el reloj.
IncrementaMinutos
; Si. Incrementa el minutero.
STATUS,C
; Han pasado 60 minutos?
ActualizaReloj
; No. Pues sale visualizando el reloj.
IncrementaHoras
; Si. Incrementa las horas.
ActualizaReloj
FinReloj
call
VisualizaReloj
return
TMR0_Carga50ms
; Carga el timer 0.
TMR0
IncrementaRegistro50ms
STATUS,C
; Ha contado 10 veces 50 ms = 1/2 segundo?
FinReloj
; No. Pues sale sin visualizar el reloj.
; Visualiza el reloj.
movlw
call
movf
call
call
movlw
call
movf
call
call
movlw
call
movf
call
call
return
d'4'
LCD_PosicionLinea2
Hora,W
BIN_a_BCD
LCD_Byte
':'
LCD_Caracter
Minuto,W
BIN_a_BCD
LCD_ByteCompleto
':'
LCD_Caracter
Segundo,W
BIN_a_BCD
LCD_ByteCompleto
incf
movlw
subwf
btfsc
clrf
Registro50ms,F
d'10'
Registro50ms,W
STATUS,C
Registro50ms
; (W)=(Registro50ms)-10
; C=0?, (W) negativo?, (Registro50ms)<10?
; Lo inicializa si ha superado su valor
mximo.
return
261
incf
bsf
btfss
bcf
MedioSegundo,F
STATUS,C
MedioSegundo,0
STATUS,C
; Incrementa.
; Supone que ha llegado al segundo.
; El bit 0 se pondr a "1" cada segundo.
return
;************************************* Subrutina "IncrementaSegundos" **********************************************
; Incrementa el valor de la variable Segundos. Si es igual al valor mximo de 60 lo resetea
; y sale con el Carry a "1".
IncrementaSegundos
incf
movlw
subwf
btfsc
clrf
Segundo,F
d'60'
Segundo,W
STATUS,C
Segundo
return
;***************************************** Subrutina "IncrementaMinutos" *********************************************
; Incrementa el valor de la variable Minuto. Si es igual al valor mximo de 60 lo resetea
; y sale con el Carry a "1".
IncrementaMinutos
incf
movlw
subwf
btfsc
clrf
Minuto,F
d'60'
Minuto,W
STATUS,C
Minuto
return
;******************************************* Subrutina "IncrementaHoras" *********************************************
; Incrementa el valor de la variable Hora. Si es igual al valor mximo de 24 lo resetea
; y sale con el Carry a "1".
IncrementaHoras
incf
movlw
subwf
btfsc
clrf
Hora,F
.24
Hora,W
STATUS,C
Hora
return
;******************************************** Librerias ***************************************************************
INCLUDE <RETARDOS.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <BIN_BCD.INC>
END
262
( Entrenador Bsico 11 )
15.12.- Int_Re_04.asm
title " Reloj digital en tiempo real con puesta en hora. "
;***************************************************** Int_R_04.asm ****************************************************
; Programa para un reloj digital en tiempo real con puesta en hora. Visualiza los datos
; en formato:
;
;
- "Mensaje Publicitario"
- "Horas:Minutos:Segundos",
(Primera lnea)
(Segunda Linea)
(Primera lnea)
(Segunda Lnea).
1.
2.
3.
ModoPulsador
IncrementarPulsador
F_AjusteHora
F_AjusteMinuto
F_Intermitencia
TMR0_Carga50ms
PORTB,7
PORTB,6
FlagsAjuste,1
FlagsAjuste,0
Intermitencia,0
EQU
d'195'
; Si es 0, apaga en intermitencia.
263
Hora
Minuto
Segundo
MedioSegundo
Registro50ms
Intermitencia
FlagsAjuste
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00
GOTO COMIENZO
ServicioInterrupcion
addwf PCL,F
MensajePublicitario
call
movlw
call
bsf
movlw
movwf
bsf
bsf
bcf
clrf
clrf
clrf
clrf
clrf
clrf
movlw
movwf
movlw
movwf
call
LCD_Inicializa
MensajePublicitario
LCD_Mensaje
STATUS,RP0
b'00000111'
OPTION_REG
ModoPulsador
IncrementarPulsador
STATUS,RP0
FlagsAjuste
Hora
Minuto
Segundo
MedioSegundo
Registro50ms
TMR0_Carga50ms
TMR0
b'10101000'
INTCON
PuestaEnHoraReset
; Acceso al Banco 1.
; Prescaler de 256 para el TMR0 y habilita
; resistencias de Pull-Up del Puerto B.
; Configurados como entrada.
; Acceso al Banco 0.
; Inicializa todos los flags de la puesta en hora.
; Inicializa todos los datos del reloj.
; Carga el TMR0.
; Activa interrupcion del TMR0 (TOIE), por cambio
; lineas del Puerto B (RBIE) y la general (GIE).
; Puesta en hora por primera vez.
goto
Principal
264
FinInterrupcion
btfsc
call
btfss
goto
btfss
call
btfss
call
INTCON,T0IF
Reloj
INTCON,RBIF
FinInterrupcion
ModoPulsador
PuestaEnHora
IncrementarPulsador
Incrementar
bcf
bcf
INTCON,RBIF
INTCON,T0IF
retfie
;********************************************* Subrutina "Reloj" *********************************************************
; Esta subrutina actualiza los contadores Horas, Minutos, Segundos y Registro50ms.
; Se ejecuta debido a la peticin de interrupcin del Timer 0 cada 50 ms.
; Como el PIC trabaja a una frecuencia de 4 MHz, el TMR0 evoluciona cada us y se desborda cada
; 195 x 256 = 49920 us. Sumndole el retardo de 71 us y el pequeo tiempo de los saltos
; iniciales y de carga del contador, resulta un total de 50000 us exactos. Es decir, el
; TMR0 producir una interrupcin cada 50 ms exactos, comprobado experimentalmente con la
; ventana Stopwatch del simulador del MPLAB.
Reloj
call
call
nop
movlw
movwf
call
btfss
goto
Retardo_50micros
Retardo_20micros
TMR0_Carga50ms
; Carga el Timer 0.
TMR0
IncrementaRegistro50ms
STATUS,C
; Ha contado 10 veces 50 ms = 1/2 segundo?
FinReloj
; No. Pues sale sin visualizar el reloj.
IncrementaReloj
movf
btfsc
goto
movlw
xorwf
goto
FlagsAjuste,F
STATUS,Z
IncrementaReloj
b'00000001'
Intermitencia,F
ActualizaReloj
bsf
call
btfss
goto
call
btfss
goto
call
btfss
goto
call
F_Intermitencia
; Se mantendra siempre encendido durante
IncrementaMedioSegundo
; el funcionamiento normal.
STATUS,C
; Ha pasado 1 segundo?
ActualizaReloj
; No. Pues sale visualizando el reloj.
IncrementaSegundos ; Si. Incrementa el segundero.
STATUS,C
; Han pasado 60 segundos?
ActualizaReloj
; No. Pues sale visualizando el reloj.
IncrementaMinutos
; Si. Incrementa el minutero.
STATUS,C
; Han pasado 60 minutos?
ActualizaReloj
; No. Pues sale visualizando el reloj.
IncrementaHoras
; Si. Incrementa las horas.
265
ActualizaReloj
call
FinReloj
return
VisualizaReloj
; Visualiza el reloj.
movlw
call
btfss
goto
btfss
goto
d'4'
LCD_PosicionLinea2
F_AjusteHora
EnciendeHoras
F_Intermitencia
ApagaHoras
EnciendeHoras
movf
call
call
goto
Hora,W
BIN_a_BCD
LCD_Byte
VisualizaMinutos
ApagaHoras
call
LCD_DosEspaciosBlancos
VisualizaMinutos
movlw
call
btfss
goto
btfss
goto
':'
LCD_Caracter
F_AjusteMinuto
EnciendeMinutos
F_Intermitencia
ApagaMinutos
call
call
goto
movf Minuto,W
BIN_a_BCD
LCD_ByteCompleto
VisualizaSegundos
; Visualiza minutos.
; Lo pasa a BCD.
ApagaMinutos
call
LCD_DosEspaciosBlancos
VisualizaSegundos
movlw
call
movf
call
call
':'
LCD_Caracter
Segundo,W
BIN_a_BCD
LCD_ByteCompleto
EnciendeMinutos
return
;****************************************** Subrutina "Incrementar" ****************************************************
; Subrutina de atencin a la interrupcin por cambio de la lnea RB6 al cual se ha conectado
; el pulsador "INCREMENTAR". Incrementa segn corresponda una sola de las variables.
Incrementar
call
btfsc
goto
bsf
btfsc
call
btfsc
call
Retardo_20ms
IncrementarPulsador
FinIncrementar
F_Intermitencia
F_AjusteHora
IncrementaHoras
F_AjusteMinuto
IncrementaMinutos
266
call
call
call
btfss
goto
FinIncrementar
Retardo_100ms
VisualizaReloj
Retardo_200ms
IncrementarPulsador
Incrementar
return
incf
movlw
subwf
btfsc
clrf
Registro50ms,F
d'10'
Registro50ms,W
STATUS,C
Registro50ms
; (W)=(Registro50ms)-10.
; C=0?, (W) negativo?, (Registro50ms)< 10?
; Lo inicializa si ha superado su valor
mximo.
return
;************************************** Subrutina "IncrementaMedioSegundo" ****************************************
; Incrementa el valor de la variable MedioSegundo. Su bit de menor peso se pondr a "1" una
; vez por segundo.
IncrementaMedioSegundo
incf
bsf
btfss
bcf
MedioSegundo,F
STATUS,C
MedioSegundo,0
STATUS,C
; Incrementa.
; Supone que ha llegado al segundo.
; El bit 0 se pondr a uno cada segundo.
return
;***************************************** Subrutina "IncrementaSegundos" ******************************************
; Incrementa el valor de la variable Segundo. Si es igual al valor mximo de 60 lo resetea
; y sale con el Carry a "1".
IncrementaSegundos
incf
movlw
subwf
btfsc
clrf
Segundo,F
d'60'
Segundo,W
STATUS,C
Segundo
return
;******************************************* Subrutina "IncrementaMinutos" *******************************************
; Incrementa el valor de la variable Minuto. Si es igual al valor mximo de 60 lo resetea
; y sale con el Carry a "1".
IncrementaMinutos
incf
movlw
subwf
btfsc
clrf
Minuto,F
d'60'
Minuto,W
STATUS,C
Minuto
return
267
incf
movlw
subwf
btfsc
clrf
Hora,F
.24
Hora,W
STATUS,C
Hora
return
;********************************************* Subrutina "PuestaEnHora" **********************************************
; Subrutina de atencin a la interrupcin producida por el pulsador "MODO" que pone en hora
; el reloj. Cada vez que se pulsa, el "1" es desplazado a travs del registro (FlagsAjuste),
; pasando a ajustar secuencialmente: horas y minutos.
; Para comprender el funcionamiento de esta subrutina hay que saber que el registro FlagsModos
; contiene 2 flags que permiten diferenciar cada uno de los ajustes de registros de tiempo.
;
;
- "F_AjusteHora":
- "F_AjusteMinuto":
Que pulse "MODO" estando en modo de visualizacin normal que se identifica porque
(FlagsAjuste)=0. En este caso debe activar el flag F_AjusteHora, es decir carga
(FlagsAjuste)=b'00000010', ya que "F_AjusteHora" es el bit 1 del registro FlagsAjuste.
Que pulse "MODO" estando ya en la puesta en hora, en cuyo caso debe pasar al ajuste
del siguiente registro de tiempo (minutos). Esto lo hace mediante un desplazamiento a
derechas. as, por ejemplo, si antes estaba ajustando las horas (FlagsAjuste)=b'00000010',
pasara a (FlagsAjuste)=b'00000001' identificado como ajuste de los minutos.
Que pulse "MODO" estando en el ltimo ajuste correspondiente a los minutos,
(FlagsAjuste)=b'00000001', pasara a (FlagsAjuste)=b'00000000', indicando que la puesta
en hora ha terminado y pasa a visualizacin normal del reloj en tiempo real.
PuestaEnHora
call
btfsc
goto
Retardo_20ms
ModoPulsador
FinPuestaEnHora
bcf
movf
btfss
goto
F_Intermitencia
FlagsAjuste,F
STATUS,Z
AjustaSiguiente
bsf
clrf
clrf
clrf
goto
F_AjusteHora
Segundo
MedioSegundo
Registro50ms
FinPuestaEnHora
PuestaEnHoraReset
siguiente.
; Pasa a ajustar la hora.
; Inicializa contador de segundos y el resto.
268
AjustaSiguiente
FinPuestaEnHora
bcf
rrf
STATUS,C
FlagsAjuste,F
call
btfss
goto
VisualizaReloj
ModoPulsador
FinPuestaEnHora
return
;******************************************** Libreras ***************************************************************
INCLUDE
INCLUDE
INCLUDE
INCLUDE
<RETARDOS.INC>
<LCD_4BIT.INC>
<LCD_MENS.INC>
<BIN_BCD.INC>
END
15.13.- Int_Temp.asm
( Entrenador Bsico 11 )
269
ENDC
;**************************** Igualdades en zona EEPROM ***********************************************************
ORG
0x2100
DE
0x00
#DEFINE F_Temporizador_ON
#DEFINE F_Temporizador_Ajuste
#DEFINE F_Temporizador_OFF
FlagsModos,2
FlagsModos,1
FlagsModos,0
#DEFINE
#DEFINE
#DEFINE
#DEFINE
PORTB,1
PORTB,2
PORTB,7
PORTB,6
SalidaTemporizador
Zumbador
AjustePulsador
IncrementarPulsador
GOTO COMIENZO
ServicioInterrupcion
addwf PCL,F
Mensaje_ON
Mensaje_Ajuste
Mensaje_OFF
DT "
PARADO", 0x00
270
call
bsf
movlw
movwf
bsf
bsf
bcf
bcf
bcf
clrw
call
movwf
call
movlw
movwf
LCD_Inicializa
STATUS,RP0
b'00000111'
OPTION_REG
AjustePulsador
IncrementarPulsador
SalidaTemporizador
Zumbador
STATUS,RP0
EEPROM_LeeDato
Tiempo deseado
ModoTemporizador_OFF
b'10001000'
INTCON
FinInterrupcion bcf
btfsc
call
btfss
INTCON,T0IF
Temporizador
INTCON,RBIF
goto
btfss
FinInterrupcion
AjustePulsador
call
CambiarModo
btfsc
goto
IncrementarPulsador
FinInterrupcion
call
Retardo_20ms
btfsc
IncrementarPulsador
goto
btfsc
FinInterrupcion
F_Temporizador_OFF
call
btfsc
call
ModoTemporizador_ON
F_Temporizador_Ajuste
IncrementarTiempoDeseado
INTCON,RBIF
bcf
INTCON,T0IF
retfie
271
;
;
;
;
;
;
;
B)
C)
que termina una temporizacin o cuando se aborta la temporizacin sin esperar a que
finalice. Reconocido por el flag F_Temporizador_OFF, bit 0 del registro FlagsModos.
una temporizacin o cada vez que se aborta la temporizacin sin esperar a que finalice.
Modo "Temporizador_Ajuste", donde se ajusta la temporizacin deseada cuando funcione
como temporizador. Reconocido por el flag F_Temporizador_Ajuste, bit 1 del FlagsModos.
Modo "Temporizador_ON", la salida esta activada mientras dure la temporizacin.
Reconocido por el flag F_Temporizacion_ON, que es el bit 2 del registro FlagsModos.
; El programa consigue que esta activado uno solo de los flags anteriores.
; El contenido del registro (FlagsModos) diferencia los siguientes modos de funcionamiento:
;
;
;
CambiarModo call
btfsc
goto
btfsc
goto
btfss
goto
PitidoCorto
AjustePulsador
EsperaDejePulsar
F_Temporizador_OFF
ModoTemporizador_Ajuste
F_Temporizador_Ajuste
ModoTemporizador_OFF
clrw
movwf EEADR
movf TiempoDeseado,W
call
EEPROM_EscribeDato
ModoTemporizador_OFF
ModoTemporizador_Ajuste
bcf
call
movlw
movwf
bcf
movf
movwf
call
movlw
goto
SalidaTemporizador
Pitido
b'00000001'
FlagsModos
INTCON,T0IE
TiempoDeseado,W
Tiempo
LCD_Borra
Mensaje_OFF
FinCambiarModo
call Retardo_100ms
bcf
SalidaTemporizador
movlw b'00000010'
movwf FlagsModos
clrf
Tiempo
clrf
Tiempo deseado
bcf
INTCON,T0IE
call
LCD_Borra
movlw Mensaje_Ajuste
goto
FinCambiarModo
; Apaga la carga
; Actualiza el registro FlagsModos pasando
; al modo "Temporizador_Ajuste".
; Resetea el tiempo.
; Prohbe las interrupciones del TMR0.
; En pantalla el mensaje correspondiente.
272
ModoTemporizador_ON
FinCambiarModo
EsperaDejePulsar
movf TiempoDeseado,W
; Si el tiempo deseado es cero pasa a modo
btfsc STATUS,Z
; de trabajo "Temporizador_OFF".
goto
ModoTemporizador_OFF
movwf Tiempo
call
PitidoCorto
movlw b'00000100'
; Actualiza el registro FlagsModos pasando
movwf FlagsModos
; al modo "Temporizador_ON".
movlw TMR0_Carga50ms
; Carga el TMR0.
movwf TMR0
movlw Carga_1s
; Y el registro cuyo decremento contar los
movwf Registro50ms
; segundos.
bsf
INTCON,T0IE
; Autoriza las interrupciones de TMR0.
call
LCD_Borra
bsf
SalidaTemporizador
; Enciende la carga.
call Retardo_100ms
movlw Mensaje_ON
; En pantalla el mensaje correspondiente.
call
LCD_Mensaje
call
VisualizaTiempo
btfss AjustePulsador
goto
EsperaDejePulsar
return
ENDC
TMR0_Carga50ms
Carga_1s
EQU
EQU
d'195'
d'20'
Temporizador
call
call
nop
movlw
movwf
decfsz
goto
movlw
movwf
btfss
goto
decfsz
goto
bcf
call
call
call
call
call
call
Retardo_50micros
Retardo_20micros
TMR0_Carga50ms
TMR0
Registro50ms,F
FinTemporizador
Carga_1s
Registro50ms
F_Temporizador_ON
FinTemporizador
Tiempo,F
VisualizaContador
SalidaTemporizador
VisualizaTiempo
Pitido
Retardo_500ms
Pitido
Retardo_500ms
PitidoLargo
; Carga el Timer0.
; Decrementa el contador.
; No ha pasado 1 segundo y por tanto sale.
; Repone el contador nuevamente.
; Si no est en modo "Temporizador_ON" sale
; fuera.
; Visualiza el tiempo restante.
; Apaga la salida
; Visualiza cero segundos en la pantalla.
; Tres pitidos indican final de la temporizacin.
273
call
call
goto
VisualizaContador
FinTemporizador
Retardo_500ms
ModoTemporizador_OFF
FinTemporizador
; Acabo la temporizacion.
call
VisualizaTiempo
return
call Retardo_100ms
movlw d'5'
; Para centrar visualizacion en la
call
LCD_PosicionLinea2 ; segunda linea.
movf Tiempo,W
; Convierte el tiempo deseado (y expresado solo en
call
MinutosSegundos
; segundos) a minutos y segundos.
movf TemporizadorMinutos,W
; Visualiza los minutos.
call
BIN_a_BCD
; Lo pasa a BCD.
call
LCD_Byte
movlw ':'
; Visualiza dos puntos.
call
LCD_Caracter
movf TemporizadorSegundos,W
; Visualiza los segundos.
call
BIN_a_BCD
; Lo pasa a BCD.
goto
LCD_ByteCompleto
return
movwf TemporizadorSegundos
clrf
TemporizadorMinutos
movlw d'60'
subwf TemporizadorSegundos,W
274
btfss
STATUS,C
goto
FinMinutosSegundos
movwf TemporizadorSegundos
FinMinutosSegundos
incf
TemporizadorMinutos,F
goto
Resta60
return
; (W) positivo?,
(TemporizadorSegundos)>=60?.
; No, es menor de 60. Acabo.
; Si, por tanto, recupera lo que queda por
restar.
; Incrementa los minutos.
; Y vuelve a dar otra pasada.
EQU
d'5'
IncrementarTiempoDeseado
call
PitidoCorto
movlw SaltoIncremento
addwf Tiempo,F
btfsc
STATUS,C
clrf
call
Tiempo
VisualizaTiempo
call
btfss
goto
movf
movwf
return
Retardo_100ms
IncrementarPulsador
IncrementarTiempoDeseado
Tiempo,W
Tiempo deseado
bsf
call
bsf
call
bsf
call
bcf
return
Zumbador
Retardo_500ms
Zumbador
Retardo_200ms
Zumbador
Retardo_20ms
Zumbador
<RETARDOS.INC>
<BIN_BCD.INC>
<LCD_4BIT.INC>
<LCD_MENS.INC>
<EEPROM.INC>
END
275