Está en la página 1de 283

Entrenadores de

Microcontroladores PIC

Profesor: Pedro Alonso Sanz


Instituto: I.E.S. Joan Mir
Localidad: San Sebastin de los Reyes

ndice

Pgina

1.- Entrenador Bsico 0 ...................................................................................................

1.1.- Ejemplo1.asm

Leer el Puerto C y transferirlo al Puerto B .......................

1.2.- Ejemplo2.asm

Leer el Puerto C complementarlo y


transferirlo al Puerto B .....................................................

1.3.- Ejemplo3.asm

Parpadeo de un Led ........................................................

1.4.- Ejemplo3A.asm

Parpadeo de un Led ,utilizando una librera


de Tiempo RETAR_1S.INC...............................................
Parpadeo de un Led utilizando una librera llamada
RETARDOS.INC del libro de Desarrollo de Proyectos. ....

1.5.- Ejemplo3B.asm

12
14

1.6.- Ejemplo4.asm

Simular las luces del Coche Fantstico. ...........................

15

1.7.- Ejemplo5.asm

Simular las luces del Coche Fantstico


controlado por PCO. ..........................................................

18

1.8.- Nom_disp.asm

Poner el Nombre en el Display. .........................................

21

1.9.- Sum_Nibl.asm

Sumar los nibles del Puerto C y llevarlos al Puerto B. ......

24

1.10.- Dir_ind.asm

Direccionamiento Indirecto. ...............................................

26

1.11.- Pagina1.asm

Trabajar con la Pagina 1 de memoria de programa. .........

28

1.12.- RETARDO_1S.INC

Librera Casera de Retardo 1 Segundo. ....... ....................

30

1.13.- RETARDOS.INC

Librera de Retardos del libro de Desarrollo


de Proyectos. .....................................................................

31

2.- Entrenador Bsico 1 ....................................................................................................

35

2.1.- Ejemplo6.asm

Encender displays dependiendo de PC0. ........................

36

2.2.- Ejemplo7.asm

Contar pulsos procedentes de PC0 y llevarlos


al Display de Unidades. ...................................................

38

Contar pulsos procedentes de PC0 y llevarlos


al Display de Unidades y Decenas. ..................................

41

3.- Entrenador Bsico 2 .....................................................................................................

46

2.3.- Ejemplo8.asm

3.1.- Ejemplo9.asm

Contar pulsos procedentes de PC0 y llevarlos


al Display de Unidades y Decenas. .................................

47

4 .- Entrenador Bsico 2A ................................................................................................

52

4.1.- PWM_1.asm.
4.2.- PWM_CAD.asm

Control de un Servomotor de Posicin


con PWM a travs del Puerto B .......................................

53

Control de un Servomotor de Posicin


con PWM a travs de un Potencimetro. ........................

55

5.- Entrenador Bsico 3. ...............................................................................................

58

5.1.- Ejempl10.asm

59

Interrupcin Externa. .....................................................

ndice

Pgina

5.2.- Ejemp_11.asm

Conversin Analgico/Digital. .......................................

64

5.3.- Ejemp_12.asm

Contar pulsos del exterior utilizando un


Temporizador TIMER 0. ................................................

66

Transferir una Tabla de datos de memoria


EPROM a RAM y Puerto B utilizando
como subrutina de tiempo el TIMER 0 y
direccionamiento indirecto. ............................................

68

Detectar el numero mayor de una Tabla. .......................

71

6.- Entrenador Bsico 4 ..................................................................................................

75

6.1.- T_S_A.asm

Transmisor SERIE asncrona. .......................................

76

6.2.- R_S_A.asm

Receptor SERIE asncrona. ...........................................

79

6.3.- T1_S_RF.asm

Transmisor SERIE asncrona utilizando


Librera de Transmisin T_S_RF_INC. .........................

82

Receptor SERIE asncrona utilizando


Librera de Recepcin R_S_RF.INC. .............................

84

Librera Transmisor SERIE va


Radiofrecuencia para una Tarjeta
Emisora SAW para Datos 433,92 MHz
( CEBEK C-0503 )
Llave de entrada fija.
Cargar en W el dato a transmitir.....................................

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

Librera Receptor SERIE va


Radiofrecuencia para una Tarjeta
Emisora SAW para Datos 433,92 MHz
( CEBEK C-0504 )

La Llave de entrada fija.


Los datos se validan si llegan dos datos
idnticos consecutivos.

El dato recibido se carga en el registro


6.7.- T_M_S_RF.INC

6.8.- R_M_S_RF.INC

DATO_SERIE_VALIDO. ...............................................

90

Librera de Transmisor SERIE va


Radiofrecuencia para una Tarjeta
Emisora SAW para Datos 433,92 MHz.
( CEBEK C-0503 )
Cargar la llave de entrada en el registro
LLAVE_ENTRADA
Cargar en W el dato a transmitir. ....................................

94

Librera Receptor SERIE va


Radiofrecuencia para una Tarjeta
Emisora ;SAW para Datos 433,92 MHz.
( CEBEK C-0504 )
La Llave de entrada aleatoria.
Los datos se validan si llegan dos datos
idnticos consecutivos.
El dato recibido se carga en el registro
DATO_SERIE_VALIDO. .................................................

98

ndice

Pgina

7.- Entrenador Bsico 5 ..................................................................................................

102

7.1.- Tecla0.asm

Manejo del Teclado utilizando la tcnica de polling. ......

103

7.2.- Tecl_01.asm

Manejo del Teclado utilizando la tcnica de


interrupcin del programa principal. ...............................

105

Manejo del Teclado utilizando la tcnica de


interrupcin del programa principal y llevando
los datos al display de 7 segmentos. ..............................

108

Librera que transforma un cdigo hexadecimal


en 7 segmentos. ..............................................................

110

Librera de control del teclado. ........................................

111

7.2.- Tecl_02.asm

7.4.- HEX_7SEG.INC
7.5.-TECLADO.INC

8.- Entrenador Bsico 6 ..................................................................................................


8.1.- LCD_01.asm

Visualizacin de un mensaje en el LCD


carcter a carcter. .........................................................

115
116

8.2.- LCD_02.asm

Visualizacin de un mensaje en el LCD


carcter a carcter con retardo de 500 mS,
borrar pantalla y comenzar de nuevo. .............................. 117

8.3.- LCD_03.asm

Programa ejemplo para comprender la


utilizacin de las subrutinas LCD_ByteCompleto,
LCD_Byte, LCD_Nibble y LCD_DosEspaciosBlancos. ...

118

8.4.- LCD_04.asm

Visualizacin en el LCD un contador descendente. ........

120

8.5.- LCD_05.asm

Visualizar en la pantalla del LCD los pulsos


generados del exterior. ....................................................

122

Visualizar en la pantalla del LCD los pulsos


generados del exterior hasta un nmero mximo,
se resetea y comienza de nuevo la cuenta. .....................

123

Mientras se mantenga presionado el pulsador


conectado al pin RA4, incrementa un contador
que se visualiza en la pantalla del LCD. ..........................

125

Mientras se mantenga presionado el pulsador


conectado al pin RA4, incrementa un contador
que se visualiza en la pantalla del LCD en formato
decimal ,hexadecimal y binario. .......................................

127

Visualizacin de un mensaje fijo utilizando


la librera LCD_4BIT.INC. ................................................

129

Visualizacin de un mensaje fijo utilizando


la librera LCD_MENS.INC. .............................................

131

Visualizacin de varios mensajes fijo utilizando


la librera LCD_MENS.INC. .............................................

132

Visualizacin de varios mensajes fijo utilizando


la librera LCD_MENS.INC cuando se visualiza el
ultimo mensaje el proceso se repite. ...............................

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

Visualizacin de un mensaje fijo y parpadeantes. ..........

137

8.15.- Mens_06.asm

Visualizacin de mensajes en funcin de un pulsador. ... 138

8.16.- Mens_07.asm

El modulo LCD visualiza un mensaje largo


(mas de 16 caracteres) que se desplaza. .......................

141

8.17.- Mens_08.asm

Juego de la Quiniela. ......................................................

142

8.18.- Mens_09.asm

La pantalla del LCD visualiza un mensaje


en funcin de un pulsador. ..............................................

144

Librera que convierte un nmero Binario en BCD.


El resultado se guarda en tres posiciones de memorias
llamadas: BCD_Centenas, BCD_Decenas
y BCD_Unidades. ............................................................

145

8.19.- BIN_BCD.INC

8.20.- LCD_4BIT.INC

Librera que permiten realizar las tareas bsicas


de control de un mdulo LCD de 2 lneas por 16
caracteres, compatible con el modelo LM016L. .............. 146

8.21.- LCD_MENS.INC

Librera de subrutinas para el manejo de mensajes


a visualizar en un visualizador LCD. ...............................

151

9.- Entrenador Bsico 7 ..................................................................................................

154

9.1.- Tecla_01.asm
9.2.- Tecla_02.asm
9.3.- Tecl_03.asm
9.4.- Tecla_04.asm

La pantalla del LCD visualiza el orden de la tecla


pulsada utilizando la tcnica de polling. .........................

155

La pantalla del LCD visualiza el valor hexadecimal


de la tecla pulsada utilizando la tcnica de polling. ........

156

La pantalla del LCD visualiza el valor hexadecimal


de la tecla pulsada utilizando tcnicas de interrupcin. ..

157

La pantalla del LCD visualiza caracteres espaoles


en funcin de la tecla pulsada. ........................................

159

9.5.- Tecla_05.asm

La pantalla del LCD aparece un mensaje en


movimiento y fijo en la primera lnea y en la
segunda lnea visualiza la tecla pulsada. 161

9.6.- Tecla_06.asm

La pantalla del LCD aparece la tecla pulsada


primero la lnea 1 y despus en la lnea 2
repitindose el proceso. ................................................... 163

9.7.- Tecla_07.asm

La pantalla del LCD aparece la tecla pulsada si esta


es decimal y si se pulsa otra tecla borra pantalla. ........... 165

9.8.- Tecla_08.asm

Suma el valor de tres teclas y aparece en el LCD


en decimal y hexadecimal. ..............................................

166

Cerradura Electrnica. ....................................................

169

9.8.- Tecla_09.asm

ndice

Pgina

10.- Entrenador Bsico 7-1 ............................................................................................

173

10.1.- Tecla_10.asm

Cerradura Electrnica activando un motor PAP. ...........

174

11.- Entrenador Bsico 8. ..............................................................................................

179

11.1.- I2C1.asm

Leer un dato del circuito integrado expansor de


bus PCF8476 y transmitirlo a travs del bus I2C al
microprocesador. Transferir el dato del
microprocesador a otro C.I. PCF8476. ...........................

180

11.2.- I2C2.asm

Leer un dato del circuito integrado expansor de


bus PCF8476 y transmitirlo a travs del bus I2C al
microprocesador. Transferir el dato del
microprocesador a otro C.I. PCF8476 interrumpiendo
un programa principal. ..................................................... 181

11.3.- I2C3.asm

Realizar una conversin Analgica / Digital y


transmitirla a los expansores de bus PCF8476. .............. 183

12.- Entrenador Bsico 8-1. .............................................................................................. 186


12.1.- I2C4.asm

Leer datos cada vez que activamos un Pulsador,


de circuitos integrados expansores de bus PCF8476
y transmitirlo a travs del bus I2C al microprocesador.
Transferir los dato del microprocesador a
otros C.I. PCF8476. .......................................................... 187

12.2.- I2C5.asm

Leer datos de circuitos integrados expansores de


bus PCF8476 y transmitirlo a travs del bus I2C
al microprocesador.
Transferir los datos del microprocesador a otros
C.I. PCF8476, interrumpiendo un programa principal. ..... 189

13.- Entrenador Bsico 9. .................................................................................................. 192


13.1.- I2C6.asm

Leer constantemente la entrada analgica ANI0


del Esclavo 1 (PCF8591) y visualiza la tensin
en la pantalla del modulo LCD. ......................................... 193

13.2.- I2C7.asm

En la salida analgica del Esclavo 2 (PCF8591)


que trabaja como DAC se obtiene una tensin
seleccionada por un pulsador conectado a la lnea
RB6 del PIC. La tensin varia entre 0,50 y 2,50 V
en saltos de 0,25 V y se visualiza en el modulo LCD. ..... 196

13.3.- I2C8.asm

Leer constantemente la entrada analgica ANI0


del Esclavo 1(PCF8591), llevarla al Esclavo 2
(PCF8591) y visualiza la tensin en la pantalla
del modulo LCD. ................................................................ 199

13.4.- I2C.INC

Librera de Transmisin y recepcin de datos con I2C. .... 203

13.5.- I2C1.INC

Librera de Transmisin y recepcin de datos con I2C1.


En la subrutina (Transmitir_dato_I2C) el Esclavo no

confirma la transmisin. ............................................. 205

14.- Entrenador Bsico 10. ................................................................................................ 208


14.1.- RTS232_1.asm

En la pantalla del modulo LCD se visualizaran los


caracteres que se reciban a travs del puerto
serie del ordenador. Lo que se escriba por el teclado
del ordenador aparecer en la pantalla del sistema
con microcontrolador. ....................................................... 209

14.2.- RTS232_2.asm

En el modulo LCD se visualizan los caracteres que se


escriban en el teclado del ordenador y se transmiten
a travs de su puerto serie. Estos datos volvern a
ser enviados por el microcontrolador al ordenador, para
que se visualicen en su monitor. ....................................... 210

14.3.- RTS232_3.asm

Lo que se escriba por el teclado se visualiza en el


LCD y en el monitor del ordenador, pero en este
ultimo se visualiza un solo carcter por lnea. ................... 211

14.4.- RTS232_4.asm

En el modulo LCD se visualizan los caracteres que se


escriben en el teclado del ordenador. Si pulsa la tecla
Enter se comienza a escribir en la segunda lnea de la
pantalla del modulo LCD. .................................................. 213

14.5.- RTS232_5.asm

Este programa enva un mensaje grabado en la


memoria de programa del microcontrolador al
ordenador. Es decir, en el monitor del ordenador
aparecer el mensaje grabado en el PIC. ......................... 214

14.6.- RTS232_6.asm

Este programa enva varios mensajes grabados en la


memoria de programa del microcontrolador al ordenador.
Cada mensaje permanecer en pantalla durante unos
segundos hasta que sea sustituido por el siguiente. ......... 216

14.7.- RTS232_7.asm

En el monitor del ordenador se visualizan mensajes


grabados en la memoria de programa del
microcontrolador. El cambio de mensaje se ejecuta
cada vez que se pulse la tecla Enter. ................................ 218

14.8.- RTS232_8.asm

Programa que visualiza en el modulo LCD el cdigo


ASCII en formato hexadecimal de la tecla pulsada
y tambin en el monitor del ordenador en formato
decimal. ............................................................................... 220

14.9.- RTS232_9.asm

SISTEMA DE MONITORIZACION: Se trata de leer el


estado de las entradas conectadas a las lneas
<RB7:RB4> del Puerto B y se envia por el puerto RS232
a un terminal para monitorizar el estado de los mismos.
El estado de las entradas se mostrara cada 1 segundos. ... 221

14.10.- RTS23_10.asm

SISTEMA DE MONITORIZACION: Se trata de leer el


estado de las entradas conectadas a las lneas
<RB7:RB4> del Puerto B y se envia por el puerto RS232
a un terminal para monitorizar el estado de los mismos.
Se utilizara las interrupciones por cambio de nivel en
una lnea del Puerto B, por ello, las entradas deben
conectarse a la parte alta del Puerto B. .............................. 224

14.11.- RTS23_11.asm

SISTEMA DE GOBIERNO DESDE ORDENADOR:


Desde el teclado de un ordenador se desea
comandar el movimiento de una estructura mvil. .............. 227

14.12.- RS232_RT.INC

Librera de transmisin-recepcin serie asncrona


segn normas RS-232. ......................................................... 230

14.13.- RS232MEN.INC

Librera de transmisin de mensajes desde el


microcontrolador hacia el ordenador a travs del puerto
serie RS232. ......................................................................... 232

15.- Entrenador Bsico 11. ................................................................................................... 234


15.1.- Int_T_01.asm

Onda cuadrada de 10 kHz aproximadamente,


mediante la interrupcin por desbordamiento
del Timer 0. ........................................................................... 235

15.2.- Int_T_02.asm

Onda cuadrada de 10 kHz exactos, mediante la


interrupcin por desbordamiento del Timer 0. ...................... 236

15.3.- Int_T_03.asm

Led ON/OFF 500 ms utilizando la interrupcin


por desbordamiento del Timer 0. .......................................... 238

15.4.- Int_T_04.asm

Led ON (800 ms) Led OFF (500 ms), utilizando la


interrupcin por desbordamiento del Timer 0. ...................... 240

15.5.- Int_T_05.asm

Sistema multitarea ( Mostrar mensajes en el


LCD y LED ON/OFF (500 ms). .. 242

15.6.- Int_T_06.asm

Mostrar mensajes en el LCD fijo en la primera


lnea e intermitente en lasegunda lnea utilizando
la interrupcin del Timer 0. ................................................... 244

15.7.- Int_C_01.asm

Generar una seal cuadrada por PB2, de frecuencia


variable en funcin de PB7. El modulo LCD visualiza
dicha frecuencia. .................................................................. 246

15.8.- Int_C_02.asm

Generar una seal cuadrada por PB2, de frecuencia


variable desde 300Hz hasta 4000Hz. .................................. 250

15.9.- Int_C_03.asm

Encender y apagar una sirena en funcin de RB7 y


RB6, mostrar en el modulo LCD como esta la sirena. ......... 252

15.10.- Int_C_04.asm

Control del Ciclo de Trabajo de un seal cuadrada. ............ 256

15.11.- Int_Re_01.asm

Reloj digital en tiempo real sin puesta en hora


utilizando la interrupcin del Timer 0. .................................. 260

15.12.- Int_Re_04.asm

Reloj digital en tiempo real con puesta en hora. .................. 264

15.13.- Int_Temp.asm

Temporizador digital de precisin. ....................................... 270

1.- Entrenador Bsico 0

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 cdigo de Reset


ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa

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

title " Leer el Puerto C y transferirlo 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.
;**************************** Elegimos PIC ********************************************************************
list p=16f877, f=inhx32
;************* Asignacin de nombres 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 ************************************************************************
;**************************** Seccin Cdigo de Reset *******************************************************
ORG

0x00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Seccin de Configuracin ******************************************************


ORG 0x05
COMIENZO

; Inicio de Programa
;(Una posicin detrs del vector de Interrupcin)

BSF STATUS,RP0
MOVLW B'11111111'
MOVWF TRISC
CLRF TRISB
BCF STATUS,RP0

; Poner el Puerto C como entrada de datos.


; Poner el Puerto B como salida de datos.

;**************************** Principal **************************************************************************


SEG1

MOVF PORTC,W
MOVWF PORTB
GOTO SEG1
END

; Leer el Puerto C y llevarlo al Acumulador.


; Transferir el dato del Acumulador al Puerto B

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 cdigo de Reset


ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa

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

title " Leer el Puerto C, complementarlo y transferirlo 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.
;**************************** 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 ************************************************************************
;**************************** Seccin Cdigo de Reset *******************************************************
ORG

0x00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Seccin de Configuracin *******************************************************


ORG 0x05
COMIENZO

; Inicio de Programa
; (Una posicin detrs del vector de Interrupcin)

BSF STATUS,RP0
MOVLW B'11111111'
MOVWF TRISC
CLRF TRISB
BCF STATUS,RP0

; Poner el Puerto C como entrada de datos.


; Poner el Puerto B como salida de datos.

;**************************** Inicio *******************************************************************************


INICIO
Acumulador.

COMF PORTC,W

; Complementar el Puerto C y llevarlo al

MOVWF PORTB
GOTO INICIO
END

; Transferir el dato del Acumulador al Puerto B

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 cdigo de Reset


ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa

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

PB0 1 ; Encender el Led de PB0

SEGUNDO

PB0 0 ; Apagar el Led de PB0

SEGUNDO

title " Parpadeo de un Led "


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

EQU 0X10

DATO2

EQU 0X64

DATO3

EQU 0X64

;**************************** Registros ************************************************************************


REG1 EQU 0X22
REG2 EQU 0X23
REG3 EQU 0X24
;**************************** Seccin Cdigo de Reset *******************************************************
ORG

0x00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Seccin de Configuracin *******************************************************


ORG 0x05
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin)

BSF STATUS,RP1
BSF STATUS,RP0
CLRF TRISB
; Configuramos el Puerto B como salidas
BCF STATUS,RP0
CLRF PORTB

;**************************** Inicio ****************************************************************************


SEGUIR

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

Seccin de cdigo de Reset


ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa

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

PB0 0 ; Apagar el Led de PB0

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

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Seccin de Configuracin *******************************************************


ORG 0x05
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin)

BSF STATUS,RP0
CLRF TRISB ; Configuramos el Puerto B como salidas
BCF STATUS,RP0
CLRF PORTB

;**************************** Inicio *******************************************************************************


SEGUIR

BSF PORTB,0
CALL SEGUNDO
BCF PORTB,0
CALL SEGUNDO
GOTO SEGUIR

;********************************** Libreras *********************************************************************


INCLUDE <RETAR_1S.INC>
END

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

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Seccin de Configuracin ********************************************************


ORG 0x05
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin

BSF STATUS,RP0
CLRF TRISB ; Configuramos el Puerto B como salidas
BCF STATUS,RP0
CLRF PORTB

;**************************** Inicio *******************************************************************************


SEGUIR

BSF PORTB,0
CALL Retardo_1s
BCF PORTB,0
CALL Retardo_1s
GOTO SEGUIR

;**************************** Libreras ***************************************************************************


INCLUDE <RETARDOS.INC>
END

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 cdigo de Reset


ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa

Seccin de Configuracin
ORG 0x05

PORTB DATO

Retardo_100ms

; Inicio de Programa

COMIENZO CONTADOR 00000000 B ; Resetear CONTADOR


RP0 1
; Ir al Banco 1
TRISB 00000000 B ; Poner el Puerto B como
salida de datos.
RP0 0
; Ir al Banco 0

DATO 10000000 B ; Encendemos el Led PB7


y guardamos el cdigo en un Registro.

CONTADOR CONTADOR + 1

CONTADOR =
7?

NO

SI
CONTADOR 00000001 B

title " Simular las luces del Coche Fantstico "


15

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

;*************************** Registros **************************************************************************


CBLOCK 0X20
CONTADOR
DATO
ENDC
;**************************** Seccin Cdigo de Reset ********************************************************
ORG

0x00

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;**************************** Seccin de Configuracin ********************************************************


ORG 0x05
COMIENZO

CLRF CONTADOR
BCF STATUS,RP1
BSF STATUS,RP0
MOVLW B'00000000'
MOVWF TRISB
BCF STATUS,RP0

; Inicio de Programa (Una posicin detrs del vector de Interrupcin


; Selecciono la pagina 1 de la memoria
; Configuro el PB salidas .
; Selecciono la pagina 0 de la memoria

;*************************** Principal *************************************************************************


SEGUIR

MOVLW B'10000000'
MOVWF DATO

; Encendemos el Led PB7


; Guardamos el cdigo en un Registro.

16

SEG1

SEG4

SEG2
SEG3

MOVF DATO,W
MOVWF PORTB

;Transferimos la informacin del registro DATO


; al Puerto B.

INCF CONTADOR

; Incrementamos CONTADOR.

CALL Retardo_100ms

; Llamamos a la Subrutina de Retardo TIEMPO.

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

; Transferimos la informacin del registro DATO


; al Puerto B.

CALL Retardo_100ms ; Llamamos a la Subrutina de Retardo TIEMPO.


INCF CONTADOR
; Preguntamos si CONTADOR = 7
MOVF CONTADOR,W
XORLW 0X07
BTFSS STATUS,Z
GOTO SEG3
; Seguimos hacia la Izquierda.
MOVLW 0X01
; Ponemos el CONTADOR = 1 y volvemos hacia la izquierda.
MOVWF CONTADOR
GOTO SEG4
;*************************** Subrutinas **********************************************************************
INCLUDE <RETARDOS.INC>
END

1.7.- Ejemplo5.asm

(Entrenador Bsico 0)
17

Diagrama de Flujo

Simular las luces del


Coche Fantstico
controlado por PCO

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

Seccin de cdigo de Reset

CY

DATO

ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa
PORTB DATO

Seccin de Configuracin
ORG 0x05

; Inicio de Programa

COMIENZO CONTADOR 00000000 B ; Resetear CONTADOR


RP0 1
; Ir al Banco 1
TRISB 00000000 B ; Poner el Puerto B como
salida de datos.
RP0 0
; Ir al Banco 0
TRIRC (0) 1
; Poner PC0 como salida de
datos

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

title " Simular


el Coche Fantstico, controlado por PC0"
1
18

;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 ***********************************************************************
;**************************** Registros ************************************************************************
CBLOCK 0X20
CONTADOR
DATO
ENDC
;**************************** Seccin Cdigo de Reset *******************************************************
ORG

0x00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Seccin de Configuracin *******************************************************


ORG 0x05
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin)

CLRF CONTADOR
BCF STATUS,RP1
BSF STATUS,RP0
MOVLW B'00000000'
MOVWF TRISB
BSF TRISC,0
BCF STATUS,RP0

; Selecciono la pagina 1 de la memoria


; Configuro el PB salidas .
; Selecciono la pagina 0 de la memoria

;*************************** Principal ***************************************************************************


SEGUIR

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

; Transferimos la informacin del registro DATO


; al Puerto B.
; Incrementamos CONTADOR.

CALL Retardo_100ms
MOVF CONTADOR,W
XORLW 0X08
BTFSC STATUS,Z
GOTO SEG2

; Llamamos a la Subrutina de Retardo TIEMPO.


; Preguntamos si CONTADOR = 8

SEG4

BCF STATUS,C
RRF DATO,F
GOTO SEG1

SEG2
SEG3

CLRF CONTADOR ; Si CONTADOR = 4 ponemos el CONTADOR=0,Cy=0 y


BCF STATUS,C
; rotamos hacia la Derecha el registro DATO.
RLF DATO,F

PARAR2

MOVF DATO,W
MOVWF PORTB
BTFSS PORTC,0
GOTO PARAR2
INCF CONTADOR

; Si CONTADOR <> 4 ponemos el Cy=0 y rotamos hacia


; la Izquierda el registro DATO.
; Seguimos hacia la Izquierda.

; Transferimos la informacin del registro DATO


; al Puerto B.

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

Numero_de_caracteres EQU D '5'

Retardo_500ms

; Registros
CONTADOR CONTADOR + 1

CBLOCK 0X20
CONTADOR
ENDC

CONTADOR
=

NO

Seccin de cdigo de Reset

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'

;Retorna con W cargado con P


;Retorna con W cargado con E
;Retorna con W cargado con d

RETLW B'01010000'
RETLW B'01011100'

;Retorna con W cargado con r


;Retorna con W cargado con o

title " Poner el NOMBRE en el Display "


21

;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 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 ************************************************************************
Numero_de_caracteres EQU D'5'
;**************************** Registros *************************************************************************
CBLOCK 0X20
CONTADOR
ENDC
;**************************** Seccin Cdigo de Reset *******************************************************
ORG 0x00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Seccin de Configuracin *******************************************************


ORG 0x05
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin)

BSF STATUS,RP0
CLRF TRISD
BCF STATUS,RP0

; Selecciono la pagina 1 de la memoria


; Configuro el Puerto D como salida
; Selecciono la pagina 0 de la memoria

;*************************** Principal ***************************************************************************


SEG2
SEG1

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

;***************************** Subrutina de BINARIO_CARACTER *******************************************


BINARIO_CARACTER ADDWF PCL,F
RETLW B'01110011'
RETLW B'01111001'
RETLW B'01011110'
RETLW B'01010000'
RETLW B'01011100'

;Suma el Contador del Programa con el contenido


; de W y lo deja en el PC.
;Retorna con W cargado con P
;Retorna con W cargado con E
;Retorna con W cargado con d
;Retorna con W cargado con r
;Retorna con W cargado con o

;***************************** Libreras ***************************************************************************


INCLUDE <RETARDOS.INC>
END

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 )

Seccin de cdigo de Reset

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

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

;**************************** Registros **************************************************************************


CBLOCK 0X20
Numero_bajo
Numero_alto
ENDC
;**************************** Seccin Cdigo de Reset ********************************************************
ORG 0x00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Seccin de Configuracin ********************************************************


ORG 0x05
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin)

BSF STATUS,RP0
CLRF TRISB
MOVLW B'11111111'
MOVWF TRISC
BCF STATUS,RP0

; Selecciono la pagina 1 de la memoria


; Configuro el Puerto B como salida
; Selecciono la pagina 0 de la memoria

;**************************** Inicio *******************************************************************************


SEG1

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

Seccin de cdigo de Reset


ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa

Principal
ORG 0x05
COMIENZO

; Inicio de Programa
FSR # REG1
(FSR) D1

FSR FSR + 1

(FSR) D2

FSR FSR + 1

(FSR) D3

FSR FSR + 1

title "Direccionamiento FIN


indirecto "

26

;Programa para PIC 16F876a.


;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=16f876, 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 ************************************************************************
;*************************** Registros **************************************************************************
CBLOCK 0X20
REG1
REG2
REG3
ENDC
;**************************** Seccin Cdigo de Reset *******************************************************
ORG

0x00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Principal **************************************************************************


ORG 0x05
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin).

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 cdigo de Reset


ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa

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

title " Trabajar con la Pagina 1 de memoria de Programa "

28

;Programa para PIC 16F876a.


;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=16f876, 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 ***********************************************************************
;**************************** Registros *************************************************************************
;**************************** Seccin Cdigo de Reset ******************************************************
ORG

0x00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Seccin de Configuracin ******************************************************


ORG 0x05
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin)

BSF STATUS,RP0
MOVLW B'11111111'
MOVWF TRISC
CLRF TRISB
BCF STATUS,RP0

;**************************** Inicio *****************************************************************************


SEG1

BSF PCLATH,3 ;Ir a la Pagina1 de memoria de Programa


BCF PCLATH,4
CALL PAGINA1
GOTO SEG1

;****************************Subrutina Prueba Pagina1 *******************************************************


ORG 0800H
PAGINA1

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

;*********************** Librera Casera de Retardo 1 Segundo **********************************************


;*********************** Igualdades ******************************************************************************
DATO1

EQU D'100'

DATO2

EQU D'100'

DATO3

EQU D'20'

;*********************** Registros ********************************************************************************


CBLOCK
REG1
REG2
REG3
ENDC
;*********************** Subrutina 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

1.13.- RETARDOS.INC

(Entrenador Bsico 0)

30

;**************************** Librera "RETARDOS.INC" *****************************************************


;
;
===================================================================
;
Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;
E. Palacios, F. Remiro y L. Lpez.
;
Editorial Ra-Ma. www.ra-ma.es
;
===================================================================
;
; Librera con mltiples subrutinas de retardos, desde 4 microsegundos hasta 20 segundos.
; Adems se pueden implementar otras subrutinas muy fcilmente.
;
; Se han calculado para un sistema microcontrolador con un PIC trabajando con un cristal
; de cuarzo a 4 MHz. Como cada ciclo mquina son 4 ciclos de reloj, resulta que cada
; ciclo mquina tarda 4 x 1/4MHz = 1 s.
;
; En los comentarios, "cm" significa "ciclos mquina".
;
; ZONA DE DATOS *************************************************************************************
CBLOCK
R_ContA
R_ContB
R_ContC
ENDC

; Contadores para los retardos.

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

; Aporta (M-1)x2 ciclos mquina.


; El salto del retorno aporta 2 ciclos mquina.

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

2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 10000407 cm = 10 s.


(N=100, M=100 y K=249).
2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 5000207 cm = 5 s.
(N= 50, M=100 y K=249).
2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 2000087 cm = 2 s.
(N= 20, M=100 y K=249).
2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 1000047 cm = 1 s.
(N= 10, M=100 y K=249).
2 + 1 + (2 + 4N + 4MN + 4KMN) = 500025 cm = 0,5 s.
(N= 5, M=100 y K=249).

===================================================================
Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
E. Palacios, F. Remiro y L. Lpez.
Editorial Ra-Ma. www.ra-ma.es
===================================================================

34

2.- Entrenador Bsico 1

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 cdigo de Reset


ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa

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

; Poner el Puerto E como


salida de datos.
; Ir al Banco 0

PORTD 11111111 B

SI
PCO =
1?

; Encender Display de DECENAS


PORTE 00000010 B

NO
; Encender Display de UNIDADES
PORTE 00000001 B

36

title " Encender displays dependiendo de PC0 "


;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 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 ************************************************************************
;**************************** Registros *************************************************************************
;**************************** Seccin Cdigo de Reset *******************************************************
ORG

0x00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Seccin de Configuracin *******************************************************


ORG 0x05
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin)

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

;*************************** Principal ***************************************************************************


SEGUIR
SEG1
UNIDADES
DECENAS

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 cdigo de Reset


ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa

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

;Poner el Display de Unidades a cero


PORTD 00111111 B

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

;Retorna con W cargado con


;Retorna con W cargado con
;Retorna con W cargado con
;Retorna con W cargado con
;Retorna con W cargado con

1
38

title " Contar pulsos procedentes de PC0 y llevarlos al Display de Unidades "

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

EQU 0X0A

;**************************** Registros **************************************************************************


CBLOCK 0X20
CONTADOR
ENDC
;**************************** Seccin Cdigo de Reset ********************************************************
ORG

00h

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Seccin de Configuracin *********************************************************


ORG 05h
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin)

BSF STATUS,RP0
CLRF TRISD
MOVLW 0X06
MOVWF ADCON1

; Selecciono la pagina 1 de la memoria


; Configuro el Puerto D como salida de datos.
; Configuro el Puerto A y D como patillas digitales.

CLRF TRISE
BSF PORTC,0
BCF STATUS,RP0

; Configuro el puerto E como salida de datos.


; Configuro la patilla PC0 como entrada de datos.
; Selecciono la pagina 0 de la memoria

CLRF CONTADOR
MOVLW B'00111111'
MOVWF PORTD

; Poner el DISPLAY de unidades a cero.

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

;***************************** Subrutina de Tabla ***************************************************************


TABLA

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'

;Suma el Contador del Programa con el contenido


;de W y lo deja en el PC.
;Retorna con W cargado con 00H
;Retorna con W cargado con 01H
;Retorna con W cargado con 02H
;Retorna con W cargado con 03H
;Retorna con W cargado con 04H
;Retorna con W cargado con 05H
;Retorna con W cargado con 06H
;Retorna con W cargado con 07H
;Retorna con W cargado con 08H
;Retorna con W cargado con 09H

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

ADCON1 00000110 B ; Configuro las patillas de los


PUERTOS A y D como seales
digitales.
TRISD 00000000 B ; Poner el Puerto D como
salida de datos.
TRISE 00000000 B ; Poner el Puerto E como
salida de datos.
TRISC 11111111 B
; Poner Puerto C como entrada
de datos
RP0 0
; Ir al Banco 0
PULSOS 00000000 B ; Resetear el registro PULSOS, es
un registro que contiene el
numero de pulsaciones.
CONTADOR 00000001 B ; Iniciar el CONTADOR a 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 ?

Seccin de cdigo de Reset


ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa

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

; Habilitar display de las UNIDADES

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

; Habilitar display de las DECENAS

RETUR
N

PORTE 00000010 B

; Temporizar. Perder tiempo con dos NOP

Subrutina de
DIVIDIR

; Deshabilitar display de las UNIDADES y DECENAS

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'

;Retorna con W cargado con 00H


;Retorna con W cargado con 01H
;Retorna con W cargado con 02H
;Retorna con W cargado con 03H
;Retorna con W cargado con 04H
;Retorna con W cargado con 05H
;Retorna con W cargado con 06H
;Retorna con W cargado con 07H
;Retorna con W cargado con 08H

NO
COCIENTE COCIENTE + 1

RETURN

42

title " Contar pulsos procedentes de PC0 y llevarlos al Display de Unidades y


Decenas "
;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 del 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 ***********************************************************************
NMAYOR

EQU

D'100'

;**************************** Registros *************************************************************************


CBLOCK 0X20
CONTADOR
PULSOS
UNIDADES
DECENAS
CENTENAS
DIVIDENDO
DIVISOR
COCIENTE
RESTO
ENDC
;**************************** Seccin Cdigo de Reset **************************************************
ORG 0x00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Seccin de Configuracin *************************************************


ORG 0x05
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin

BSF STATUS,RP0
MOVLW 0X06

; Selecciono la pagina 1 de la memoria

43

MOVWF ADCON1
CLRF TRISD
CLRF TRISE
MOVLW B'11111111'
MOVWF TRISC
BCF STATUS,RP0
CLRF PULSOS ;

; Configuro el Puerto D como salida


; Configuro el Puerto E como salida
; Configuro el puerto PC como entrada.

; Selecciono la pagina 0 de la memoria


Resetear el registro PULSOS, es un registro que
contiene el numero de pulsaciones.
MOVLW B00000001 ; Inicializamos el CONTADOR con 1.
MOVWF CONTADOR ;
;*************************** Principal ****************************************************************************
SEGUIR

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

;***************************** Subrutina de BCD_7SEG ***************************************************************


BCD_7SEG

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'

;Suma el Contador del Programa con el contenido


;de W y lo deja en el PC.
;Retorna con W cargado con 00H
;Retorna con W cargado con 01H
;Retorna con W cargado con 02H
;Retorna con W cargado con 03H
;Retorna con W cargado con 04H
;Retorna con W cargado con 05H
;Retorna con W cargado con 06H
;Retorna con W cargado con 07H
;Retorna con W cargado con 08H
;Retorna con W cargado con 09H

;****************************** Subrutina de MOSTRAR_DISPLAY *********************************************


MOSTRAR_DISPLAY

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

movlw D100 ; Cargamos divisor con 100


movwf DIVISOR
movf PULSOS,w
call DIVIDIR
movf COCIENTE,w
movwf CENTENAS
movlw D10 ; Cargamos divisor con 10
movwf DIVISOR
movf RESTO,w
call DIVIDIR
movf COCIENTE,w
movwf DECENAS
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
END

45

3.- Entrenador Bsico 2

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

ADCON1 00000110 B ; Configuro las patillas de los


PUERTOS A y D como seales
digitales.
TRISD 00000000 B ; Poner el Puerto D como
salida de datos.
TRISE 00000000 B ; Poner el Puerto E como
salida de datos.
TRISB 00000000 B ; Poner el Puerto B como
salida de datos.

Elegimos PIC
List p=16f877 , f=inhx32

Asignacin de nombres de
RFS a direcciones.

TRISC 11111111 B

#include <p16f877.inc>

; Poner Puerto C como entrada


de datos

CONTADOR 00000000 B ; Resetear el CONTADOR


; Igualdades
NMAYOR

PORTD 00111111 B ; Poner los dispays a cero.


PORTB 00111111 B
PORTE 00000011 B

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

Seccin de cdigo de Reset

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'

;Retorna con W cargado con


COCIENTE 00000000 B

;Retorna con W cargado con


;Retorna con W cargado con

DIVIDENDO W

;Retorna con W cargado con


;Retorna con W cargado con

RESTO DIVIDENDO

DIVIDENDO DIVIDENDO - DIVISOR


SI
DIVIDENDO <
0?
NO
COCIENTE COCIENTE + 1

RETURN

48

title " Contar pulsos procedentes de PC0 y llevarlos al Display de Unidades y


Decenas "
;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 *************************************************************************
NMAYOR

EQU

D'100'

;**************************** Registros **************************************************************************


CBLOCK 0X20
CONTADOR
PULSOS
UNIDADES
DECENAS
CENTENAS
DIVIDENDO
DIVISOR
COCIENTE
RESTO
ENDC
;**************************** Seccin Cdigo de Reset **********************************************************
ORG 00h

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Seccin de Configuracin *********************************************************

COMIENZO

ORG 05h

; Inicio de Programa (Una posicin detrs del vector de Interrupcin

BSF STATUS,RP0
MOVLW 0X06

; Selecciono la pagina 1 de la memoria

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

; Configuro el Puerto D como salida


; Configuro el puerto PC como entrada.
; Selecciono la pagina 0 de la memoria
; Poner el Puerto D a cero.
; Poner el Puerto B a cero.

;************************************ Principal *****************************************************************


SEGUIR

SEG1

BTFSC PORTC,0
GOTO SEGUIR

; Preguntamos si hemos pulsado PC0

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

;****************************** Subrutina de MOSTRAR_DISPLAY ******************************************


MOSTRAR_DISPLAY CALL BIN_BCD
MOVF UNIDADES,w
CALL BCD_7SEG
MOVWF PORTD
MOVF DECENAS,w
CALL BCD_7SEG
MOVWF PORTB
RETURN
;***************************** Subrutina de Binario a BCD ********************************************************
BIN_BCD

movlw D'100' ; Cargamos divisor con 100


movwf DIVISOR
movf PULSOS,w
call DIVIDIR
movf COCIENTE,w
movwf CENTENAS
movlw D'10' ; Cargamos divisor con 10
movwf DIVISOR
movf RESTO,w
call DIVIDIR
movf COCIENTE,w
movwf DECENAS

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

;***************************** Subrutina de BCD_7SEG ********************************************************


BCD_7SEG

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'

;Suma el Contador del Programa


con el contenido de W y lo deja en el PC.
;Retorna con W cargado con 00H
;Retorna con W cargado con 01H
;Retorna con W cargado con 02H
;Retorna con W cargado con 03H
;Retorna con W cargado con 04H
;Retorna con W cargado con 05H
;Retorna con W cargado con 06H
;Retorna con W cargado con 07H
;Retorna con W cargado con 08H
;Retorna con W cargado con 09H

END

51

4.- Entrenador Bsico 2A

52

4.1.- PWM_1.asm

(Entrenador Bsico 2A)

Diagrama de Flujo
1
Control de un
Servomotor de
Posicin con PWM
a travs del Puerto

Elegimos PIC
List p=16f876 , f=inhx32

; Leer el Puerto B complementarlo


y cargarlo en el registro CCPR1L.
Este registro fija el tiempo en el nivel
alto de la seal PWM.
CCPR1L PORTB

Asignacin de nombres de
RFS a direcciones.

#include <p16f876.inc>

Retardo 20ms

; Igualdades
PERIODO

EQU D255

; Representa el Periodo de la seal de PWM.

; Registros
CBLOCK 0X20
ENDC

Seccin de cdigo de Reset


ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa

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

; Representa el Periodo de la seal de PWM.

;**************************** Registros **************************************************************************


CBLOCK 0X20
ENDC
;**************************** Seccin Cdigo de Reset ********************************************************
ORG

0X00

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;**************************** Seccin de Configuracin *******************************************************


ORG 0X05
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

; Habilitamos PC2 como salida para atacar el Servomotor 1.


; Cargamos el Periodo de la seal de PWM.
;Cargamos el valor preescalar. (PWM INTERNO)
;Cargamos los 2 BIT menos significativos del nivel
;Alto de la Seal PWM y configuramos y lanzamos PWM.
;Salida de seal por RC2

;*************************** Principal *****************************************************************************


SEG1

COMF PORTB,W
MOVWF CCPR1L
CALL Retardo_20ms

; Nivel Alto de la seal PWM (Salida por RC2).


; Tiene que transcurrir un periodo antes de refrescar
; el nivel alto de la seal.

GOTO SEG1
;************************** Librerias *******************************************************************************
INCLUDE <RETARDOS.INC>
END

54

4.2.- PWM_CAD.asm

(Entrenador Bsico 2A)

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

; Poner Puerto B como salida


de dato

;Configuracin del Conversor Analogico/Digital.

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

;Configuracin del PWM.


Asignacin de nombres de
RFS a direcciones.

TRISC (2) 0

;Habilitamos PC2 como salida


para atacar el Servomotor 1.

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

Seccin de cdigo de Reset


ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa

; Lanzamos el Conversor Analgico / Digital


GO_DONE 1

; Es un BIT que est en el


registro ADCON0

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

; Cargamos el registro que contiene el dato


digital en el Puerto B
PORTB ADRESH

55

title " Control de un Servomotor de Posicin con PWM a travs de un


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

;(Datos). Representa el Periodo de la seal de PWM.

;**************************** Registros ***********************************************************************


CBLOCK 0X20
ENDC
;**************************** Seccin Cdigo de Reset *****************************************************
ORG

0X00

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;**************************** Seccin de Configuracin *****************************************************


ORG 0X05
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

;Configuracin del Conversor Analogico/Digital.

BSF STATUS,RP0

;Configuracin del PWM.

56

BCF TRISC,2

;Habilitamos PC2 como salida para atacar el Servomotor 1.

MOVLW PERIODO
MOVWF PR2

;Cargamos el Periodo de la seal de PWM.

BCF STATUS,RP0
MOVLW B'00000111'
MOVWF T2CON
MOVLW B'00001100'
MOVWF CCP1CON

;Cargamos el Valor Preescalar.(PWM INTERNO)


;Cargamos los 2 BIT menos significativos del nivel
;Alto de la seal PWM y configuramos y lanzamos PWM.
;Salida de seal por RC2

;*************************** Principal ********************************************************************


SEG2
SEG1

CALL Retardo_20ms

; Esperar un tiempo de adquisicion de 20 mS.(PERIODO DE LA


; SEAL), valido para el C A/D y para refrescar CCPR1L
BSF ADCON0,GO_DONE
BTFSC ADCON0,GO_DONE
GOTO SEG1
MOVF ADRESH,W
MOVWF CCPR1L
; Nivel Alto de la seal PWM (Salida por RC2).
COMF ADRESH,W
MOVWF PORTB
GOTO SEG2

;*************************** Libreras ********************************************************************


INCLUDE <RETARDOS.INC>
END

57

5.- Entrenador Bsico 3

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

; Poner Puerto B como salida


de datos excepto PB0 que es la patilla INT
TRISE (2) 0
; Poner PE2 como salida de datos.
TRISC 00000000 B
; Poner Puerto C como salida de datos.
INTEDG 0
; Est en el registro OPTION_REG
; Activa la patilla INT con flanco de bajada.
RP0 0
; Ir al Banco 0

Interrupcin
Externa

PORTB 00000000 B ; Apagar los Led del Puerto B.


PORTE (2) 1
INTCON 10010000 B ; Habilitar la Interrupcin INT.

Elegimos PIC
List p=16f876 , f=inhx32

Asignacin de nombres de
RFS a direcciones.

; Resetear el registro CONTADOR

#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

;Cargar el contenido del


Acumulador donde haya
apuntado el Puntero FSR

CONTADOR
W_TEMP
STATUS_TEMP
PIR1_TEMP
PORTB_TEMP
TMR1H_TEMP
TMR1L_TEMP
T1CON_TEMP
CONTADOR1

(FSR) W

PORTC W

ENDC

TIEMPO

Seccin de cdigo de Reset


; Incrementar el Puntero

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'

;Retorna con W cargado con 01H


;Retorna con W cargado con 02H
;Retorna con W cargado con 04H
;Retorna con W cargado con 08H
;Retorna con W cargado con 01H
;Retorna con W cargado con 02H
;Retorna con W cargado con 04H

; Resetear CONTADOR1
Subrutina de
TIEMPO

CONTADOR1 00000000 B

; Poner un dato en el Puerto B


; Cargar cuenta Inicial
PORTB 00001110 B
TMR1H #TIEMPOH
TMR1L #TIEMPOL
TIEMPO
; Configurar el TIMER1 Este proceso
se debe de realizar en la Seccin de
Configuracin

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

title " Interrupcin Externa "


; Un Programa Principal transfiere una Tabla de datos de memoria EPROM a RAM y Puerto B
; utilizando como subrutina de tiempo el TIMER 1 para la cadencia entre dato y dato.
; Cuando Pulsamos INT deja de ejecutar el Programa Principal y pasa a ejecutar la rutina
; de interrupcin. Esta enciende y apaga los led 10 veces con el doble de cadencia anterior.
;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 etiquetas a 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 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

;Direccin del Vector Reset


;Comienzo del Programa

61

;**************************** Vector de Interrupcin ************************************************************


ORG 04H
GOTO INTERRU
;**************************** Seccin de Configuracin ********************************************************
ORG 05h
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin

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

;*************************** Principal ****************************************************************************


RESETEO

CLRF CONTADOR
MOVLW TABLAD
MOVWF FSR

; Encender los Led del Puerto C hacia la Izquierda.

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

;***************************** Subrutina de Tabla *************************************************************


TABLA

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'

;Suma el Contador del Programa con el contenido


;de W y lo deja en el PC.
;Retorna con W cargado con 01H
;Retorna con W cargado con 02H
;Retorna con W cargado con 04H
;Retorna con W cargado con 08H
;Retorna con W cargado con 01H
;Retorna con W cargado con 02H
;Retorna con W cargado con 04H
;Retorna con W cargado con 08H

62

;***************************** Subrutina de Tiempo utilizando el TIMER1*********************************


TIEMPO

MOVLW TIEMPOH
MOVWF TMR1H
MOVLW TIEMPOL
MOVWF TMR1L
MOVLW B00110001
MOVWF T1CON

SEG1

BTFSS PIR1,TMR1IF
GOTO SEG1
BCF PIR1,TMR1IF
RETURN

;**************************** Rutina de Interrupcin ********************************************************


INTERRU

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

; Esperar un tiempo de adquisicin de 20 uS.

; Igualdades

Retardo_10micros
Retardo_10micros
; Registros
CBLOCK 0X20
ENDC

; Lanzamos el Conversor Analgico / Digital


GO_DONE 1

; Es un BIT que est en el


registro ADCON0

Seccin de cdigo de Reset


ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa

NO
GO_DONE = 0
?
SI
; Cargamos los 8 bits ms significativos que
estn en ADRESH en el Puerto B
PORTB ADRESH

; Cargamos los 2 bits menos significativos que


estn en ADRESL en el Puerto C
PORTC ADRESL

64

title " Conversin Analogico/Digital "


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

;**************************** Seccin Cdigo de Reset ****************************************************


ORG

00h

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Seccin de Configuracin ****************************************************


ORG 05h
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin)

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

;*************************** Principal *************************************************************************


SEG2

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

; Esperar un tiempo de adquisicin de 20 uS.


;Si GO_DONE es 0 la muestra esta digitalizada.
;En ADRESH se depositan los 8 BIT mas significativos.
;En ADRESL se depositan los 2 BIT menos significativos.

;*************************** Libreras ********************************************************************


INCLUDE <RETARDOS.INC>
END

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

; Cargar el registro TMR0 en el PORTB.


PORTB TMR0

Seccin de cdigo de Reset


ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa

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>

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


NDATOS

EQU D'15'

;**************************** Registro *************************************************************************


;**************************** Seccin Cdigo de Reset ******************************************************
ORG
00h
GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;**************************** Seccin de Configuracin *****************************************************


ORG 05h
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin)

BSF STATUS,RP0
CLRF TRISB

; Selecciono la pagina 1 de la memoria


; Configuro el Puerto B como salida

MOVLW B'00000110'
MOVWF ADCON1
MOVLW 0x10
MOVWF TRISA
MOVLW B'00111000'
MOVWF OPTION_REG

;Selecciono PORTA y PORTE como entrada digitales.

CLRF TRISE
BCF STATUS,RP0
CLRF PORTB
BSF PORTE,2

;Selecciono RA4 como entrada de datos.


; Configuro el TIMER0 como contador de pulsos
; y la cuenta se realiza por flanco de bajada en
; la patilla RA4/T0CKI y sin preescalar.
; Selecciono PORTE como salida de datos.
; Selecciono la pagina 0 de la memoria
; Limpio Puerto B.
; Habilito los Led del PORTE

;*************************** Principal ***************************************************************************


SEGUIR

MOVLW D00
MOVWF TMR0

; Cargar la cuenta inicial en el registro TMR0

SEGUIR1

MOVF TMR0,W
MOVWF PORTB
XORLW NDATOS
BTFSC STATUS,Z
GOTO FINAL
GOTO SEGUIR1

; Cargar el registro TMR0 en el PORTB.

FINAL

; Si TMR0 = NDATOS ir a 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 cdigo de Reset


ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa

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

; Cargar el dato TIEMPO1 en el registro TMR0

PCL PCL + W

TMR0 #TIEMPO1

NO
T0IF = 1 ?

RETLW B'00000010'
RETLW B'00000100'
RETLW B'00001000'
RETLW B'00000100'
RETLW B'00000010'

;Retorna con W cargado con 02H


;Retorna con W cargado con 04H
;Retorna con W cargado con 08H
;Retorna con W cargado con 04H
;Retorna con W cargado con 02H

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'

;*************************** Registros *************************************************************************

69

CBLOCK 0X20
CONTADOR
CONT_TI
ENDC
;**************************** Seccin Cdigo de Reset ******************************************************
ORG

00h

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Seccin de Configuracin *******************************************************


ORG 05h
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin

BSF STATUS,RP0
CLRF TRISB
MOVLW B'00000110'
MOVWF ADCON1
CLRF TRISE
MOVLW B'00000111'
MOVWF OPTION_REG

; Selecciono la pagina 1 de la memoria


; Configuro el Puerto B como salida
;Selecciono PORTA y PORTE como entrada digitales.

BCF STATUS,RP0
CLRF PORTB
BSF PORTE,2
CLRF CONTADOR
MOVLW TABLAD
MOVWF FSR

; Selecciono la pagina 0 de la memoria


; Apagar los LEDS del Puerto B.
; Habilitar los Led del PORTE.
; Limpiar CONTADOR.
; Cargar el Puntero con TABLAD.

; Selecciono PORTE como salida de datos.


; Configurar el TIMER0 como Temporizador
; y con preescalar de 256.

;*************************** Principal ************************************************************************


SEGUIR

SEG2

MOVF CONTADOR,W

;Cargar el CONTADOR en el Acumulador.

CALL TABLA

;Devuelve en el Acumulador un Dato.

MOVWF INDF
MOVWF PORTB

;Cargar el Acumulador donde apunta el puntero FSR.


;Cargar el Acumulador en el PORTB.

MOVLW TIEMPO2
MOVWF CONT_TI
CALL TIEMPO
DECFSZ CONT_TI,F
GOTO SEG2

;Cargar en el registro CONT_TI el dato TIEMPO2.

INCF FSR
INCF CONTADOR

;Incrementar el puntero FSR.


;Incrementar el CONTADOR.

MOVF CONTADOR,W
XORLW NDATOS
BTFSC STATUS,Z
GOTO $
GOTO SEGUIR

;Si CONTADOR <> NDATOS ir a SEGUIR.

;Llamar a la subrutina de TIEMPO.


;Se decrementa CONT_TI si CONT_TI<>0 ir a SEG2.

;Parar.

;***************************** Subrutina de Tabla ***************************************************************

70

TABLA

ADDWF PCL,F
RETLW 01H
RETLW 02H
RETLW 04H
RETLW 08H
RETLW 04H
RETLW 02H

;Suma el Contador del Programa con el contenido de W y lo deja en el PC.


;Retorna con W cargado con 01H
;Retorna con W cargado con 02H
;Retorna con W cargado con 04H
;Retorna con W cargado con 08H
;Retorna con W cargado con 04H
;Retorna con W cargado con 02H

;***************************** Subrutina de Tiempo **********************************************************


TIEMPO
SEG1

MOVLW TIEMPO1
MOVWF TMR0
BTFSS INTCON,T0IF
GOTO SEG1
BCF INTCON,T0IF
RETURN

;Cargar el dato TIEMPO1 en el registro TMR0


;Si el flag T0IF <> 1 ir a SEG1
;Borrar flag T0IF

END

5.5.- Ejemp_14.asm

( Entrenador Bsico 3 )

;Resetear el registro DIGITO

Diagrama de Flujo
DIGITO 00000000 B

Detectar el nmero mayor


;Cargar el
decontenido
una tabladel
de datos
registro DIGITO en W.

Seccin de cdigo de Reset

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

;Apagar Leds del PUERTO B


;Habilitar los Leds del Puerto B

;Decrementar el registro N_DATOS


; Registros
N_DATOS N_DATOS - 1
CBLOCK 0X20
DIGITO
MAYOR
N_DATOS
=0?
REGISTRO
ENDC

2
NO
Subrutina de TABLA

SI
PCL PCL + W

;Sacar el nmero mayor a el Puerto B


1
PORTB MAYOR

FIN

RETLW 3FH
RETLW 06H
RETLW 5BH
RETLW 4FH
RETLW 06H

;Retorna con W cargado con 3FH


;Retorna con W cargado con 06H
;Retorna con W cargado con 5BH
;Retorna con W cargado con 4FH
;Retorna con W cargado con 66H

71

Subrutina de detectar el
nmero mayor de una tabla
DE_MAYOR

REGISTRO >

SI

NO
MAYOR REGISTRO

RETURN

title " Detectar el numero mayor de una Tabla "


72

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


N_DATOS

EQU D'5'

; Asignamos el Numero de Datos.

;**************************** Registros ************************************************************************


CBLOCK 0X20
DIGITO
MAYOR
REGISTRO

; Creamos un registro llamado DIGITO en la direccin 20h


; de memoria de datos.
; Creamos un registro llamado MAYOR en la direccin 21h
; de memoria de datos.
; Creamos un registro llamado REGISTRO1 en la direccin 22h
; de memoria de datos.

ENDC
;**************************** Seccin Cdigo de Reset *******************************************************
ORG

00h

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Seccin de Configuracin *******************************************************


ORG 05h
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin)

BSF STATUS,RP0
CLRF TRISB
MOVLW B00000110
MOVWF ADCON1
CLRF TRISE
BCF STATUS,RP0
CLRF PORTB
BSF PORTE,2

; Selecciono la pagina 1 de la memoria


; Configuro el Puerto B como salida
; Selecciono PORTA y PORTE como entrada digitales
; Selecciono la pagina 0 de la memoria
; Limpiar Puerto B.

;*************************** Principal ****************************************************************************


RESET

CLRF DIGITO ;Comienzo contador con el numero digito = 0.

SEGUIR

MOVF DIGITO,W

;Cargo el contenido de DIGITO en W.

73

CALL TABLA
CALL DE_MAYOR

;Llamo a la subrutina de cargar datos de la TABLA.


;Detecta el nmero mayor.

INCF DIGITO,F
MOVF DIGITO,W
XORLW N_DATOS
BTFSS STATUS,Z

;Incremento el contenido del registro


;Cargamos el contenido del Registro DIGITO a W
;Hacemos una XOR para afectar el flag Z
;Preguntamos si Z es igual a 1, si cumple salta la siguiente
instruccin.
;Va a SEGUIR

GOTO SEGUIR

PARAR

MOVF MAYOR,W
MOVWF PORTB
GOTO PARAR

;Saca el valor Mayor Puerto B.

;***************************** TABLA ****************************************************************************


TABLA

ADDWF PCL,F
RETLW 3FH
RETLW 06H
RETLW 5BH
RETLW 4FH
RETLW 06H

;Suma el Contador del Programa con el


contenido de W y lo deja en el PC.
;Retorna con W cargado con 3FH
;Retorna con W cargado con 06H
;Retorna con W cargado con 5BH
;Retorna con W cargado con 4FH
;Retorna con W cargado con 66H

;***************************** Detectar Mayor ********************************************************************


DE_MAYOR

RETORNO

MOVWF REGISTRO
SUBWF MAYOR,W

; W F-W

( Si F >= W el BIT de carry C=0


y si F < W el BIT de carry C=1 )

BTFSC STATUS,C
GOTO RETORNO
MOVF REGISTRO,W
MOVWF MAYOR
RETURN
END

74

6.- Entrenador Bsico 4

75

6.1.- T_S_A.asm

( Entrenador Bsico 4 )

Diagrama de Flujo
Transmisin Serie
Asncrona

Elegimos PIC
List p=16f876 , f=inhx32

; Lanzar 5 veces la transmisin serie


CONTADOR NUMERO_TRANSMISIONES

Asignacin de nombres de
RFS a direcciones.

; Leer los datos del PORTB

#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 ?

Seccin de cdigo de Reset

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

;Activamos la Puerta Serie (TX)

NO

SI

NO

Si el PORTB no
cambia
no se transmite
PORTB =
DATO_ANTERIOR ?

SI

76

title " Transmisor SERIE asncrona "


;************ Leer el Puerto B y transmitirlo va SERIE ***********************************************
;Programa para PIC 16F876.
;Velocidad del Reloj:1 MHz.
;Reloj instruccin: 250KHz = 4uS.
;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 ***************************************************************
NUMERO_TRANSMISIONES

EQU D'05'

;***************************** Registros *****************************************************************


CBLOCK 0X20
CONTADOR
DATO_ANTERIOR
ENDC
;**************************** Seccin Cdigo de Reset ***********************************************
ORG

0X00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Seccin de Configuracin ***********************************************


ORG 0X05
COMIENZO

; Inicio de Programa
;(Una posicin detrs del vector de Interrupcin)

BSF STATUS,RP0 ;Banco 1


MOVLW B'11111111' ; Poner el Puerto B como entrada de Datos
MOVWF TRISB
MOVLW 0X0A
MOVWF SPBRG

; Cargar la Velocidad de Transmisin de Datos.

MOVLW B'00100000'

77

MOVWF TXSTA

; Configuracin de la Transmisin Serie.

BCF STATUS,RP0
BSF RCSTA,SPEN

;Activamos la Puerta Serie (TX).

;*************************** Principal *********************************************************************


SEG0

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

; Leer los datos del PORTB

DECFSZ CONTADOR,F
GOTO SEG1

; Decrementamos CONTADOR y si es 0 salta una


; instruccin.

SEG2

SEG3

; Lanzar 5 veces la transmisin serie.

; Comienzo de la transmisin de datos en Serie.


; Preguntamos si se ha transmitido el dato.

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

Recepcin Serie Asncrona


( 8 BIT )
Seccin de Configuracin
COMIENZO
Elegimos PIC
List p=16f876 , f=inhx32

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.

INTCON 11000000 B ; Habilitar la Interrupcin serie


PIE1 00100000 B
; Habilitar la Interrupcin serie
RP0 0

; Registros

; Ir al Banco 0

RCSTA 10010000 B

; Configurar y lanzar la recepcin


serie (Habilitar puerto serie, 8 BIT y
recepcin continua).

CBLOCK 0X20
DATO
W_TEMP
STATUS_TEMP
ENDC

; Cargar el registro DATO en el PORTB


PORTB DATO

Seccin de cdigo de Reset


ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa

Vector de Interrupcin

Rutina de Interrupcin
INTERRU

ORG 04H
GOTO INTERRU

NO
RCIF = 1?

1
RETFIE

SI
; Salvar Registros

; Borrar Flag de la recepcin

RETFI
E

W_TEMP W
STATUS_TEMP STATUS

RCIF 0

; Recuperar Registros
STATUS STATUS_TEMP
W W_TEMP

; Cargar el dato recibido en


el registro RCREG en el
registro DATO
DATO RCREG

79

title " Receptor SERIE asncrona "


;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 *******************************************************************
;***************************** Registros ********************************************************************
CBLOCK 0X20
DATO
W_TEMP
STATUS_TEMP

;Registro de salvaguarda de la Rutina de Interr.

ENDC
;**************************** Seccin Cdigo de Reset ***************************************************
ORG

0X00

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;**************************** Vector de Interrupcin *******************************************************


ORG 0X04
GOTO INTERRU

;Vector de Interrupcin.

;**************************** Seccin de Configuracin ***************************************************

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

; Cargar la Velocidad de Recepcin de Datos.

;Trabajar con velocidad baja de recepcin.

; Habilitamos la recepcin asncrona.

80

MOVLW B'11000000'
MOVWF INTCON
MOVLW B'00100000'
MOVWF PIE1
BCF STATUS,RP0
MOVLW B'10010000'
MOVWF RCSTA

;Habilitar Interrupcin Serie


;Habilitar Interrupcin Serie

;Configurar y lanzar la Recepcin Serie

;*************************** Principal ***********************************************************************


PRINCIPAL

COMF DATO,W
MOVWF PORTB
GOTO PRINCIPAL

;**************************** Rutina de Interrupcin ******************************************************


ORG 40
INTERRU

BTFSS PIR1,RCIF
RETFIE

; Detectamos si ha interrumpido la Recepcin Serie.

SALVAR

MOVWF W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP

; Salvamos Registros

MOVF RCREG,W
MOVWF DATO

;Cargamos el dato del registro RCREG en el registro DATO.

RECUPERAR SWAPF STATUS_TEMP,W


MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W

;Recuperamos Registros.

BCF PIR1,RCIF

;Borrar flag de recepcin

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>

; Guardar el PORTB en un registro


DATO_ANTERIOR PORTB

; 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 cdigo de Reset


ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa

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

title " Transmisor SERIE asncrona utilizando Librera de


Transmisin T_S_RF.INC "
;************ Leer el Puerto B y transmitirlo va SERIE ***************************************************
;Programa para PIC 16F876.
;Velocidad del Reloj:1 MHz.
;Reloj instruccin: 250KHz = 4uS.
;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 ********************************************************************
;***************************** Registros **********************************************************************
CBLOCK 0X20
DATO_ANTERIOR
ENDC
;**************************** Seccin Cdigo de Reset *****************************************************
ORG

0X00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Seccin de Configuracin ******************************************************


ORG 0X05

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

;*************************** Libreras **************************************************************************


INCLUDE <T_S_RF.INC>
END

6.4.- RE1_S_RF.asm

( Entrenador Bsico 4 )

Diagrama de Flujo

Recepcin Serie Asncrona


Utilizando la Librera de
Recepcin R_S_RF.INC

Seccin de Configuracin
COMIENZO

Elegimos PIC
List p=16f876 , f=inhx32

ORG 0X05H

RP0 1

; Ir al Banco 1

TRISB 00000000 B
de dato

; Poner Puerto B como salida

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

Seccin de cdigo de Reset


ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa

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

El Dato se queda cargado en el


registro DATO_SERIE_VALIDO
RECEPCION_DATO_SERIE

84

title " Receptor SERIE asncrona utilizando Librera de


Recepcin R_S_RF.INC "
;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 ********************************************************************

;***************************** Registros *********************************************************************


CBLOCK 0X20
W_TEMP
STATUS_TEMP

; Registro de salvaguarda de la Rutina de Interr.

ENDC
;**************************** Seccin Cdigo de Reset ****************************************************
ORG

0X00

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;**************************** Vector de Interrupcin *******************************************************


ORG 0X04
GOTO INTERRUPCION

;Vector de Interrupcin.

;**************************** Seccin de Configuracin ***************************************************

COMIENZO

ORG 0X05

;Inicio de Programa
;(Una posicin detrs del vector de Interrupcin).

BSF STATUS,RP0
CLRF TRISB
BCF STATUS,RP0

;Configuramos el PORTB como salida de datos.

CALL CONFIGURACION_RECEP_SERIE

85

;*************************** Principal ************************************************************************


PRINCIPAL

COMF DATO_SERIE_VALIDO,W
MOVWF PORTB
GOTO PRINCIPAL

;**************************** Rutina de Interrupcin *******************************************************


INTERRUPCION
SALVAR

BTFSS PIR1,RCIF
RETFIE

MOVWF W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP

; Detectamos si ha interrumpido la Recepcin Serie.


; Salvamos Registros

CALL RECEPCION_DATO_SERIE ; El Dato se queda cargado en DATO_SERIE_VALIDO


RECUPERAR SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE

;Recuperamos Registros.

;Retorno de Interrupcin.

;***************************** Librerias **********************************************************************


INCLUDE <R_S_RF.INC>
END

86

6.5.- T_S_RF.INC

( Entrenador Bsico 4 )

Diagrama de Flujo

Librera de Transmisin de datos


(Carga en el W el dato a transmitir)
(Tiene una llave de entrada asociada)
T_S_RF.INC

; 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

; Cargar la Velocidad de Transmisin de Datos

Baud Rate = Fosc/(64(X+1))


Baud Rate = 1MHz/(64(10+1)) = 1420 BIT por segundo
TXSTA 00100000 B
RP0 0
SPEN 1

; Configuracin de la transmisin
serie de datos (Modo Asncrono y baja
velocidad.
; Ir al Banco 0

;Activamos la Puerta Serie (TX)

RETUR
N

87

LANZAR_DATO_SERIE

DATO _ TRANSMITIDO W

; Cargar el nmero de transmisin


CONTADOR_TRANSMISIN D10

; 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

; Librera Transmisor SERIE va Radiofrecuencia para una Tarjeta


; Emisora SAW para Datos 433,92 MHz. ( CEBEK C-0503 )
; Llave fija
; Cargar en W el dato a transmitir
;***************************** Igualdades *********************************************************************
TODOCERO

EQU B'00000000'

LLAVE_ENTRADA

;(Dato). Llave para iniciar un cdigo, la tarjeta de


; transmisin de datos necesita el pulso de STOP para
; transmitir un cdigo.

EQU B'01011010' ;(Dato). Llave Comn.

;***************************** Registros ***********************************************************************


CBLOCK
DATO_TRANSMITIDO
CONTADOR_TRANSMISION
ENDC
;**************************** Seccin de Configuracin *****************************************************
CONFIGURACION_TRANS_SERIE

BCF STATUS,RP1 ; Ir al Banco 1.


BSF STATUS,RP0
MOVLW 0X0A
MOVWF SPBRG
MOVLW B'00100000'
MOVWF TXSTA

; Cargar la Velocidad de Transmisin de


Datos.
; Configuracin de la Transmisin Serie.

BCF STATUS,RP0
BCF STATUS,RP1

; Ir al Banco 0.

BSF RCSTA,SPEN

;Activamos la Puerta Serie (TX).

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

;Lanzar llave LLAVE_ENTRADA.


;Transmisin de Datos en Serie.

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

6.6.- R_S _RF.INC

( 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

;Trabajar con velocidad baja de


recepcin.
; Cargar la velocidad de
Transmisin de datos

SPBRG D10

Baud Rate = Fosc/(64(X+1))


Baud Rate = 1MHz/(64(10+1)) =
1420 BIT por segundo
SYNC 0

; Habilitamos la recepcin
asncrona.

INTCON 11000000 B
PIE1 00100000 B

; Habilitar la Interrupcin serie


; Habilitar la Interrupcin serie

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

;Borramos flag de Recepcin


RCIF 0

NO

Ha llegado
un
nuevo dato ?
RCIF = 1 ?

;Validamos los datos recibidos


SI

DATO_SERIE_VALIDO DATO_SERIE1

; Guardamos el dato primero


SI

Son iguales los


datos recibidos ?
DATO_SERIE1
=
DATO_SERIE2 ?

DATO_SERIE1 RCREG

; Borramos flag de Recepcin


NO
RCIF 0

NO

Ha llegado la llave de
entrada ?
RCREG =

; Guardamos el dato segundo

SI
; Borramos flag de Recepcin

DATO_SERIE2 RCREG

RCIF 0

NO

Ha llegado
un
nuevo dato ?
RCIF = 1 ?

SI

91

; Librera Receptor SERIE va Radiofrecuencia para una Tarjeta Emisora


; SAW para Datos 433,92 MHz. ( CEBEK C-0504 )
; Llave de entrada fija.
; Los datos se validan si llegan dos datos idnticos consecutivos.
; El dato recibido se carga en el registro DATO_SERIE_VALIDO
; Esta configurada la Interrupcin en Recepcin Serie. Es necesario cargar el Vector de interrupcin
;
;

ORG 0X04
GOTO INTERRUPCION

; La Subrutina de Recepcin Serie devuelve el dato valido en el Registro DATO_SERIE_VALIDO


;**************************** Igualdades *************************************************************************
LLAVE_ENTRADA

EQU B'01011010' ;(Dato). Llave Comn.

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

;Trabajar con velocidad baja de recepcin.


; Cargar la Velocidad de Recepcin
de Datos.

MOVWF SPBRG
BCF TXSTA,SYNC
MOVLW B'11000000'
MOVWF INTCON

;Habilitar Interrupcin Serie

MOVLW B'00100000'
MOVWF PIE1

;Habilitar Interrupcin Serie

BCF STATUS,RP0
BCF STATUS,RP1

; Banco 0

MOVLW B'10010000'
MOVWF RCSTA

;Configurar y lanzar la Recepcin Serie

RETURN

92

;****************************** Subrutina de Recepcin Serie *********************************************


;Tiene que estar dentro de la Rutina de INTERRUPCION
RECEPCION_DATO_SERIE

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

;Preguntamos si ha llegado la Llave


"LLAVE_ENTRADA".
;Si es correcta la Llave volvemos a
preguntar.
;No es correcta la Llave volvemos al PP
previa recuperacin de registros.
;Borramos Flag de la Recepcin.
;Preguntamos si hemos recibido una nuevo
DATO.
;Guardamos el Dato Primero
;Borramos Flag de la Recepcin.
;Preguntamos si ha llegado la Llave
"LLAVE_ENTRADA".

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

;Borramos Flag de la Recepcin.


;Preguntamos si hemos recibido una nuevo
DATO.
;Guardamos el Dato Segundo
;Si ambos datos son Iguales validamos el
dato serie recibido.

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

Librera de Transmisin de datos


(Carga en el W el dato a transmitir)
(Cargar la llave de entrada en el
registro LLAVE_ENTRADA)

; 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

; Cargar la Velocidad de Transmisin de Datos

Baud Rate = Fosc/(64(X+1))


Baud Rate = 1MHz/(64(39+1)) = 1562,5 BIT por segundo
TXSTA 00100000 B
RP0 0
SPEN 1

; Configuracin de la transmisin
serie de datos (Modo Asncrono y baja
velocidad.
; Ir al Banco 0

;Activamos la Puerta Serie (TX)

RETUR
N

94

LANZAR_DATO_SERIE

DATO _ TRANSMITIDO W

; Cargar el nmero de transmisin


CONTADOR_TRANSMISIN D10

; 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

; Librera de Transmisor SERIE va Radiofrecuencia para una Tarjeta


; Emisora SAW para Datos 433,92 MHz. ( CEBEK C-0503 )
; Cargar la llave de entrada en el registro LLAVE_ENTRADA
; Cargar en W el dato a transmitir
;***************************** Igualdades ****************************************************************
TODOCERO

EQU B'00000000'

;(Dato). Llave para iniciar un cdigo, la tarjeta de


; transmisin de datos necesita el pulso de STOP para
; transmitir un cdigo.

;***************************** Registros *******************************************************************


CBLOCK
DATO_TRANSMITIDO
CONTADOR_TRANSMISION
LLAVE_ENTRADA
ENDC
;**************************** Seccin de Configuracin *************************************************
CONFIGURACION_TRANS_SERIE

BCF STATUS,RP1
BSF STATUS,RP0
MOVLW D'39'
MOVWF SPBRG

MOVLW B'00100000'
MOVWF TXSTA

; Ir al Banco 1.

; Cargar la Velocidad de Transmisin de


Datos.
; BR = (Fosc/64(X+1))
BR = (4MHz/64(39+1)) = 1562,5 Hz
; Configuracin de la Transmisin Serie.

BCF STATUS,RP0
BCF STATUS,RP1

; Ir al Banco 0.

BSF RCSTA,SPEN

;Activamos la Puerta Serie (TX).

RETURN

;*************************** Lanzar Llaves y Muestra Digital ******************************************


LANZAR_DATO_SERIE

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

;Trabajar con velocidad baja de


recepcin.
; Cargar la velocidad de
Transmisin de datos

SPBRG D39

Baud Rate = Fosc/(64(X+1))


Baud Rate = 1MHz/(64(39+1)) = 1562,5 BIT por segundo
SYNC 0

; Habilitamos la recepcin
asncrona.

INTCON 11000000 B
PIE1 00100000 B

; Habilitar la Interrupcin serie


; Habilitar la Interrupcin serie

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

; Borramos flag de Recepcin

RETURN

;Borramos flag de Recepcin


RCIF 0

NO

Ha llegado
un
nuevo dato ?
RCIF = 1 ?

;Validamos los datos recibidos


SI

DATO_SERIE_VALIDO DATO_SERIE1

; Guardamos el dato primero


SI

Son iguales los


datos recibidos ?
DATO_SERIE1
=
DATO_SERIE2 ?

DATO_SERIE1 RCREG

; Borramos flag de Recepcin


NO
RCIF 0

NO

Ha llegado la llave de
entrada ?
RCREG =

; Guardamos el dato segundo

SI
; Borramos flag de Recepcin

DATO_SERIE2 RCREG

RCIF 0

NO

Ha llegado
un
nuevo dato ?
RCIF = 1 ?

SI

99

; Librera Receptor SERIE va Radiofrecuencia para una Tarjeta Emisora


; SAW para Datos 433,92 MHz. ( CEBEK C-0504 )
; La Llave de entrada aleatoria.
; Los datos se validan si llegan dos datos idnticos consecutivos.
; El dato recibido se carga en el registro DATO_SERIE_VALIDO
; ;Si se reciben dos datos consecutivos se valida el dato.
; Esta configurada la Interrupcin en Recepcin Serie. Es necesario cargar el Vector de interrupcin
;
;

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

;Habilitar Interrupcin Serie

MOVLW B'00100000'
MOVWF PIE1

;Habilitar Interrupcin Serie

BCF STATUS,RP0
BCF STATUS,RP1

; Banco 0

MOVLW B'10010000'
MOVWF RCSTA

;Configurar y lanzar la Recepcin Serie

RETURN

100

;****************************** Subrutina de Recepcin Serie ********************************************************


;Tiene que estar dentro de la Rutina de INTERRUPCION
RECEPCION_DATO_SERIE

BCF PIR1,RCIF

;Borramos Flag de la Recepcin.

NO_DATO_SERIE1

BTFSS PIR1,RCIF

;Preguntamos si hemos recibido una nuevo


DATO.

GOTO NO_DATO_SERIE1
MOVF RCREG,W
MOVWF DATO_SERIE1
NO_LLAVE_ENTRADA

BCF PIR1,RCIF
BTFSS PIR1,RCIF

;Guardamos el Dato Primero


;Borramos Flag de la Recepcin.
;Preguntamos si ha llegado la Llave
"LLAVE_ENTRADA".

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

;Borramos Flag de la Recepcin.


;Preguntamos si hemos recibido una nuevo
DATO.
;Guardamos el Dato Segundo
;Si ambos datos son Iguales validamos el
dato serie recibido.

SUBWF DATO_SERIE2,F
BTFSS STATUS,Z
GOTO SALIR_SERIE
VALIDAR_DATO_SERIE

SALIR_SERIE

MOVF DATO_SERIE1,W
MOVWF DATO_SERIE_VALIDO

; El Dato se queda cargado en el


Registro DATO_SERIE_VALIDO

BCF PIR1,RCIF
RETURN

101

7.- Entrenador Bsico 5

102

7.1.- Tecla0.asm

( Entrenador Bsico 5 )

Diagrama de Flujo

1
Manejo del Teclado
utilizando la tcnica
de polling

; Obtiene el valor hexadecimal de la tecla pulsada.


Teclado_LeeHex

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

Seccin de cdigo de Reset

COMIENZO

PORTC W

; Obtiene el valor hexadecimal de la tecla pulsada.

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

; Configura las lneas del teclado.


Teclado_Inicializa

103

title " Manejo del Teclado utilizando la tcnica de polling "


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

;Direccin del Vector Reset


;Comienzo del Programa

;*************************************** Seccin de Configuracin *****************************************************

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.

;************************************* Principal **************************************************************************


;SEG1
SEG1

CALL Teclado_LeeOrdenTecla
CALL Teclado_LeeHex
BTFSS STATUS,C
GOTO SEG1
MOVWF PORTC
CALL Teclado_EsperaDejePulsar
GOTO SEG1

; Obtiene el orden de la tecla pulsada.


; Obtiene el valor hexadecimal de la tecla pulsada.
; Preguntamos si se ha pulsado una tecla.
; Llevar el dato a el Puerto C.
; Para que no se repita el mismo carcter

;*********************************************** Libreras ****************************************************************


INCLUDE <TECLADO.INC>
INCLUDE <RETARDOS.INC>
END

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

; Obtiene el valor hexadecimal de la tecla pulsada.


Teclado_LeeHex

Asignacin de nombres de
RFS a direcciones.
#include <p16f877.inc>
; Llevar el dato a el Puerto C.
PORTC W

; Igualdades

; Registros

; Obtiene el valor hexadecimal de la tecla pulsada.

CBLOCK 0x20
ENDC

Teclado_LeeHex

; Limpia flag de la Interrupcin.


Seccin de cdigo de Reset

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

; Configura las lneas del teclado.


Teclado_Inicializa
INTCON 10001000 B ; Habilita la interrupcin RBI y la general.

; Espera en modo bajo consumo que pulse teclado.


SLEEP

105

title " Manejo del Teclado utilizando la tcnica de interrupcin del


programa principal "
;***************************************************** Tecl_01.asm *****************************************************
;
; Los LEDS visualizan 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.
;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> ;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

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;*************************************** Vector de Interrupcin *********************************************************


ORG 4
GOTO INTERRUP
;*********************************** Seccin de Configuracin *********************************************************
ORG 5
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

;************************************* Principal **************************************************************************


PRINCIPAL

SLEEP
GOTO PRINCIPAL

; Espera en modo bajo consumo que pulse teclado.

;************************************ Rutina de Interrupcin ************************************************************


INTERRUP

CALL Teclado_LeeHex
MOVWF PORTC
CALL Teclado_EsperaDejePulsar
BCF
INTCON,RBIF
RETFIE

; Obtiene el valor hexadecimal de la tecla pulsada.


; Llevar el Acumulador al Puerto C.
; Para que no se repita el mismo carcter
; mientras permanece pulsado.
; Limpia flag de la Interrupcin.

;*********************************************** Libreras ****************************************************************


INCLUDE <TECLADO.INC> ; Subrutinas de control del teclado.
INCLUDE <RETARDOS.INC>
END

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

; Obtiene el valor hexadecimal de la tecla pulsada.


Teclado_LeeHex

Asignacin de nombres de
RFS a direcciones.
#include <p16f877.inc>
; Llevar el dato a el Puerto C.
PORTC W

; Igualdades

; Transformar el cdigo Hexadecimal


en cdigo de 7 segmentos.

; Registros
CBLOCK 0x20
ENDC

HEX_7SEG

; Llevar el dato a el Puerto D.

Seccin de cdigo de Reset

PORTD W

ORG OOH
; Direccin del vector de Reset
GOTO COMIENZO ;Comienzo del Programa

; Obtiene el valor hexadecimal de la tecla pulsada.


ORG O4H
; Direccin del vector de Interrupcin
GOTO INTERRUP

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

; Limpia flag de la Interrupcin.


RBIF 0

RETFIE

; Configura las lneas del teclado.


Teclado_Inicializa
INTCON 10001000 B ; Habilita la interrupcin RBI y la general.

; Espera en modo bajo consumo que pulse teclado.


SLEEP

108

title " Manejo del Teclado utilizando la tcnica de interrupcin del


programa principal y llevando los datos al display de 7 segmentos"
;************************************** Tecl_02.asm ********************************************************************
;
; El display y los LEDS 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.
;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>

;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

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;*************************************** Vector de Interrupcin *********************************************************


ORG

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.

;************************************* Principal **************************************************************************


PRINCIPAL

SLEEP
GOTO PRINCIPAL

; Espera en modo bajo consumo.

;************************************ Rutina de Interrupcin ************************************************************


INTERRUP

CALL Teclado_LeeHex
MOVWF PORTC
CALL HEX_7SEG
MOVWF PORTD
CALL Teclado_EsperaDejePulsar
BCF INTCON,RBIF
RETFIE

; Obtiene el valor hexadecimal de la tecla pulsada.


; Llevar el Acumulador al Puerto C.
; Transformar el cdigo Hexadecimal en cdigo
de 7 segmentos.
; Llevar el cdigo al PORTD.
; Para que no se repita el mismo carcter
; mientras permanece pulsado.
; Limpia flag.

;*********************************************** Libreras ****************************************************************


INCLUDE <HEX_7SEG.INC> ; Librera de conversin de Hexadecimal a 7 Segmentos.
INCLUDE <TECLADO.INC>
; Librera de control del teclado.
INCLUDE <RETARDOS.INC> ; Librera de Retardos.
END

7.4.- HEX_7SEG.INC

( Entrenador Bsico 5 )

Diagrama de Flujo
Librera
HEX_7SEG.INC

HEX_7SEG

RETLW 3Fh
RETLW

PCL PCL + W

; El cdigo 7 segmentos para el "0".


06h
; El cdigo 7 segmentos

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

; El cdigo 7 segmentos para el "0".


; El cdigo 7 segmentos para el "1".
; El cdigo 7 segmentos para el "2".
; El cdigo 7 segmentos para el "3".
; El cdigo 7 segmentos para el "4".
; El cdigo 7 segmentos para el "5".
; El cdigo 7 segmentos para el "6".
; El cdigo 7 segmentos para el "7".
; El cdigo 7 segmentos para el "8".
; El cdigo 7 segmentos para el "9".
; El cdigo 7 segmentos para el "A".
; El cdigo 7 segmentos para el "B".
; El cdigo 7 segmentos para el "C".
; El cdigo 7 segmentos para el "D".
; El cdigo 7 segmentos para el "E".
; El cdigo 7 segmentos para el "F".

( Entrenador Bsico 5 )

;****************************************** Librera "TECLADO.INC" ***************************************************


;
;
===================================================================
;
Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;
E. Palacios, F. Remiro y L. Lpez.
;
Editorial Ra-Ma. www.ra-ma.es
;
===================================================================
;
; Librera de subrutinas para la gestin de un teclado organizado en una matriz de 4 x 4 y
; conectado al Puerto B segn la disposicin siguiente y explicada en la figura 19-2 del libro:
;
;
RB4 RB5 RB6 RB7
;
^ ^ ^ ^
;
|------|------|------|------|
;
RB0 -->| 0 | 1 | 2 | 3 |
;
|------|------|------|------|
;
RB1 -->| 4 | 5 | 6 | 7 |
;
|------|------|------|------|
;
RB2 -->| 8 | 9 | 10 | 11 |
;
|------|------|------|------|
;
RB3 -->| 12 | 13 | 14 | 15 |
;
|------|------|------|------|
;
; Los nmeros que se han dibujado dentro de cada cuadrado son el orden de las teclas

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

; Orden de la tecla a chequear.

ENDC
Tecl_UltimaTecla

EQU

d'15'

; Valor de orden de la ltima tecla utilizada.

;*****************************Subrutina "Teclado_LeeHex" ************************************************************


;
; Cada tecla tiene asignado un nmero de orden que es contabilizado en la variable
; Tecl_TeclaOrden. Para convertir a su valor segn el tipo de teclado en concreto se
; utiliza una tabla de conversin.
; A continuacin se expone la relacin entre el nmero de orden de la tecla y los
; valores correspondientes para el teclado hexadecimal ms utilizado.
;
;
ORDEN DE TECLA:
TECLADO HEX. UTILIZADO:
;
0 1 2 3
1 2 3 F
;
4 5 6 7
4 5 6 E
;
8 9 10 11
7 8 9 D
;
12 13 14 15
A 0 B C
;
; As, en este ejemplo, la tecla "7" ocupa el orden 8, la tecla "F" ocupa el orden 3 y la
; tecla "9" el orden 10.
; Si cambia el teclado tambin hay cambiar de tabla de conversin.
;
; Entrada:
En (W) el orden de la tecla pulsada.
; Salida:
En (W) el valor hexadecimal para este teclado concreto.

Teclado_LeeHex

Tecl_FinLeeHex

call
btfss
goto
call

Teclado_LeeOrdenTecla
STATUS,C
Tecl_FinLeeHex
Tecl_ConvierteOrdenEnHex

bsf
STATUS,C
return

;
Tecl_ConvierteOrdenEnHex

; Lee el Orden de la tecla pulsada.


; Pulsa alguna tecla?, C=1?
; No, por tanto sale.
; Lo convierte en su valor real mediante
tabla.
; Vuelve a posicionar el Carry, porque la
; instruccin "addwf PCL,F" lo pone a "0".

addwf PCL,F

; Segn el teclado utilizado resulta:

DT
DT
DT
DT

; Primera fila del teclado.


; Segunda fila del teclado
; Tercera fila del teclado.
; Cuarta fila del teclado.

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

; Todava no ha empezado a chequear el teclado.


; Va a chequear primera fila.
; (Ver esquema de conexin).
; Activa la fila correspondiente.

Tecl_Columna1
btfss
goto

PORTB,4
Tecl_GuardaValor

; Chequea la 1 columna buscando un cero.


; S, es cero y por tanto guarda su valor y sale.

113

incf

Tecl_TeclaOrden,F

Tecl_Columna2
btfss
goto
incf

; Va a chequear la siguiente tecla.


; Repite proceso para las siguientes

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

; Posiciona C=0, indicando que no ha pulsado


; tecla alguna y sale.

Tecl_GuardaValor
movf
bsf

Tecl_TeclaOrden,W
STATUS,C

; El orden de la tecla pulsada en (W) y sale.


; Como hay tecla tecla pulsada, pone C=1.

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

8.- Entrenador Bsico 6

115

8.1.- LCD_01.asm

( Entrenador Bsico 6 )

title " Visualizacin de un mensaje en el LCD carcter a carcter"


;************************************** LCD_01.asm ********************************************************************
; El modulo LCD visualiza el mensaje "Hola".
; *************************************************************************************************************************
;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>

;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

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;*********************************** Seccin de Configuracin *********************************************************


ORG 5
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.

;************************************* Principal **************************************************************************


PRINCIPAL

movlw
call
movlw
call
movlw

'H'
LCD_Caracter
'o'
LCD_Caracter
'l'

; Escribimos el carcter en el donde apunta


; el Cursor del LCD e incrementa el cursor.

116

call
LCD_Caracter
movlw 'a'
call
LCD_Caracter
sleep

; Entra en modo de bajo consumo.

;*********************************************** Libreras ****************************************************************


INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>

; Subrutinas de control del mdulo LCD.


; Subrutinas de retardo.

END

; Fin del programa.

8.2.- LCD_02.asm

( Entrenador Bsico 6 )

title " Visualizacin de un mensaje en el LCD carcter a carcter "


title " con retardo de 500 ms, borrar pantalla y comenzar de nuevo "
;************************************** LCD_02.asm *******************************************************************
; El modulo LCD visualiza el mensaje "Hola". La escritura de cada letra se realiza cada
; 500 mS. Despus se borra y comienza de nuevo.
; *************************************************************************************************************************
;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>

;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

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

117

;*********************************** Seccin de Configuracin *********************************************************


ORG 5
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.

;************************************* Principal **************************************************************************


Principal

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

; Escribimos el carcter en el donde apunta


; el Cursor del LCD e incrementa el cursor.

; Borra la pantalla y sita el cursor en el principio.

;*********************************************** Libreras ****************************************************************


INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
END

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

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

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


Numero_NoCeroAlto
Numero_CeroAlto

EQU

0x1D
EQU

; Numero ejemplo nibble alto no cero.


0x0D ; Numero ejemplo nibble alto cero.

;************************************** Registros ************************************************************************


CBLOCK 0x20
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;*********************************** Seccin de Configuracin *********************************************************


ORG
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.

;************************************* Principal **************************************************************************


Principal

movlw Numero_NoCeroAlto
call
LCD_ByteCompleto

;Visualizamos en el LCD Byte completo.

call

;Escribimos en el LCD dos espacios en blanco.

LCD_DosEspaciosBlancos

movlw Numero_NoCeroAlto
call
LCD_Byte

;Visualizamos en el LCD Byte completo


si el nible alto no es cero.

call

;Escribimos en el LCD dos espacios en blanco.

LCD_DosEspaciosBlancos

119

movlw Numero_NoCeroAlto
call
LCD_Nibble

;Visualizamos en el LCD nible bajo.

call

LCD_Linea2

;Se sita el cursor en la segunda lnea.

movlw Numero_CeroAlto
call
LCD_ByteCompleto

;Visualizamos en el LCD Byte completo.

call

;Escribimos en el LCD dos espacios en blanco.

LCD_DosEspaciosBlancos

movlw Numero_CeroAlto
call
LCD_Byte

;Visualizamos en el LCD nible bajo


ya que el nible alto es cero.

call

;Escribimos en el LCD dos espacios en blanco.

LCD_DosEspaciosBlancos

movlw Numero_CeroAlto
call
LCD_Nibble

;Visualizamos en el LCD nible bajo.

sleep

; Entra en modo de bajo consumo.

;*********************************************** Libreras ****************************************************************


INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
END

8.4.- LCD_04.asm

( Entrenador Bsico 6 )

title " Visualizacin en el LCD un contador descendente "


;************************************** LCD_04.asm ********************************************************************
; El modulo LCD visualiza un contador descendente que cuenta desde 59 hasta 0 y vuelve a
; repetir la cuenta ininterrumpidamente. En cada valor estar unos 500 ms en 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>

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

120

NumeroCarga EQU

D'59'

; Cuenta inicial.

;************************************** Registros ************************************************************************


CBLOCK 0x20
Contador
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;*********************************** Seccin de Configuracin *********************************************************


ORG
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.

;************************************* Principal **************************************************************************


Principal

movlw NumeroCarga
movwf Contador

; Realiza carga inicial.

Visualiza

call
decfsz
goto
call
call
call
goto

; Visualiza el valor del Contador.


; Decrementa el contador hasta llegar a cero.
; Si no ha llegado a cero visualiza el siguiente.
; Ahora tambin debe visualizar el cero.
; Borra la pantalla
; durante 5 segundo.
; Repite el proceso.

VisualizaContador
Contador,F
Visualiza
VisualizaContador
LCD_Borra
Retardo_5s
Principal

;*********************************** Subrutina "VisualizaContador" ***************************************************


VisualizaContador

call
movf
call
call
call

LCD_Linea1
Contador,W
BIN_a_BCD
LCD_Byte
Retardo_500ms

; Se sita en la primera posicin de la lnea 1.


; Lo pasa a BCD.
; Visualiza el dato numrico.
; Durante este tiempo.

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>

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


#DEFINE Pulsador PORTA,4

; Lnea donde se conecta el pulsador.

;************************************** Registros ************************************************************************


CBLOCK 0x20
Contador
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;*********************************** Seccin de Configuracin *********************************************************


ORG
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

; Inicializa contador y los visualiza por primera vez.

;************************************* Principal **************************************************************************


Principal

btfss
call
goto

Pulsador
IncrementaVisualiza
Principal

; Lee el pulsador.
; Si pulsa salta a incrementar y visualizar el
; contador

;**************************** Subrutina "IncrementaVisualiza" *********************************************************


IncrementaVisualiza

call
btfsc
goto
incf

Retardo_20ms
Pulsador
Fin_Incrementa
Contador,F

; Espera a que se estabilicen los niveles de tensin.


; Vuelve a leer el pulsador.

movlw
call
movf
call
call

D'7'
LCD_PosicionLinea1
Contador,W
BIN_a_BCD
LCD_Byte

; Se sita en el centro de la lnea 1.

EsperaDejePulsar

btfss
goto

Pulsador
EsperaDejePulsar

Fin_Incrementa

return

Visualiza

; Incrementa el contador y despus lo visualiza.

; Se debe visualizar en decimal.

;*********************************************** Libreras ****************************************************************


INCLUDE <RETARDOS.INC>
INCLUDE <BIN_BCD.INC>
INCLUDE <LCD_4BIT.INC>
END

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

;**************** Asignacin de nombres 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 ***********************************************************************


#DEFINE Pulsador PORTA,4

; Lnea donde se conecta el pulsador.

ValorMaximo

; Valor mximo de la cuenta.

EQU

D'6'

;************************************** Registros ************************************************************************


CBLOCK 0x20
Contador
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;*********************************** Seccin de Configuracin *********************************************************


ORG
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 los visualiza por primera vez.

Contador
Visualiza

; Lnea del pulsador se configura como entrada.


; Ir al Banco 0.
; Inicializar el LCD.

;************************************* Principal **************************************************************************


Principal

btfss
call
goto

Pulsador
IncrementaVisualiza
Principal

; Lee el pulsador.
; Si pulsa salta a incrementar y visualizar el
; contador

;**************************** Subrutina "IncrementaVisualiza" *********************************************************


IncrementaVisualiza

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

; Espera a que se estabilice el nivel de tensin.


; Vuelve a leer el pulsador.
; Incrementa el contador y despus lo visualiza.
; Se sita en el centro de la lnea 1.
; Debe visualizar en decimal.

124

EsperaDejePulsar

btfss
goto

Fin_Incrementa

return

Pulsador
EsperaDejePulsar

;****************************** Subrutina "IncrementaContador" ******************************************************


; Incrementa el valor de la variable Contador. Si llega al valor mximo lo resetea.
IncrementaContador

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

; Subrutinas de control del LCD.


; Subrutinas de retardo.
; Subrutina BIN_a_BCD.
; Fin del programa.

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>

;Este fichero contiene los nombres y direcciones de los


; registros de funciones especiales.
; Este fichero esta localizado en el directorio
; con el nombre MPASM.

125

;************************************** Igualdades ***********************************************************************


#DEFINE Pulsador PORTA,4

; Lnea donde se conecta el pulsador.

ValorMaximo

; Valor mximo de la cuenta.

EQU

D'59'

;************************************** Registros ************************************************************************


CBLOCK 0x20
Contador
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;*********************************** Seccin de Configuracin *********************************************************


ORG
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 los visualiza por primera vez.

Contador
Visualiza

; Lnea del pulsador se configura como entrada.


; Ir al Banco 0.
; Inicializar el LCD.

;************************************* Principal **************************************************************************


Principal

btfss
call
goto

Pulsador
IncrementaVisualiza
Principal

; Lee el pulsador.
; Si pulsa salta a incrementar y visualizar el
; contador

;**************************** Subrutina "IncrementaVisualiza" *********************************************************


IncrementaVisualiza

Visualiza

Fin_Incrementa

call
btfsc
goto
call

Retardo_20ms
Pulsador
Fin_Incrementa
IncrementaContador

; Espera a que se estabilice el nivel de tensin.


; Vuelve a leer el pulsador.

movlw
call
movf
call
call
call

D'7'
LCD_PosicionLinea1
Contador,W
BIN_a_BCD
LCD_Byte
Retardo_200ms

; Se sita en el centro de la lnea 1.

; Incrementa el contador y despus lo visualiza.

; Debe visualizar en decimal.


; Se mantiene durante este tiempo.

return

;****************************** Subrutina "IncrementaContador" ******************************************************

126

; Incrementa el valor de la variable Contador. Si llega al valor mximo lo resetea.


IncrementaContador

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>

; Subrutinas de control del LCD.


; Subrutinas de retardo.
; Subrutina BIN_a_BCD.

END

; Fin del programa.

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>

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


#DEFINE Pulsador PORTA,4

; Lnea donde se conecta el pulsador.

;************************************** Registros ************************************************************************

127

CBLOCK 0x20
Contador
Auxiliar
Desplaza
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;*********************************** Seccin de Configuracin *********************************************************


ORG
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

; Lnea del pulsador se configura como entrada.


; Ir al Banco 0.
; Inicializar el LCD.

;************************************* Principal **************************************************************************


Principal

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.

;********************************** Subrutina "VisualizaContador" *****************************************************


VisualizaContador

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.

; Ahora se visualiza en DECIMAL.


; Primero se convierte a BCD.
; Guarda las decenas y unidades.
; Visualiza centenas.
; Visualiza las decenas y unidades.
; En la segunda lnea para visualizar en BINARIO.
; Utiliza el registro auxiliar como contador del

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

; numero de bits que se va visualizando por la


; pantalla.
; El BIT a visualizar pasa al Carry .
; En principio supone que es un uno.
; Comprueba su valor.
; Ha sido cero.
; Lo visualiza.
; Ha terminado de visualizar los 8 bits?
; No, sigue visualizando otro bit.

return
;*********************************************** Librerias ****************************************************************
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
INCLUDE <BIN_BCD.INC>
END

8.9.- Mens_01.asm

( Entrenador Bsico 6 )

title " Visualizacin de un mensaje fijo utilizando la librera LCD_4BIT.INC "


;************************************ Mens_01.asm *********************************************************************
; En la pantalla del modulo LCD se visualiza un mensaje de menos de 16 caracteres grabado
; en la memoria ROM mediante la directiva DT.
;***************************************************************************************************************************
;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>

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

; Indica la posicin del carcter a visualizar


; respecto del comienzo de todos los mensajes
; (posicin de la etiqueta "Mensajes").

129

LCD_ValorCaracter

; Valor del cdigo ASCII del carcter a


; visualizar.

ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;*********************************** Seccin de Configuracin *********************************************************


ORG 5
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.

;************************************* Principal **************************************************************************


LCD_VisualizaOtroCaracter

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

; Obtiene el cdigo ASCII del


carcter apuntado.
; Guarda el valor de carcter.
; Lo nico que hace es posicionar
flag Z. En caso
; que sea "0x00", que es cdigo
indicador final
; de mensaje, sale fuera.
; Visualiza el carcter ASCII ledo.
; Apunta a la posicin del siguiente
carcter
; dentro del mensaje.
; Pasa a modo bajo consumo.

;********************************* Subrutina "Mensajes" ***************************************************************


Mensajes

addwf PCL,F

Mensaje0

DT "Hola!, que tal? ", 0x00

; Posicin inicial del mensaje.

;*********************************************** Libreras ****************************************************************


INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
END

8.10.- Mens_02.asm

( Entrenador Bsico 6 )

title " Visualizacin de un mensaje fijo utilizando la librera LCD_MENS.INC "


;************************************ Mens_02.asm *********************************************************************
; En la pantalla del modulo LCD se visualiza un mensaje de menos de 16 caracteres grabado
; en la memoria ROM mediante la directiva DT. Utiliza la subrutina LCD_Mensaje de la

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>

;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

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;*********************************** Seccin de Configuracin *********************************************************


ORG
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.

;************************************* Principal **************************************************************************


Principal

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

DT "Hola!, que tal? ", 0x00

; Posicin inicial del mensaje.

;*********************************************** Libreras ****************************************************************

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>

;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

;Direccin del Vector Reset

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.

;************************************* Principal **************************************************************************


Principal

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.

;************************************ Subrutina "Visualiza" *************************************************************


Visualiza

call
call
call
call

LCD_Mensaje
Retardo_2s
LCD_Borra
Retardo_200ms

; Visualiza el mensaje durante este tiempo.


; Borra la pantalla y se mantiene as durante
; este tiempo.

return
;********************************* Subrutina "Mensajes" ****************************************************************
Mensajes

addwf PCL,F

Mensaje0
Mensaje1
Mensaje2

DT "Estudia PIC, es", 0x00


DT "bueno.", 0x00
DT "IES JOAN MIRO", 0x00

; Posicin inicial del mensaje 0.


; Posicin inicial del mensaje 1.
; Posicin inicial del mensaje 2.

;*********************************************** Libreras ****************************************************************


INCLUDE <LCD_4BIT.INC>
INCLUDE <LCD_MENS.INC>
INCLUDE <RETARDOS.INC>
END

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

;************************************** Elegimos PIC ********************************************************************


list p=16f877, f=inhx32
;***************** Asignacin de nombres 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 ***********************************************************************


ValorMaximo

EQU

D'6'

; Numero de mensajes a visualizar

;************************************** Registros ************************************************************************


CBLOCK 0x20
Contador
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;*********************************** Seccin de Configuracin *********************************************************


ORG
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.

;************************************* Principal **************************************************************************


Principal

movlw
subwf
btfss
goto
clrf
call
call

ValorMaximo
Contador,W
STATUS,C
Visualiza
Contador
LCD_Borra
Retardo_5s

; Comprueba que Contador no haya llegado al mximo.


; (W) <- (Contador)-ValorMaximo
; Si C=1 salta una instruccin. ValorMaximo > (Contador)
; No. El contador todava no ha llegado al mximo.
; S. Inicializa el contador y lo visualiza.
; Pantalla apagada durante unos instantes
; para sealar el ltimo mensaje de la lista.

Visualiza

call
call
movf
call
call
call

LCD_Borra
Retardo_200ms
Contador,W
ApuntaMensaje
LCD_Mensaje
Retardo_2s

; Borra la pantalla y se sita en la lnea 1.


; Apunta al mensaje que se va a visualizar.
; Lo visualiza.
; Se visualiza el mensaje durante este tiempo.

134

incf
goto

Contador,F
Principal

; Incrementa el contador.
; Repite el proceso.

;************************************ Subrutina "ApuntaMensaje" ******************************************************


ApuntaMensaje

addwf PCL,F
retlw
retlw
retlw
retlw
retlw
retlw

Mensaje0
Mensaje1
Mensaje2
Mensaje3
Mensaje4
Mensaje5

;********************************* Subrutina "Mensajes" ****************************************************************


Mensajes

addwf PCL,F

Mensaje0

DT "Estudia PIC, es", 0x00;

; Posicin inicial del mensaje 0.

Mensaje1

DT "muy divertido.", 0x00

; Posicin inicial del mensaje 1.

Mensaje2

DT "IES JOAN MIRO", 0x00

; Posicin inicial del mensaje 2.

Mensaje3

DT "S.S. de los Reyes", 0x00

; Posicin inicial del mensaje 3.

Mensaje4

DT "

Estudia ", 0x00

; Posicin inicial del mensaje 4.

Mensaje5

DT " ELECTRONICA ", 0x00

; Posicin inicial del mensaje 5.

;*********************************************** Libreras ****************************************************************


INCLUDE <LCD_4BIT.INC>
INCLUDE <LCD_MENS.INC>
INCLUDE <RETARDOS.INC>
END

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

list p=16f877, f=inhx32


;********************* Asignacin de nombres 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

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;*********************************** Seccin de Configuracin *********************************************************


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.

;************************************* Principal **************************************************************************


Principal

movlw
call
call
movlw
call
call
call
call
goto

Mensaje0
LCD_Mensaje
LCD_Linea2
Mensaje1
LCD_Mensaje
Retardo_500ms
LCD_Borra
Retardo_500ms
Principal

; Apunta al mensaje de la primera lnea y


; lo visualiza.
; Pasa a la segunda lnea.
; Apunta al mensaje de la segunda lnea.
; Lo visualiza.
; Durante este tiempo.
; Borra la pantalla.
; Durante este tiempo, produciendo un efecto de
; parpadeo.

;********************************* Subrutina "Mensajes" ****************************************************************


Mensajes

addwf PCL,F

Mensaje0

DT " Estudia un", 0x00

; Posicin inicial del mensaje 0.

Mensaje1

DT "Ciclo Formativo", 0x00

; Posicin inicial del mensaje 1.

;*********************************************** Libreras ****************************************************************

136

INCLUDE <LCD_4BIT.INC>
INCLUDE <LCD_MENS.INC>
INCLUDE <RETARDOS.INC>
END

8.14.- Mens_05.asm

( Entrenador Bsico 6 )

title " Visualizacin de un mensaje fijo y parpadeantes "


;*************************************** Mens_05.asm ******************************************************************
; En la primera lnea de la pantalla aparece un mensaje fijo. En la segunda linea aparece
; un mensaje parpadeante.
;***************************************************************************************************************************
;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>

;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

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;*********************************** Seccin de Configuracin *********************************************************


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.

;************************************* Principal **************************************************************************


Principal

movlw MensajeFijo
call
LCD_Mensaje

; Apunta al mensaje fijo y lo visualiza.

seguir

call
movlw
call
call
call
call
call
goto

; Pasa a la segunda lnea.


; Apunta al mensaje parpadeante.
; Lo visualiza.
; Durante este tiempo.
; Vuelve a situarse al principio de la lnea 2.
; Visualiza lnea en blanco.
; Durante este tiempo, produciendo un efecto de
; parpadeo.

LCD_Linea2
MensajeParpadeante
LCD_Mensaje
Retardo_500ms
LCD_Linea2
LCD_LineaEnBlanco
Retardo_500ms
seguir

;********************************* Subrutina "Mensajes" ****************************************************************


Mensajes

addwf PCL,F

MensajeFijo
MensajeParpadeante

DT " Estudia ", 0x00;


DT " ELECTRONICA ", 0x00

;*********************************************** Libreras ****************************************************************


INCLUDE <LCD_4BIT.INC>
INCLUDE <LCD_MENS.INC>
INCLUDE <RETARDOS.INC>
END

8.15.- Mens_06.asm

( Entrenador Bsico 6 )

title " Visualizacin de mensajes en funcin de un pulsador "


;************************************** Mens_06.asm *******************************************************************
; En el modulo LCD se pueden visualizar varios mensajes diferentes. El paso de uno
; a otro se realiza al actuar sobre un pulsador conectado a la lnea RA4.
; En pantalla aparecere por ejemplo:
;
" Mensaje 2 "
(primera lnea).
;
"S.S. de los Reyes."
(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 ********************************************************************

138

list p=16f877, f=inhx32


;***************** Asignacin de nombres 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 ***********************************************************************


#DEFINE
ValorMaximo

EQU

Pulsador PORTA,4
D'4'

; Lnea donde se conecta el pulsador.


; Numero de mensajes.

;************************************** Registros ************************************************************************


CBLOCK 0x20
Contador

; El contador a visualizar.

ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;*********************************** Seccin de Configuracin *********************************************************


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.

;************************************* Principal **************************************************************************


Principal

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

;********************************** Subrutina "IncrementaContador" **************************************************


; Incrementa el valor de la variable Contador. Si llega al valor mximo lo resetea.
IncrementaContador

incf

Contador,F

; Incrementa el contador.

139

movf Contador,W
sublw ValorMaximo-1
btfss STATUS,C

; Ha superado su valor mximo?


; (W)<- ValorMaximo-(Contador).
; Si C=1 salta una instruccin.
(Contador)> #ValorMaximo
; Lo inicializa si ha superado su valor mximo.

clrf
Contador
return

;************************************** Subrutina "Visualiza" **********************************************************


Visualiza

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

; Borra la pantalla y se sita en la lnea 1.


; Apunta a este mensaje.
; Lo visualiza.
; A continuacin visualiza el contador.
; Se debe visualizar en BCD.
; Al principio de la segunda lnea del LCD.
; Apunta al mensaje que se va a visualizar.
; Lo visualiza.

;************************************** Subrutina "ApuntaMensaje" ****************************************************


ApuntaMensaje addwf PCL,F
retlw
retlw
retlw
retlw

Mensaje0
Mensaje1
Mensaje2
Mensaje3

;***************************************** Subrutina "Mensajes" ********************************************************


Mensajes

addwf PCL,F

Mensaje0
Mensaje1
Mensaje2
Mensaje3

DT " DESARROLLO DE ",0x00


DT " PROYECTOS ", 0x00
DT "S.S. SEBASTIAN", 0x00
DT "de los Reyes", 0x00

MensajeN

DT " Mensaje ", 0x00

; Posicin inicial del mensaje 0.


; Posicin inicial del mensaje 1.
; Posicin inicial del mensaje 2.
; Posicin inicial del mensaje 3.

; Posicin inicial del mensaje primera lnea del LCD.

;*********************************************** Libreras ****************************************************************


INCLUDE
INCLUDE
INCLUDE
INCLUDE

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

;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

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;*********************************** Seccin de Configuracin *********************************************************


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.

;************************************* Principal **************************************************************************


Principal

movlw Mensaje0
; Apunta al mensaje.
call
LCD_MensajeMovimiento
goto
Principal
; Repite la visualizacin.
;***************************************** Subrutina "Mensajes" ********************************************************
Mensajes

addwf PCL,F

Mensaje0

DT "

"

DT "Estudia un Ciclo Formativo "


DT "de ELECTRONICA."
DT "
", 0x0

; Posicin inicial del mensaje.


; Espacios en blanco al principio para mejor
; visualizacin.
; Espacios en blanco al final.

141

;*********************************************** Libreras ****************************************************************


INCLUDE <LCD_MENS.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>

; Subrutina LCD_MensajeMovimiento.
; Subrutinas de control del LCD.
; Subrutinas de retardos.

END

; Fin del programa.

8.17.- Mens_08.asm

( Entrenador Bsico 6 )

title " Juego de la Quiniela "


;*********************************************** Mens_08.asm **********************************************************
; Programa para el juego de la Quiniela: Al presionar sobre el pulsador conectado al pin RA4
; se incrementara en pantalla aparecer rpidamente "1", "X", "2". Cuando se suelta el pulsador
; permanece el signo seleccionado.
;***************************************************************************************************************************
;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>

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


#DEFINE Pulsador PORTA,4

; Lnea donde se conecta el pulsador.

;************************************** Registros ************************************************************************


CBLOCK 0x20
Contador
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;*********************************** Seccin de Configuracin *********************************************************


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

; Poner el PORTA como seales digitales.


; Lnea del pulsador que se configura como entrada.
; Ir al Banco 0.
; Inicializar el LCD.

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

;************************************** Subrutina "IncrementaVisualiza" ***********************************************


IncrementaVisualiza

incf
movlw
call
movf
andlw
call
call

Contador,F
D'7'
LCD_PosicionLinea2
Contador,W
b'00011111'
SignoQuiniela
LCD_Caracter

; Se sita en el centro de la lnea 2.


; Se queda con las 5 lneas bajas: 32 posibilidades
; Lo convierte a signo de la quiniela.
; Lo visualiza.

return
;******************************************** Subrutina "SignoQuiniela" ************************************************
SignoQuiniela addwf PCL,F
DT

"1X121X121X121X1X1X121X121X121X12" ; 50% de "1", 28% de "X" y 21% de "2".

;***************************************** Subrutina "Mensajes" ********************************************************


Mensajes

addwf PCL,F

MensajeQuiniela

DT " Quiniela:", 0x00

;*********************************************** Libreras ****************************************************************


INCLUDE
INCLUDE
INCLUDE
INCLUDE

<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

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

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


#DEFINE Pulsador PORTA,4

; Lnea donde se conecta el pulsador.

;************************************** Registros ************************************************************************


CBLOCK 0x20
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;*********************************** Seccin de Configuracin *********************************************************


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

;************************************* Principal **************************************************************************


Principal

call
movlw
btfsc
movlw
call
goto

LCD_Linea2
MensajeCerrado
Pulsador
MensajeAbierto
LCD_Mensaje
Principal

; En principio considera que est presionado.


; Lee el pulsador.
; No, estaba en reposo.
; Visualiza el resultado.

;*********************************** Subrutina "Mensajes" **************************************************************

144

Mensajes

addwf PCL,F

MensajePulsador
MensajeAbierto
MensajeCerrado

DT "
DT "
DT "

Pulsador"
abIERto", 0x00
CErraDO", 0x00

;*********************************************** Libreras ****************************************************************


INCLUDE <RETARDOS.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <LCD_MENS.INC>
END

( Entrenador Bsico 6 )

8.19.- BIN_BCD.INC

;******************************************** Librera "BIN_BCD.INC" **************************************************


;
;
===================================================================
;
Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;
E. Palacios, F. Remiro y L. Lpez.
;
Editorial Ra-Ma. www.ra-ma.es
;
===================================================================
;
; Un nmero binario natural de 8 bits es convertido a BCD. El resultado se guarda en tres
; posiciones de memorias llamadas: BCD_Centenas, BCD_Decenas y BCD_Unidades.
;
; El procedimiento utilizado es mediante restas de 10, tal como se explic en el captulo 9.
;
; Entrada:
En el registro W el nmero binario natural a convertir.
; Salidas:
En (BCD_Centenas), (BCD_Decenas) y (BCD_Unidades).
;
En el registro W tambin las decenas (nibble alto) y unidades (nibble bajo).
;******************************************** Subrutina "BIN_a_BCD" **************************************************
CBLOCK
BCD_Centenas
BCD_Decenas
BCD_Unidades
ENDC
BIN_a_BCD

clrf
clrf
movwf
BCD_Resta10
movlw
subwf
btfss
goto
BCD_IncrementaDecenas

; En las subrutinas no se debe fijar la direccin


; de la RAM de usuario. Se toma a continuacin de
; la ltima asignada.

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

; Pone a cero las decenas


; e incrementa las centenas.

145

goto
BIN_BCD_Fin

BCD_Resta10

swapf BCD_Decenas,W
addwf BCD_Unidades,W
return

; Otra pasada: Resta 10 al nmero a


convertir.
; En el nibble alto de (W) tambin las
decenas.
; En el nibble bajo de (W) las unidades.
; Vuelve al programa principal.

; La directiva "END" se debe poner en el programa principal no aqu.

( 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
===================================================================

;*********************************************** Librera "LCD_4BIT.INC" **********************************************


;
;
===================================================================
;
Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;
E. Palacios, F. Remiro y L. Lpez.
;
Editorial Ra-Ma. www.ra-ma.es
;
===================================================================
;
; Estas subrutinas permiten realizar las tareas bsicas de control de un mdulo LCD de 2
; lneas por 16 caracteres, compatible con el modelo LM016L.
;
; El visualizador LCD est conectado al Puerto B del PIC mediante un bus de 4 bits. Las
; conexiones son:
; Las 4 lneas superiores del mdulo LCD, pines <DB7:DB4> se conectan a las 4
;
lneas superiores del Puerto B del PIC, pines <RB7:RB4>.
; Pin RS del LCD a la lnea RA0 del PIC.
; Pin R/W del LCD a la lnea RA1 del PIC, o a masa.
; Pin Enable del LCD a la lnea RA2 del PIC.
;
; Se utilizan llamadas a subrutinas de retardo de tiempo localizadas en la librera RETARDOS.INC.
;
;***************************************************** Registros *********************************************************
CBLOCK
LCD_Dato
LCD_GuardaDato
LCD_GuardaTRISB
LCD_Auxiliar1
LCD_Auxiliar2
ENDC
;***************************************************** Igualdades ********************************************************
LCD_CaracteresPorLinea

EQU

D16

#DEFINE LCD_PinRS
#DEFINE LCD_PinRW
#DEFINE LCD_PinEnable

PORTA,0
PORTA,1
PORTA,2

; Nmero de caracteres por lnea de la pantalla.

146

#DEFINE LCD_BusDatos

PORTB

; ********************************************* Subrutina "LCD_Inicializa" **********************************************


; Inicializacin del mdulo LCD: Configura funciones del LCD, produce reset por software,
; borra memoria y enciende pantalla. El fabricante especifica que para garantizar la
; configuracin inicial hay que hacerla como sigue:
;
LCD_Inicializa bsf
STATUS,RP0
; Configura las lneas conectadas al pines RS,
bcf
LCD_PinRS
; R/W y E.
bcf
LCD_PinEnable
bcf
LCD_PinRW
bcf
STATUS,RP0
bcf
LCD_PinRW
; En caso de que est conectado le indica
; que se va a escribir en el LCD.
bcf
LCD_PinEnable
; Impide funcionamiento del LCD poniendo E=0.
bcf
LCD_PinRS
; Activa el Modo Comando poniendo RS=0.
call
Retardo_20ms
movlw b'00110000'
call
LCD_EscribeLCD
; Escribe el dato en el LCD.
call
Retardo_5ms
movlw b'00110000'
call
LCD_EscribeLCD
call
Retardo_200micros
movlw b'00110000'
call
LCD_EscribeLCD
movlw b'00100000'
; Interface de 4 bits.
call
LCD_EscribeLCD
; Ahora configura el resto de los parmetros:
call
call
call
call

LCD_2Lineas4Bits5x7
LCD_Borra
LCD_CursorOFF
LCD_CursorIncr

; LCD de 2 lneas y caracteres de 5x7 puntos.


; Pantalla encendida y limpia. Cursor al principio
; de la lnea 1. Cursor apagado.
; Cursor en modo incrementar.

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

; Se queda con el nibble alto del dato que es el


; que hay que enviar y lo guarda.
; Lee la informacin actual de la parte baja
; del Puerto B, que no se debe alterar.
; Enviar la parte alta del dato de entrada
; y en la parte baja lo que haba antes.
; Acceso al Banco 1.
; Guarda la configuracin que tena antes TRISB.
; Las 4 lneas inferiores del Puerto B se dejan
; como estaban y las 4 superiores como salida.
; Acceso al Banco 0.
; Recupera el dato a enviar.

147

movwf LCD_BusDatos
bsf
LCD_PinEnable
bcf

; Enva el dato al mdulo LCD.


; Permite funcionamiento del LCD mediante un
pequeo

LCD_PinEnable

; pulso y termina impidiendo el funcionamiento


del LCD.
bsf
STATUS,RP0
; Acceso al Banco 1. Restaura el antiguo valor en
movf LCD_GuardaTRISB,W ; la configuracin del Puerto B.
movwf PORTB
; Realmente es TRISB.
bcf
STATUS,RP0
; Acceso al Banco 0.
return
; *******************************Subrutinas variadas para el control del mdulo LCD *******************************
;Los comandos que pueden ser ejecutados son:
LCD_CursorIncr

movlw b'00000110'
goto
LCD_EnviaComando

; Cursor en modo incrementar.

LCD_Linea1

movlw b'10000000'
goto
LCD_EnviaComando

; Cursor al principio de la Lnea 1.


; Direccin 00h de la DDRAM

LCD_Linea2

movlw b'11000000'
goto
LCD_EnviaComando

; Cursor al principio de la Lnea 2.


; Direccin 40h de la DDRAM

LCD_PosicionLinea1

iorlw
goto

b'10000000'
LCD_EnviaComando

; Cursor a posicin de la Lnea 1, a partir de la


; direccin 00h de la DDRAM ms el valor del
; registro W.

LCD_PosicionLinea2

iorlw
goto

b'11000000'
LCD_EnviaComando

; Cursor a posicin de la Lnea 2, a partir de la


; direccin 40h de la DDRAM ms el valor del
; registro W.

LCD_OFF

movlw b'00001000'
goto
LCD_EnviaComando

; Pantalla apagada.

LCD_CursorON

movlw b'00001110'
goto
LCD_EnviaComando

; Pantalla encendida y cursor encendido.

LCD_CursorOFF

movlw b'00001100'
goto
LCD_EnviaComando

; Pantalla encendida y cursor apagado.

LCD_Borra

movlw b'00000001'
goto
LCD_EnviaComando

; Borra toda la pantalla, memoria DDRAM y pone el


; cursor a principio de la lnea 1.

LCD_2Lineas4Bits5x7 movlw b'00101000'


goto
LCD_EnviaComando

; Define la pantalla de 2 lneas, con caracteres


; de 5x7 puntos y conexin al PIC mediante bus de
; 4 bits.

; *************************** Subrutinas "LCD_EnviaComando" y "LCD_Caracter" **********************************


; "LCD_EnviaComando". Escribe un comando en el registro del mdulo LCD. La palabra de
; comando ha sido entregada a travs del registro W. Trabaja en Modo Comando.
; "LCD_Caracter". Escribe en la memoria DDRAM del LCD el carcter ASCII introducido a
; a travs del registro W. Trabaja en Modo Dato.
LCD_EnviaComando

bcf
goto

LCD_PinRS
LCD_Envia

; Activa el Modo Comando, poniendo RS=0.

148

LCD_Carcter

bsf
call

LCD_PinRS
LCD_CodigoCGROM

LCD_Envia

movwf LCD_GuardaDato
call
LCD_EscribeLCD
swapf LCD_GuardaDato,W

; Activa el "Modo Dato", poniendo RS=1.


; Obtiene el cdigo para correcta visualizacin.

call
btfss

LCD_EscribeLCD
LCD_PinRS

; Guarda el dato a enviar.


; Primero enva el nibble alto.
; Ahora enva el nibble bajo. Para ello pasa el
; nibble bajo del dato a enviar a parte alta del byte.
; Se enva al visualizador LCD.
; Debe garantizar una correcta escritura

call
call

Retardo_2ms
Retardo_50micros

; manteniendo 2 ms en modo comando


; y 50 s en modo carcter.

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

; Guarda el valor del carcter y comprueba si es


; un carcter especial.

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

; Recupera el cdigo ASCII de entrada.


; Es la ""?

LCD_Grado

movf
sublw
btfss
goto
movlw
movwf

LCD_Dato,W
''
STATUS,Z
LCD_FinCGROM
b'11011111'
LCD_Dato

; Recupera el cdigo ASCII de entrada.


; Es el smbolo ""?

movf

LCD_Dato,W

; En (W) el cdigo buscado.

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

; (LCD_Auxiliar1) se utiliza como contador.

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

; Guarda el valor de entrada.

LCD_VisualizaAlto

swapf LCD_Auxiliar2,W
call
LCD_Nibble

; Pone el nibble alto en la parte baja.


; Lo visualiza.

LCD_VisualizaBajo

movf
call

; Repite el proceso con el nibble bajo.


; Lo visualiza.

LCD_Auxiliar2,W
LCD_Nibble

; Guarda el valor de entrada.


; Analiza si el nibble alto es cero.
; Si es cero lo apaga.
; No es cero y lo visualiza.
; Visualiza un espacio en blanco.

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

; Se queda con la parte baja.


; Lo guarda.
; Comprueba si hay que representarlo con

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

; S, por tanto, se le suma el ASCII de la 'A'.

; Y visualiza el carcter. Se hace con un "goto"


; para no sobrecargar la pila.

===================================================================
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 )

;******************************************** Librera "LCD_MENS.INC" ***********************************************


;
;
===================================================================
;
Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;
E. Palacios, F. Remiro y L. Lpez.
;
Editorial Ra-Ma. www.ra-ma.es
;
===================================================================
;
; Librera de subrutinas para el manejo de mensajes a visualizar en un visualizador LCD.
CBLOCK
LCD_ApuntaCaracter
LCD_ValorCaracter
ENDC

; Indica la posicin del carcter a visualizar


; respecto del comienzo de todos los mensajes,
; (posicin de la etiqueta "Mensajes").
; Cdigo ASCII del carcter a
; visualizar.

; 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

; Carga la posicin del mensaje.


; Visualiza el mensaje.

LCD_Mensaje
movwf
movlw
subwf
decf

LCD_ApuntaCaracter
Mensajes
LCD_ApuntaCaracter,F
LCD_ApuntaCaracter,F

; Posicin del primer carcter del mensaje.


; Halla la posicin relativa del primer carcter
; del mensaje respecto de etiqueta "Mensajes".
; Compensa la posicin que ocupa "addwf PCL,F".

LCD_VisualizaOtroCaracter
movf
call
movwf
movf
btfsc
goto

LCD_ApuntaCaracter,W
Mensajes
LCD_ValorCaracter
LCD_ValorCaracter,F
STATUS,Z
LCD_FinMensaje

; Obtiene el cdigo ASCII del carcter apuntado.


; Guarda el valor de carcter.
; Lo nico que hace es posicionar flag Z. En caso
; que sea "0x00", que es cdigo indicador final
; de mensaje, sale fuera.

LCD_Caracter
LCD_ApuntaCaracter,F
LCD_VisualizaOtroCaracter

; Visualiza el carcter ASCII ledo.


; Apunta a la posicin del siguiente carcter
; dentro del mensaje.

LCD_NoUltimoCaracter
call
incf
goto
LCD_FinMensaje
return

; Vuelve al programa principal.

; ******************************* Subrutina "LCD_MensajeMovimiento" ***********************************************


;
; Visualiza un mensaje de mayor longitud que los 16 caracteres que pueden representarse
; en una lnea, por tanto se desplaza a travs de la pantalla.
;
; En el mensaje debe dejarse 16 espacios en blanco, al principio y al final para
; conseguir que el desplazamiento del mensaje sea lo ms legible posible.
;
CBLOCK
LCD_CursorPosicion
; Contabiliza la posicin del cursor dentro de la
ENDC
; pantalla LCD
LCD_MensajeMovimiento
movwf
movlw
subwf
decf

LCD_ApuntaCaracter
Mensajes
LCD_ApuntaCaracter,F
LCD_ApuntaCaracter,F

; Posicin del primer carcter del mensaje.


; Halla la posicin relativa del primer carcter
; del mensaje respecto de la etiqueta "Mensajes".
; Compensa la posicin que ocupa "addwf PCL,F".

LCD_CursorPosicion
LCD_Borra

; El cursor en la posicin 0 de la lnea.


; Se sita en la primera posicin de la lnea 1 y
; borra la pantalla.

LCD_CaracteresPorLinea
LCD_CursorPosicion,W
STATUS,Z
LCD_NoEsFinalLinea

; Ha llegado a final de lnea?

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

; Lo mantiene visualizado durante este tiempo.


; Apunta a la posicin del segundo carcter
; visualizado en pantalla, que ser el primero en la
; siguiente visualizacin de lnea, para producir el
; efecto de desplazamiento hacia la izquierda.

LCD_NoEsFinalLinea
movf
call
movwf
movf
btfsc
goto

LCD_ApuntaCaracter,W
Mensajes
LCD_ValorCaracter
LCD_ValorCaracter,F
STATUS,Z
LCD_FinMovimiento

; Obtiene el ASCII del carcter apuntado.


; Guarda el valor de carcter.
; Lo nico que hace es posicionar flag Z. En caso
; que sea "0x00", que es cdigo indicador final
; de mensaje, sale fuera.

LCD_NoUltimoCaracter2
call
incf

LCD_Caracter
LCD_CursorPosicion,F

incf
goto

LCD_ApuntaCaracter,F
LCD_VisualizaCaracter

; Visualiza el carcter ASCII ledo.


; Contabiliza el incremento de posicin del
; cursor en la pantalla.
; Apunta a la siguiente posicin por visualizar.
; Vuelve a visualizar el siguiente carcter
; de la lnea.

LCD_FinMovimiento
return
;
;
;
;
;

; Vuelve al programa principal.

===================================================================
Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
E. Palacios, F. Remiro y L. Lpez.
Editorial Ra-Ma. www.ra-ma.es
===================================================================

153

9.- Entrenador Bsico 7

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>

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

; Registro que guarda el orden de la tecla pulsada.

ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;*********************************** Seccin de Configuracin ********************************************************


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.

;************************************* Principal **************************************************************************

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

; Guarda el orden de la tecla pulsada.


; No sale hasta que levante el dedo.

movf
call

GUARDA_TECLA,W
BIN_a_BCD

; Lo pasa a BCD.

call

LCD_ByteCompleto

; Visualiza en pantalla.

goto

Principal

;*********************************************** Libreras ****************************************************************


INCLUDE
INCLUDE
INCLUDE
INCLUDE

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

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

156

CBLOCK 0x20
GUARDA_TECLA

; Registro que guarda el valor de la tecla pulsada.

ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;*********************************** Seccin de Configuracin *********************************************************


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.

;************************************* Principal **************************************************************************


Principal
call
Teclado_LeeHex
; Lee el teclado hexadecimal.
btfss STATUS,C
; Si se pulsa alguna tecla el Cy=1 y salta
una instruccin.
goto
Fin
; No, por tanto, sale.

Fin

movwf GUARDA_TECLA
call
Teclado_EsperaDejePulsar

; Guarda el valor de la tecla pulsada.


; No sale hasta que levante el dedo.

movf
call

GUARDA_TECLA,W
LCD_Nibble

; Visualiza el valor en pantalla.

goto

Principal

;*********************************************** Libreras ****************************************************************


INCLUDE <TECLADO.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
END

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

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

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

; Registro que guarda el valor de la tecla pulsada.

ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;************************************* Vector de Interrupcin ***********************************************************


ORG

GOTO Interrup

;Direccin del Vector de Interrupcin.


;Ir a rutina de Interrupcin

;*********************************** Seccin de Configuracin *********************************************************


COMIENZO

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.

;************************************* Principal **************************************************************************


Principal

sleep
; Espera en modo bajo consumo que pulse teclado.
goto
Principal
;************************************ Rutina de Interrupcin "Interrup" *************************************************
Interrupcall

Teclado_LeeHex

; Obtiene el valor hexadecimal de la tecla pulsada.

158

movwf
call
movf
call
movf
bcf
retfie

GUARDA_TECLA
Teclado_EsperaDejePulsar
GUARDA_TECLA,W
LCD_Nibble
PORTB,w
INTCON,RBIF

; Guarda el valor de la tecla pulsada.


; Para que no se repita el mismo carcter
; Visualiza el valor en pantalla.
; Necesario en proteus para limpiar flag.
; mientras permanece pulsado. Limpia flag.

;*********************************************** Libreras ****************************************************************


INCLUDE <TECLADO.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
END

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>

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

; Registro que guarda el valor de la tecla pulsada.

ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

;Direccin del Vector Reset

159

GOTO COMIENZO

;Comienzo del Programa

;************************************* Vector de Interrupcin ***********************************************************


ORG

GOTO Interrup

;Direccin del Vector de Interrupcin.


;Ir a rutina de Interrupcin

;*********************************** Seccin de Configuracin *********************************************************


COMIENZO

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.

;************************************* Principal **************************************************************************


Principal

sleep
goto

; Espera en modo bajo consumo que pulse teclado.


Principal

;************************************ Rutina de Interrupcin "Interrup" ************************************************


; La subrutina de atencin a la interrupcin obtiene el valor ASCII de la tecla pulsada.
; A continuacin se expone la relaci0n entre el numero de orden de la tecla y los valores
; correspondientes para el teclado supuesto.
;
;
;
;
;
Interrupcall

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

; Lee el Orden de la tecla pulsada


; Guarda el orden de la tecla pulsada.
; Para que no se repita el mismo carcter.

movf
bcf
retfie

; Necesario en proteus para limpiar flag.


; Limpia flag.

PORTB,W
INTCON,RBIF

; Lo convierte en su valor ASCII mediante


; una tabla, y lo visualiza.

;************************************ Subrutina " Tecl_ConvierteOrdenEnASCII " ************************************


Tecl_ConvierteOrdenEnASCII addwf PCL,F

; Segn el teclado utilizado resulta

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>

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

; Registro que guarda el valor de la tecla pulsada.

ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;************************************* Vector de Interrupcin ***********************************************************


ORG

;Direccin del Vector de Interrupcin.

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.

Mensaje presentacin ; Visualiza el mensaje en movimiento.


LCD_MensajeMovimiento
LCD_Borra
; Borra la pantalla y se sita en la primera lnea.
MensajePulsa
; Visualiza el mensaje fijo de la primera lnea.
LCD_Mensaje
LCD_Linea2
; Pasa a la segunda lnea.

call
Teclado_Inicializa
movlw b'10001000'
movwf INTCON

; Configura las lneas del teclado.


; Habilita la interrupcin RBI y la general.

;************************************* Principal **************************************************************************


Principal

sleep
goto

; Espera en modo bajo consumo que pulse teclado.


Principal

;************************************ Rutina de Interrupcin "Interrup" *************************************************


Interrupcall

Teclado_LeeHex
movwf GUARDA_TECLA
call
Teclado_EsperaDejePulsar

; Obtiene el valor hexadecimal de la tecla pulsada.


; Guarda el valor de la tecla pulsada.
; Para que no se repita el mismo carcter.

movf
call

GUARDA_TECLA,W
LCD_Nibble

; Visualiza el valor en pantalla.

movf
bcf
retfie

PORTB,W
INTCON,RBIF

; Necesario en proteus para limpiar flag.

;******************************************* Subrutina de "Mensajes" **************************************************


Mensajes

addwf PCL,F

MensajePresentacion

DT "
"
DT "Estudia Desarrollo de Productos Electrnicos"
DT "
", 0x00

MensajePulsa

DT "LUCAS, pulsa:", 0x00

;*********************************************** Libreras ****************************************************************


INCLUDE
INCLUDE
INCLUDE
INCLUDE

<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

;************************************************* Tecla_06.asm ********************************************************


; En pantalla aparecen el cdigo de las teclas que se van pulsando. Cuando llega al final de la primera
; lnea, pasa a la segunda lnea. Cuando llega al final de la segunda lnea borra todo y
; comienza de nuevo al principio de la lnea 1.
;***************************************************************************************************************************
;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>

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


CaracteresUnaLinea
CaracteresDosLineas

EQU
EQU

d'16'
d'32'

; Numero de caracteres de una lnea.


; Numero de caracteres de dos lneas.

;************************************** Registros ***********************************************************************


CBLOCK 0x20
GuardaTecla
ContadorCaracteres

; Guarda el valor de la tecla pulsada.


; Guarda el numero de caracteres pulsados.

ENDC
;*********************************** Seccin Cdigo de Reset *********************************************************
ORG

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;************************************* Vector de Interrupcin ***********************************************************


ORG

GOTO Interrup

;Direccin del Vector de Interrupcin.


;Ir a rutina de Interrupcin

;*********************************** Seccin de Configuracin *********************************************************


COMIENZO

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

; Configura las lneas del teclado.


; Habilita la interrupcin RBI y la general.

clrf

; En principio no hay caracteres escritos.

ContadorCaracteres

;************************************* Principal **************************************************************************


Principal

sleep
goto

; Espera en modo bajo consumo que pulse teclado.


Principal

;************************************ Rutina de Interrupcin "Interrup" *************************************************


Interrup

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

; Obtiene el valor de la tecla pulsada.


; Reserva el valor de la tecla pulsada.
; Para que no se repita el mismo carcter.
; Comprueba si ha llegado al numero mximo de
; caracteres de una lnea.
; Se sita en la segunda lnea.
; Comprueba si ha llegado al numero mximo de
; caracteres de dos lneas.
; No, por tanto, sigue escribiendo.
; Si, borra pantalla e inicializa el contador.

incf
movf
call

ContadorCaracteres,F
GuardaTecla,W
LCD_Nibble

; Un nuevo carcter escrito.

movf
bcf

PORTB,W
INTCON,RBIF

; Necesario en proteus para limpiar flag.


; Limpia flag.

; Visualiza el carcter en pantalla.

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

;***************************************** Tecla_07.asm ****************************************************************


; Los valores decimales que va escribiendo por el teclado aparecen en pantalla. Si pulsa cualquier
; otra tecla que no sea un numero decimal lo interpreta como tecla de borrado de 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>

;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
GuardaValor
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;************************************* Vector de Interrupcin ***********************************************************


ORG

GOTO Interrup

;Direccin del Vector de Interrupcin.


;Ir a rutina de Interrupcin

;*********************************** Seccin de Configuracin *********************************************************


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.

call
Teclado_Inicializa
movlw b'10001000'

; Configura las lneas del teclado.


; Habilita la interrupcin RBI y la general.

; 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

; Obtiene el valor hexadecimal de la tecla pulsada.


; Guarda el valor ledo.
; Para que no se repita el mismo carcter.

movf
bcf
retfie

PORTB,W
INTCON,RBIF

; Necesario en proteus para limpiar flag.

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

;*********************************************** Libreras ****************************************************************


INCLUDE <TECLADO.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
END

( Entrenador Bsico 7 )

9.8.- Tecla_08.asm

title " Suma el valor de tres teclas y aparece en el LCD "


title " en decimal y hexadecimal "
;***************************************** Tecla_08.asm ****************************************************************
; Suma el valor de tres teclas pulsadas consecutivamente. En la primera lnea de la pantalla del
; modulo LCD aparece en hexadecimal y en la segunda en decimal. As por ejemplo, si pulsa
; "A", "6" y "F" en pantalla aparece:
;
;

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>

;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
ContadorTeclasPulsadas
GuardaValor
Operando1
Operando2
Operando3
Resultado
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;************************************* Vector de Interrupcin ***********************************************************


ORG

;Direccin del Vector de Interrupcin.

GOTO Interrup

;Ir a rutina de Interrupcin

;*********************************** Seccin de Configuracin *********************************************************


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.

call
clrf
movlw
movwf

; Configura las lneas del teclado.


; Resetea este contador.
; Habilita la interrupcin RBI y la general.

; Ir al Banco 0.
; Inicializar el LCD.

Teclado_Inicializa
ContadorTeclasPulsadas
b'10001000'
INTCON

;************************************* Principal **************************************************************************


Principal

sleep
goto

; Espera en modo bajo consumo que pulse teclado.


Principal

;******************************* Macro "VisualizaHex" ******************************************************************


VisualizaHex

MACRO

Operando,Caracter

movf GuardaValor,W
movwf Operando
call
LCD_Nibble

; Recupera el valor y lo visualiza.


; Lo guarda para sumar despus.
; Visualiza el valor en la pantalla

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

; (Operando) -> (W)


; Lo pasa a BCD.
; Visualiza en pantalla.
; A continuacin signo '+' o '=' segn corresponda.

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

; Obtiene el valor hexadecimal de la tecla pulsada.


; Guarda el valor ledo.
; Para que no se repita el mismo carcter.
; Segn el numero de tecla pulsada realiza una
; funcin distinta.

; Borra la pantalla anterior.


; En pantalla el mensaje "Hex:"

SegundaTeclaPulsada VisualizaHex Operando2,'+'


goto
FinInterrupcion
TerceraTeclaPulsada

FinInterrupcion

VisualizaHex Operando3,'='
movf Operando1,W
addwf Operando2,W
addwf Operando3,W
movwf Resultado
call
LCD_Byte

; Procede a la suma de los tres valores.

; 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

;************************************ Subrutina "Mensajes" *************************************************************


Mensajes

addwf PCL,F

168

MensajeHex
MensajeDec

DT
DT

"Hex: ", 0x0


"Dec: ", 0x0

;*********************************************** Libreras ****************************************************************


INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE

<TECLADO.INC>
<LCD_4BIT.INC>
<LCD_MENS.INC>
<RETARDOS.INC>
<BIN_BCD.INC>

END

9.8.- Tecla_09.asm

( Entrenador Bsico 7 )

title " Cerradura Electrnica "


;******************************************** Tecla_09.asm ************************************************************
; Cerradura Electrnica: la salida se activa cuando una clave de varios dgitos introducida
; por teclado sea correcta.
; Tiene una salida "CerraduraSalida" que, cuando se habilita, activa durante unos segundos
; el electroimn de la cerradura permitiendo la apertura de la puerta:
; - Si (CerraduraSalida) = 1, la puerta se puede abrir.
; - Si (CerraduraSalida) = 0, la puerta no se puede abrir.
;Funcionamiento:
; - En pantalla visualiza "Introduzca CLAVE". Segn se va escribiendo, visualiza asteriscos '*'.
; - Cuando termine de escribir la clave pueden darse dos posibilidades:
;
;

Si la clave es incorrecta la cerradura sigue inactivada, en pantalla aparece el mensaje


"Clave INCORRECTA" durante unos segundos y tiene que repetir de nuevo el proceso.

;
;
;

Si la clave es correcta la cerradura se activa durante unos segundos y la puerta


puede ser abierta. En pantalla aparece: "Clave CORRECTA" (primera lnea) y "Abra
la puerta" (segunda lnea). Pasados unos segundos, se repite el proceso.

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

;Este fichero contiene los nombres y direcciones de los


; registros de funciones especiales.
; Este fichero esta localizado en el directorio
; con el nombre MPASM.

169

;************************************** Igualdades ***********************************************************************


; La clave puede tener cualquier tamao y su longitud se calcula:
#DEFINE LongitudClave

(FinClaveSecreta-ClaveSecreta)

#DEFINE CerraduraSalida

PORTA,3

;************************************** Registros ***********************************************************************


CBLOCK 0x20
ContadorCaracteres
GuardaClaveTecleada
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;************************************* Vector de Interrupcin ***********************************************************


ORG

GOTO Interrup

;Direccin del Vector de Interrupcin.


;Ir a rutina de Interrupcin.

;*********************************** Seccin de Configuracin *********************************************************


COMIENZO

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.

;************************************* Principal **************************************************************************


Principal

sleep
goto

; Espera en modo bajo consumo que pulse teclado.


Principal

;************************************ Rutina de Interrupcin "Interrup" *************************************************


Interrup

call

Teclado_LeeHex

; Obtiene el valor hexadecimal de la tecla pulsada.

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

; Almacena ese digito en memoria RAM con


; con direccionamiento indirecto apuntado por FSR.
; Visualiza asterisco.

170

call
incf
incf
movlw
subwf
btfss
goto

LCD_Caracter
FSR,F
ContadorCaracteres,F
LongitudClave
ContadorCaracteres,W
STATUS,C
Fin_Interr

; Apunta a la prxima posicin de RAM.


; Cuenta el numero de teclas pulsadas.
; Comprueba si ha introducido tantos caracteres
; como longitud tiene la clave secreta.
; Ha terminado de introducir caracteres?
; No, pues lee el siguiente carcter tecleado.

; Si ha llegado aqu es porque ha terminado de introducir el mximo de dgitos. Ahora


; procede a comprobar si la clave es correcta. Para ello va comparando cada uno de los
; dgitos almacenados en las posiciones RAM a partir de "ClaveTecleada" con el valor
; correcto de la clave almacenado en la posicin ROM "ClaveSecreta".
; Para acceder a las posiciones de memoria RAM a partir de "ClaveTecleada" utiliza
; direccionamiento indirecto siendo FSR el apuntador.
; Para acceder a memoria ROM "ClaveSecreta" se utiliza direccionamiento indexado con el
; el registro ContadorCaracteres como apuntador.
call
clrf
movlw
movwf
Comp_Claves movf
movwf
movf
call
subwf
btfss
goto
incf
incf
movlw
subwf
btfss
goto

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

Lee la clave tecleada y guardada en RAM.


; La guarda para compararla despus.
; Apunta al carcter de ROM a leer.
; En (W) el carcter de la clave secreta.
; Se comparan.
; Son iguales?, Z=1?
; No, pues la clave tecleada es incorrecta.
; Apunta a la prxima posicin de RAM.
; Apunta a la prxima posicin de ROM.
; Comprueba si ha comparado tantos caracteres
; como longitud tiene la clave secreta.
; Ha terminado de comparar caracteres?
; No, pues compara el siguiente carcter.

ClaveCorrecta movlw MensajeClaveCorrecta


call
LCD_Mensaje
call
movlw
call
bsf

LCD_Linea2
MensajeAbraPuerta
LCD_Mensaje
CerraduraSalida

goto

Retardo

; La clave ha sido correcta. Aparecen los mensajes


; correspondientes y permite la apertura de la
; puerta durante unos segundos.

; Activa la cerradura durante unos

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

"Teclee CLAVE:", 0x00


"Clave CORRECTA", 0x00
"Abra la puerta", 0x00
"Clave INCORRECTA", 0x00

;************************************ Subrutina "LeeClaveSecreta" ****************************************************


LeeClaveSecreta

addwf PCL,F

ClaveSecreta

DT
DT

4h,5h,6h,1h
7h,8h

; Ejemplo de clave secreta.

FinClaveSecreta
;*********************************************** Libreras ****************************************************************
INCLUDE
INCLUDE
INCLUDE
INCLUDE

<TECLADO.INC>
<LCD_4BIT.INC>
<LCD_MENS.INC>
<RETARDOS.INC>

;***************************************** Direccin de comienzo del puntero FSR ***********************************


; Las posiciones de memoria RAM donde se guardara la clave leda se definen al final, despus
; de las Libreras, ya que van a ocupar varias posiciones de memoria mediante el
; direccionamiento indirecto utilizado.
CBLOCK
ClaveTecleada
ENDC
END

; Fin del programa.

172

10.- Entrenador Bsico 7-1

173

( Entrenador Bsico 7-1 )

10.1.- Tecla_10.asm

title " Cerradura Electrnica activando un motor PAP"


;******************************************** Tecla_09.asm *************************************************************
; Cerradura Electrnica: la salida se activa cuando una clave de varios dgitos introducida
; por teclado sea correcta.
; Tiene una salida "CerraduraSalida" que, cuando se habilita, activa durante unos segundos
; el electroimn de la cerradura permitiendo la apertura de la puerta:
; - Si (CerraduraSalida) = 1, la puerta se puede abrir.
; - Si (CerraduraSalida) = 0, la puerta no se puede abrir.
;Funcionamiento:
; - En pantalla visualiza "Introduzca CLAVE". Segn se va escribiendo, visualiza asteriscos '*'.
; - Cuando termine de escribir la clave pueden darse dos posibilidades:
;
;

Si la clave es incorrecta la cerradura sigue inactivada, en pantalla aparece el mensaje


"Clave INCORRECTA" durante unos segundos y tiene que repetir de nuevo el proceso.

;
;
;

Si la clave es correcta la cerradura se activa durante unos segundos y la puerta


puede ser abierta. En pantalla aparece: "Clave CORRECTA" (primera lnea) y "Abra
la puerta" (segunda lnea). Pasados unos segundos, se repite el proceso.

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

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


; La clave puede tener cualquier tamao y su longitud se calcula:
#DEFINE LongitudClave

(FinClaveSecreta-ClaveSecreta)

;************************************** Registros ***********************************************************************


; Las posiciones de memoria RAM donde se guardara la clave leda, se inicializa con una posicin fija
; "ClaveTecleada", antes de las reservadas con las seudoinstrucciones CBLOCK, ya que van a
; ocupar varias posiciones de memoria mediante el direccionamiento indirecto.

174

ClaveTecleada equ 0x20


CBLOCK 0x30
ContadorCaracteres
GuardaClaveTecleada
ContadorPAP
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;************************************* Vector de Interrupcin ***********************************************************


ORG

GOTO Interrup

;Direccin del Vector de Interrupcin.


;Ir a rutina de Interrupcin.

;*********************************** Seccin de Configuracin *********************************************************


COMIENZO

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.

;************************************* Principal **************************************************************************


Principal

sleep
goto

; Espera en modo bajo consumo que pulse teclado.


Principal

;************************************ Rutina de Interrupcin "Interrup" *************************************************


Interrupcall

Teclado_LeeHex

; Obtiene el valor hexadecimal de la tecla pulsada.

; 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

; Almacena ese digito en memoria RAM con


; con direccionamiento indirecto apuntado por FSR.
; Visualiza asterisco.
; Apunta a la prxima posicin de RAM.

175

incf
movlw
subwf
btfss
goto

ContadorCaracteres,F
LongitudClave
ContadorCaracteres,W
STATUS,C
Fin_Interr

; Cuenta el numero de teclas pulsadas.


; Comprueba si ha introducido tantos caracteres
; como longitud tiene la clave secreta.
; Ha terminado de introducir caracteres?
; No, pues lee el siguiente carcter tecleado.

; Si ha llegado aqu es porque ha terminado de introducir el mximo de dgitos. Ahora


; procede a comprobar si la clave es correcta. Para ello va comparando cada uno de los
; dgitos almacenados en las posiciones RAM a partir de "ClaveTecleada" con el valor
; correcto de la clave almacenado en la posicin ROM "ClaveSecreta".
; Para acceder a las posiciones de memoria RAM a partir de "ClaveTecleada" utiliza
; direccionamiento indirecto siendo FSR el apuntador.
; Para acceder a memoria ROM "ClaveSecreta" se utiliza direccionamiento indexado con el
; el registro ContadorCaracteres como apuntador.
call
clrf
movlw
movwf
Comp_Claves movf
movwf
movf
call
subwf
btfss
goto
incf
incf
movlw
subwf
btfss
goto

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

; Lee la clave tecleada y guardada en RAM.


; La guarda para compararla despus.
; Apunta al carcter de ROM a leer.
; En (W) el carcter de la clave secreta.
; Se comparan.
; Son iguales?, Z=1?
; No, pues la clave tecleada es incorrecta.
; Apunta a la prxima posicin de RAM.
; Apunta a la prxima posicin de ROM.
; Comprueba si ha comparado tantos caracteres
; como longitud tiene la clave secreta.
; Ha terminado de comparar caracteres?
; No, pues compara el siguiente carcter.

ClaveCorrecta movlw MensajeClaveCorrecta


call
LCD_Mensaje
call
LCD_Linea2
movlw MensajeEsperar
call
LCD_Mensaje
Abrir_puerta

inc_cont_pap

esperar

; La clave ha sido correcta. Aparecen los mensajes


; correspondientes y permite la apertura de la
; puerta durante unos segundos.
; Mostrar mensaje "Espere por favor"

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

; Marcar el LED de Abierto.

PORTD,1
PORTD,0
LCD_Linea1
MensajeAbraPuerta

; Mostrar mensaje "Abra la puerta"

176

call
call
movlw
call
call
call

LCD_Mensaje
LCD_Linea2
Tiempo1
LCD_Mensaje
Retardo_2s
LCD_Borra

; Mostrar mensaje "Tienes 10 Seg."


; Retardo de 10 Seg.

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

; Mostrar mensaje "Clave INCORRECTA"

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

; Necesario en proteus para borrar el flag.

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

; Marcar el LED de Cerrado.


; Inicializa este contador.
; FSR apunta a la primera direccion 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 linea.

return
;************************************ Subrutina "Mensajes" *************************************************************
Mensajes

addwf PCL,F

MensajeTeclee
DT
MensajeClaveCorrecta DT
MensajeAbraPuerta
DT
MensajeEsperar
DT
MensajeClaveIncorrecta

"Teclee CLAVE:", 0x00


"Clave CORRECTA", 0x00
"Abra la puerta", 0x00
"Espere por favor", 0x00
DT
"Clave INCORRECTA", 0x00

177

Tiempo1

DT

"Tienes 10 Seg. ", 0x00

;************************************ Subrutina "LeeClaveSecreta" ****************************************************


LeeClaveSecreta
ClaveSecreta

addwf PCL,F
DT
DT

4h,5h,6h,1h
7h,8h

; Ejemplo de clave secreta.

FinClaveSecreta
;****************************************** Subrutina "Motor_PAP" *****************************************************
codigos_PAP

addwf PCL,F
DT

09h,08h,0Ch,04h,06h,02h,03h,01h

; Secuencia de cdigos para hacer


; funcionar el Motor PAP a medio paso.

;*********************************************** Libreras ****************************************************************


INCLUDE
INCLUDE
INCLUDE
INCLUDE
END

<TECLADO.INC>
<LCD_4BIT.INC>
<LCD_MENS.INC>
<RETARDOS.INC>
; Fin del programa.

178

11.- Entrenador Bsico 8

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>

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


ESCLAVO1 EQU B'01000001' ; Escribimos la direccin del Esclavo1 receptor.
ESCLAVO2 EQU B'01001000' ; Escribimos la direccin del Esclavo2 transmisor.
;**************************** Registros **********************************************************************************
CBLOCK 0X20
GUARDAR_DATO
ENDC
;********************************* Seccin Cdigo de Reset ***********************************************************
ORG

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;******************************************* Seccin de Configuracin *************************************************


ORG 0X05
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin)

CALL Config_transmisin_I2C ; Configuracion Bus_I2C

;**************************************************** Principal **********************************************************


RECIBIR

CALL Bit_start_I2C

; Llamar a la subrutina de Comienzo.

MOVLW ESCLAVO1

; Seleccionar esclavo de recepcin. ( 0100,A2,A1,A0,1 )

179

CALL Transmitir_dato_I2C

;
;
;
;

CALL Recibir_dato_I2C
MOVWF GUARDAR_DATO

; Llamar a la subrutina de recepcin de datos.


; Guardar dato recibido en el registro GUARDAR_DATO.

CALL ReStart_I2C

; Llamar a la subrutina de comenzar sin pasar por parada.

TRANSMITIR MOVLW ESCLAVO2


CALL Transmitir_dato_I2C

COMF GUARDAR_DATO,W

(0100) identifica al C.I. PCF8476.


(A2,A1,A0)=(000) por hardware.
El ultimo BIT a 1 para poner el C.I. PCF8476 como
receptor.

; Seleccionar esclavo de transmisin. ( 0100,A2,A1,A0,0 )


;
(0100) identifica al C.I. PCF8476.
;
(A2,A1,A0)=(100) por hardware.
;
El ultimo BIT a 0 para poner el C.I. PCF8476 como
;
transmisor.

CALL Transmitir_dato_I2C

; Complementar el contenido del registro GUARDAR_DATO


; y guardarlo en W.
; Llamar a la subrutina de transmisin de datos.

CALL Bit_stop_I2C

; Llamar a la subrutina de parada.

GOTO RECIBIR

; Repetir proceso.

;*************************************************** LIBRERIAS *********************************************************


INCLUDE <I2C.INC>

; Librera de control de bus I2C.

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>

;Este fichero contiene los nombres y direcciones de los


; registros de funciones especiales.
; Este fichero esta localizado en el directorio
; con el nombre MPASM.

180

;************************************** Igualdades ***********************************************************************


ESCLAVO1 EQU B'01000001' ; Escribimos la direccin del Esclavo1 receptor.
ESCLAVO2 EQU B'01001000' ; Escribimos la direccin del Esclavo2 transmisor.
;**************************** Registros **********************************************************************************
CBLOCK 0X20
GUARDAR_DATO
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

GOTO COMIENZO

;Direccin del Vector Reset


;Comienzo del Programa

;**************************************** Vector de Interrupcin ********************************************************


ORG

0X04

GOTO INTERRUP

; Ir a la rutina de Interrupcin.

;********************************************** Seccin de Configuracion **********************************************


ORG 0X05
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin)

CALL Config_transmisin_I2C ; Configuracion Bus_I2C


BSF STATUS,RP0

; Ir al Banco 1.

BCF OPTION_REG,INTEDG
BCF OPTION_REG,7
BSF INTCON,INTF
BSF INTCON,INTE
BSF INTCON,GIE

; Interrupcin por flanco descendente.


; Activamos las resistencias PULL-UP del PORTB
; Ponemos a 1 la Bandera de Interrupcin de las Patilla INT.
; Permitimos la interrupcin INT.
; Activamos todas las interrupciones.

BCF STATUS,RP0

; Ir al Banco 0.

;**************************************************** Principal **********************************************************


SLEEP
Goto

; Entra el microcontrolador en modo sueo.


$-1

;********************************************** Rutina de Interrupcin **************************************************


INTERRUP

CALL Bit_start_I2C

; Llamar a la subrutina de Comienzo.

MOVLW ESCLAVO1
CALL Transmitir_dato_I2C

; Seleccionar esclavo de recepcin. ( 0100,A2,A1,A0,1 )


;
(0100) identifica al C.I. PCF8476.
;
(A2,A1,A0)=(000) por hardware.
;
El ultimo BIT a 1 para poner el C.I. PCF8476 como

CALL Recibir_dato_I2C
MOVWF GUARDAR_DATO

; Llamar a la subrutina de recepcin de datos.


; Guardar dato recibido en el registro GUARDAR_DATO.

receptor.

181

CALL ReStart_I2C
TRANSMITIR MOVLW ESCLAVO2
CALL Transmitir_dato_I2C

COMF GUARDAR_DATO,W

; Llamar a la subrutina de comenzar sin pasar por parada.


; Seleccionar esclavo de transmisin. ( 0100,A2,A1,A0,0 )
;
(0100) identifica al C.I. PCF8476.
;
(A2,A1,A0)=(100) por hardware.
;
El ultimo BIT a 0 para poner el C.I. PCF8476 como
;
transmisor.

CALL Transmitir_dato_I2C

; Complementar el contenido del registro GUARDAR_DATO


;y guardarlo en W.
; Llamar a la subrutina de transmisin de datos.

CALL Bit_stop_I2C

; Llamar a la subrutina de parada.

BCF INTCON,INTF

; Ponemos a 0 la Bandera de Interrupcin de la Patilla INT.

RETFIE
;*************************************************** LIBRERIAS *********************************************************
INCLUDE <I2C.INC>

; Librera de control de bus I2C.

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>

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


ESCLAVO1 EQU B'01000000' ; Escribimos la direccin del Esclavo1 transmisor.
ESCLAVO2 EQU B'01001000' ; Escribimos la direccin del Esclavo2 transmisor.
;**************************** Registros **********************************************************************************

182

CBLOCK 0X20
GUARDAR_DATO
ENDC
;************************************* Seccin Cdigo de Reset *******************************************************
ORG

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;************************************* Seccin de Configuracion *******************************************************


ORG 0X05
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin).

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 Config_transmision_I2C ; Configuracion Bus_I2C


;**************************************************** Principal **********************************************************
SEG2

CALL Retardo_100ms

; Esperar un tiempo de adquisicin de 100 mS.

BSF ADCON0,GO_DONE
BTFSC ADCON0,GO_DONE
GOTO SEG1

; Lanzar el Conversor Analogico/Digital.

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

; Llamar a la subrutina de Comienzo.

MOVLW ESCLAVO2
CALL Transmitir_dato_I2C

; Seleccionar esclavo de transmisin. ( 0100,A2,A1,A0,0 )


;
(0100) identifica al C.I. PCF8476.
;
(A2,A1,A0)=(100) por hardware.
;
El ultimo BIT a 0 para poner el C.I. PCF8476 como
;
transmisor.

MOVF GUARDAR_DATO,W
CALL Transmitir_dato_I2C

; Guardar el contenido del registro GUARDAR_DATO en W.


; Llamar a la subrutina de transmisin de datos.

CALL Bit_stop_I2C

; Llamar a la subrutina de parada.

CALL Bit_start_I2C

; Llamar a la subrutina de Comienzo.

MOVLW ESCLAVO1
CALL Transmitir_dato_I2C

; Seleccionar esclavo de transmisin. ( 0100,A2,A1,A0,0 )


;
(0100) identifica al C.I. PCF8476.
;
(A2,A1,A0)=(000) por hardware.

183

;
;
COMF GUARDAR_DATO,W

El ultimo BIT a 0 para poner el C.I. PCF8476 como


transmisor.

CALL Transmitir_dato_I2C

; Complementar el contenido del registro GUARDAR_DATO


; y guardarlo en W.
; Llamar a la subrutina de transmisin de datos.

CALL Bit_stop_I2C

; Llamar a la subrutina de parada.

GOTO SEG2
;************************************************** LIBRERIAS **********************************************************
INCLUDE <I2C.INC>
INCLUDE <Retardos.INC>
END

184

12.- Entrenador Bsico 8-1

186

( Entrenador Bsico 8-1 )

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>

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


ESCLAVO1
ESCLAVO2
ESCLAVO3
ESCLAVO4

EQU
EQU
EQU
EQU

B'01000001'
B'01000011'
B'01001000'
B'01001100'

; Escribimos la direccin del Esclavo1 receptor.


; Escribimos la direccin del Esclavo2 receptor.
; Escribimos la direccin del Esclavo3 transmisor.
; Escribimos la direccin del Esclavo4 transmisor.

;**************************** Registros *********************************************************************************


CBLOCK 0X20
GUARDAR_DATO
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG

0X00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Seccin de Configuracion ****************************************************************


ORG 0X05
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin).

CALL Config_transmisin_I2C ; Configuracion Bus_I2C


BSF STATUS,RP0
BSF TRISB,0
BCF STATUS,RP0

; Ir al Banco 1
; Poner PB0 como entrada de datos.
; Ir al Banco 0

;**************************************************** Principal **********************************************************

187

SEG1

SEG2

BTFSC PORTB,0
GOTO SEG1

; Se pregunta si esta pulsado PB0.

CALL Bit_start_I2C

; Llamar a la subrutina de Comienzo.

MOVLW ESCLAVO1
CALL Transmitir_dato_I2C

CALL Recibir_dato_I2C
MOVWF GUARDAR_DATO

; Seleccionar esclavo de recepcin. ( 0100,A2,A1,A0,1 )


;
(0100) identifica al C.I. PCF8476.
;
(A2,A1,A0)=(000) por hardware.
;
El ultimo BIT a 1 para poner el C.I. PCF8476 como
;
receptor.
; Llamar a la subrutina de recepcin de datos.
; Guardar dato recibido en el registro GUARDAR_DATO.

CALL ReStart_I2C

; Llamar a la subrutina de comenzar sin pasar por parada.

MOVLW ESCLAVO3
CALL Transmitir_dato_I2C

; Seleccionar esclavo de transmisin. ( 0100,A2,A1,A0,0 )


;
(0100) identifica al C.I. PCF8476.
;
(A2,A1,A0)=(100) por hardware.
;
El ultimo BIT a 0 para poner el C.I. PCF8476 como
;
transmisor.

MOVF GUARDAR_DATO,W
CALL Transmitir_dato_I2C

; Guardar el contenido del registro GUARDAR_DATO en W.


; Llamar a la subrutina de transmisin de datos.

CALL Bit_stop_I2C

; Llamar a la subrutina de parada.

CALL Bit_start_I2C

; Llamar a la subrutina de Comienzo.

MOVLW ESCLAVO2
CALL Transmitir_dato_I2C

CALL Recibir_dato_I2C
MOVWF GUARDAR_DATO

; Seleccionar esclavo de recepcin. ( 0100,A2,A1,A0,1 )


;
(0100) identifica al C.I. PCF8476.
;
(A2,A1,A0)=(001) por hardware.
;
El ultimo BIT a 1 para poner el C.I. PCF8476 como
;
receptor.
; Llamar a la subrutina de recepcin de datos.
; Guardar dato recibido en el registro GUARDAR_DATO.

CALL ReStart_I2C

; Llamar a la subrutina de comenzar sin pasar por parada.

MOVLW ESCLAVO4
CALL Transmitir_dato_I2C

; Seleccionar esclavo de transmisin. ( 0100,A2,A1,A0,0 )


;
(0100) identifica al C.I. PCF8476.
;
(A2,A1,A0)=(110) por hardware.
;
El ultimo bit a 0 para poner el C.I. PCF8476 como
;
transmisor.

MOVF GUARDAR_DATO,W
CALL Transmitir_dato_I2C

; Guardar el contenido del registro GUARDAR_DATO en W.


; Llamar a la subrutina de transmisin de datos.

CALL Bit_stop_I2C

; Llamar a la subrutina de parada.

BTFSS PORTB,0
GOTO SEG2
GOTO SEG1

; Si sigue pulsado PB0 no retornar.

;**************************************************** LIBRERIAS ********************************************************


INCLUDE <I2C.INC>

; Libreria de control de bus I2C.

END

12.2.- I2C5.asm

( Entrenador Bsico 8-1 )


188

title " Leer datos de circuitos integrados expansores de bus PCF8476


title " y transmitirlo a travs del bus I2C al microprocesador. "
title " Transferir los datos del microprocesador a otros C.I. PCF8476"
title " interrumpiendo un programa principal "
;******************************************** I2C5.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>

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


ESCLAVO1
ESCLAVO2
ESCLAVO3
ESCLAVO4

EQU
EQU
EQU
EQU

B'01000001'
B'01000011'
B'01001000'
B'01001100'

; Escribimos la direccin del Esclavo1 receptor.


; Escribimos la direccin del Esclavo2 receptor.
; Escribimos la direccin del Esclavo3 transmisor.
; Escribimos la direccin del Esclavo4 transmisor.

;**************************** Registros *********************************************************************************


CBLOCK 0X20
GUARDAR_DATO
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG

0X00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************************** Vector de Interrupcin ********************************************************


ORG

0X04

GOTO INTERRUP

; Ir a la Rutina de Interrupcin

;*************************************** Seccin de Configuracion *****************************************************


ORG 0X05
COMIENZO

; Inicio de Programa (Una posicin detrs del vector de Interrupcin

CALL Config_transmision_I2C ; Configuracion Bus_I2C

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

;**************************************************** Principal **********************************************************


SLEEP
Goto

; Poner el microcontrolador rn modo sueo.


$-1

;****************************************** Rutina de Interrupcin ******************************************************


INTERRUP

CALL Bit_start_I2C

; Llamar a la subrutina de Comienzo.

MOVLW ESCLAVO1
CALL Transmitir_dato_I2C

; Seleccionar esclavo de recepcin. ( 0100,A2,A1,A0,1 )


;
(0100) identifica al C.I. PCF8476.
;
(A2,A1,A0)=(000) por hardware.
;
El ultimo BIT a 1 para poner el C.I. PCF8476 como
;
receptor.

CALL Recibir_dato_I2C
MOVWF GUARDAR_DATO

; Llamar a la subrutina de recepcin de datos.


; Guardar dato recibido en el registro GUARDAR_DATO.

CALL ReStart_I2C

; Llamar a la subrutina de comenzar sin pasar por parada.

MOVLW ESCLAVO3
CALL Transmitir_dato_I2C

; Seleccionar esclavo de transmisin. ( 0100,A2,A1,A0,0 )


;
(0100) identifica al C.I. PCF8476.
;
(A2,A1,A0)=(100) por hardware.
;
El ultimo BIT a 0 para poner el C.I. PCF8476 como
;
transmisor.

MOVF GUARDAR_DATO,W
CALL Transmitir_dato_I2C

; Guardar el contenido del registro GUARDAR_DATO en W.


; Llamar a la subrutina de transmisin de datos.

CALL Bit_stop_I2C

; Llamar a la subrutina de parada.

CALL Bit_start_I2C

; Llamar a la subrutina de Comienzo.

MOVLW ESCLAVO2
CALL Transmitir_dato_I2C

; Seleccionar esclavo de recepcin. ( 0100,A2,A1,A0,1 )


;
(0100) identifica al C.I. PCF8476.
;
(A2,A1,A0)=(001) por hardware.
;
El ultimo BIT a 1 para poner el C.I. PCF8476 como
;
receptor.

CALL Recibir_dato_I2C
MOVWF GUARDAR_DATO

; Llamar a la subrutina de recepcin de datos.


; Guardar dato recibido en el registro GUARDAR_DATO.

CALL ReStart_I2C

; Llamar a la subrutina de comenzar sin pasar por parada.

MOVLW ESCLAVO4
CALL Transmitir_dato_I2C

; Seleccionar esclavo de transmisin. ( 0100,A2,A1,A0,0 )


;
(0100) identifica al C.I. PCF8476.
;
(A2,A1,A0)=(110) por hardware.
;
El ultimo BIT a 0 para poner el C.I. PCF8476 como

190

transmisor.

MOVF GUARDAR_DATO,W
CALL Transmitir_dato_I2C

; Guardar el contenido del registro GUARDAR_DATO en W.


; Llamar a la subrutina de transmisin de datos.

CALL Bit_stop_I2C

; Llamar a la subrutina de parada.

MOVF PORTB,W
BCF
INTCON,RBIF

; Necesario en proteus para limpiar flag.


; mientras permanece pulsado. Limpia flag.

RETFIE
;************************************************** LIBRERIAS *********************************************************
INCLUDE <I2C.INC>

; Librera de control de bus I2C.

END

191

13.- Entrenador Bsico 9

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>

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


Esclavo1_Escritura_sensor
Esclavo1_Lectura_sensor

EQU
EQU

b'10011110'
b'10011111'

;**************************** Registros *********************************************************************************


CBLOCK 0X20
Auxiliar
ENDC
;**************************** Seccion Codigo de Reset ****************************************************************
ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;*************************************** Seccion de Configuracion *****************************************************


ORG 0X05
COMIENZO

; Inicio de Programa (Una posicion detras del vector de Interrupcion

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

; Llamar a la subrutina de Comienzo de I2C.

Bit_start_I2C

movlw Esclavo1_Escritura_sensor
call Transmitir_dato_I2C

; Seleccionar PCF8591 Transmisor.


( 1001,A2,A1,A0,0 )
;(1001) identifica al C.I. PCF8591.
;(A2,A1,A0)=(111) por hardware.
;El ultimo bit a 0 para poner el C.I. PCF8591
como transmisor.

movlw b'00000000'
call
Transmitir_dato_I2C

; Carga la palabra de control utilizando la


; entrada AIN0 en modo simple.

call

; Llamar a la subrutina de comenzar sin pasar por parada.

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

; Seleccionar PCF8591 Receptor. (1001,A2,A1,A0,1)


;(1001) identifica al C.I. PCF8591.
;(A2,A1,A0)=(111) por hardware.
;El ultimo bit a 1 para poner el C.I. PCF8591 como
receptor.
; Llamar a la subrutina de recepcion de datos y leemos la
entrada analgica.
; La primera lectura es incorrecta y por lo tanto la desecha.
; Llamar a la subrutina de parada.
; Se sita al principio de la primera lnea.
; Visualiza el Mensaje1

;**************************************************** Principal **********************************************************


Principal

call Bit_start_I2C
movlw Esclavo1_Lectura_sensor
CALL Transmitir_dato_I2C

; Llamar a la subrutina de Comienzo de I2C.


; Seleccionar PCF8591 Receptor. (1001,A2,A1,A0,1)
;(1001) identifica al C.I. PCF8591.
;(A2,A1,A0)=(111) por hardware.
;El ultimo bit a 1 para poner el C.I. PCF8591
como receptor.

call

Recibir_dato_I2C

call

Bit_stop_I2C

; Llamar a la subrutina de recepcin de datos y leemos la


entrada analgica.
; Llamar a la subrutina de parada.

call

Visualiza

; LLamar a la subrutina Visualiza.

goto

Principal

;********************************************** Subrutinas "Visualiza" **************************************************


; Visualiza el valor que se le introduce por el registro de trabajo W en formato de tensin.
; Hay que tener en cuenta que el PCF8591 del esquema trabaja con una resolucin de
; LSB=10mV, el valor de entrada ser 10 veces menor que la tensin real expresada en
; milivoltios. As por ejemplo, si (W)=147 el valor de la tensin ser igual a:
; VAIN = LSB x Digital = 10 x 147 = 1470 mV = 1,47 V, que es lo que se debe visualizar
; en la pantalla.
; En conclusin:

194

;
;
;

- Las centenas del valor de entrada corresponden a las unidades de voltio.


- Las decenas del valor de entrada corresponden a las dcimas de voltio.
- Las unidades del valor de entrada corresponden a las centsimas de voltios.

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

DT " Ve = ", 0x00


DT " V ", 0x00
DT "Seal del Sensor", 0X00

;**************************************************** LIBRERIAS ********************************************************


INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE

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

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


PCF8591_DireccionEscritura

EQU

#DEFINE IncrementarPulsador

b'10010010'
PORTB,6

;**************************** Registros *********************************************************************************


CBLOCK 0X20
ENDC
;**************************** Seccion Codigo de Reset ****************************************************************
ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Vector de Interrupcion ********************************************************************


ORG 0x04
GOTO Interrup

;**************************** Libreria de Mensajes *********************************************************************

196

ORG 0X05

; Inicio de Programa (Una posicion detras del vector de Interrupcion)

Mensajes

addwf PCL,F

MensajeTension
MensajeVoltios

DT "Tension: ", 0x00


DT " V. ", 0x00

;*************************************** Seccion de Configuracion *****************************************************


COMIENZO

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

; Se configura como entrada.

call
call
call

CargaInicialContador
PCF8591_DAC
Visualiza

; Realiza la carga inicial del contador.


; Lo envia al DAC para su conversion.
; Y lo visualiza en la pantalla.

movlw b'10001000'
movwf INTCON

; Configuracion Bus_I2C

; Activa interrupcion por cambio en las


; lineas del Puerto B (RBIE) y la general (GIE).

;**************************************************** Principal **********************************************************


Principal

sleep
goto

; Pasa a modo de reposo.


Principal

;*********************************************Rutina de Interrupcion ****************************************************


; Incrementa el registro Contador cada vez que se presiona el pulsador "INCREMENTAR".
; Como el PCF8591 del esquema trabaja con una resolucion de LSB=10mV el valor del (Contador)
; sera 10 veces menor que la tension analogica deseada a la salida expresada en milivoltios.
; Asi por ejemplo, si (Contador)=147 el valor de la tension de salida sera igual a:
; VOUT = LSB x Digital = 10 x 147 = 1470 mV = 1,47 V.
Interrupcall

Retardo_20ms
btfsc IncrementarPulsador
goto
FinInterrupcion

IncrementarTensionDeseada

FinInterrupcion

; Espera a que se estabilicen los niveles de tension.


; Si es un rebote sale fuera.

call
call

IncrementaContador
PCF8591_DAC

call
call
btfss
goto
movf

Visualiza
Retardo_100ms
IncrementarPulsador
IncrementarTensionDeseada
PORTB,W

; Aumenta el valor del contador.


; Lo envia al DAC para su
conversion.
; Visualiza mientras espera que deje
; de pulsar durante este tiempo.
; Mientras permanezca pulsado
; incrementara el digito.

197

bcf
retfie

INTCON,RBIF

;**************************************** Subrutina "PCF8591_DAC" **************************************************


; Escribe en el PCF8591 con el dato del registro W para su conversion a tension analagica.
CBLOCK
PCF8591_Dato
ENDC

; Guarda el dato que tiene que enviar.

PCF8591_DAC movwf PCF8591_Dato

; Guarda el dato a enviar.

call
Bit_start_I2C
movlw PCF8591_DireccionEscritura
CALL Transmitir_dato_I2C

; Llamar a la subrutina de Comienzo de I2C.


; Apunta al dispositivo.

movlw b'01000000'
call
Transmitir_dato_I2C

; Carga la palabra de control activando la


; salida analogica.

movf
call

PCF8591_Dato,W
Transmitir_dato_I2C

movf
call
call

PCF8591_Dato,W
Transmitir_dato_I2C
Bit_stop_I2C

; Escribe el dato dos veces para que la


; conversion sea correcta tal como se indica
en el manual.
; los cronogramas del fabricante.

movf

PCF8591_Dato,W

; En (W) se recupera de nuevo el dato de entrada.

return
;************************** Subrutinas "IncrementaContador" y "CargaInicialContador" ****************************
CBLOCK
Contador
ENDC
ValorMinimo
ValorMaximo
SaltoIncremento

EQU
EQU

d'50'
d'250'
EQU d'25'

; El valor minimo de tension sera 0,5 V.


; El valor maximo de tension sera 2,5 V.
; El incremento se producira en saltos de 0,25 V.

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

; Incrementa el valor deseado.

CargaInicialContador
FinIncrementar

; Si se desborda realiza la carga inicial.


; Ha llegado a su valor maximo ?
; (W) <- ValorMaximo - (Contador).
; Si ValorMaximo<(Contador) C=0 y (W) negativo
; No, resulta ValorMaximo>=(Contador) y sale.
; Si, entonces inicializa el registro.
; En (W) el resultado.

;****************************************** Subrutinas "Visualiza" *****************************************************


; Visualiza el valor que se le introduce por el registro de trabajo W en formato de tension.
; Hay que tener en cuenta que el PCF8591 del esquema trabaja con una resolucion de LSB=10mV,
; el valor de entrada sera 10 veces menor que la tension real expresada en milivoltios.
; Asi por ejemplo, si (W)=147 el valor de la tension sera igual a: VOUT = LSB x Digital =

198

; = 10 x 147 = 1470 mV = 1,47 V, que es lo que se debe visualizar en la pantalla.


; En conclusion:
; - Las centenas del valor de entrada corresponden a las unidades de voltio.
; - Las decenas del valor de entrada corresponden a las decimas de voltio.
; - Las unidades del valor de entrada corresponden a las centesimas de voltios.
CBLOCK
Auxiliar
ENDC
Visualiza

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.

;**************************************************** LIBRERIAS ********************************************************


INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE

<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

list p=16f876, f=inhx32


;**************** Asignacion de nombres 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 ***********************************************************************


Esclavo1_Escritura_sensor
Esclavo1_Lectura_sensor

EQU
EQU

b'10011110'
b'10011111'

Esclavo2_Escritura

EQU

b'10010010'

;**************************** Registros *********************************************************************************


CBLOCK 0X20
Auxiliar
Dato_ADC
Dato_DAC
ENDC
;**************************** Seccion Codigo de Reset ****************************************************************
ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;*************************************** Seccion de Configuracion *****************************************************


ORG 0X05
COMIENZO

; Inicio de Programa (Una posicion detras del vector de Interrupcion

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

; Llamar a la subrutina de Comienzo de I2C.

Bit_start_I2C

movlw Esclavo1_Escritura_sensor
call Transmitir_dato_I2C

;Seleccionar PCF8591 Transmisor.


( 1001,A2,A1,A0,0 )
;(1001) identifica al C.I. PCF8591.
;(A2,A1,A0)=(111) por hardware.
;El ultimo bit a 0 para poner el C.I. PCF8591
como transmisor.

200

movlw b'00000000'
call
Transmitir_dato_I2C

; Carga la palabra de control utilizando la


; entrada AIN0 en modo simple.

call

; Llamar a la subrutina de comenzar sin pasar por parada.

ReStart_I2C

movlw Esclavo1_Lectura_sensor
call Transmitir_dato_I2C

; Seleccionar PCF8591 Receptor. (1001,A2,A1,A0,1)


; (1001) identifica al C.I. PCF8591.
; (A2,A1,A0)=(111) por hardware.
; El ultimo bit a 1 para poner el C.I. PCF8591 como
receptor.

call

Recibir_dato_I2C

; Llamar a la subrutina de recepcion de datos y leemos la


entrada analogica.
; La primera lectura es incorrecta y por lo tanto la desecha.

call

Bit_stop_I2C

; Llamar a la subrutina de parada.

call
LCD_Linea1
movlw Mensaje1
call
LCD_Mensaje

; Se situa al principio de la primera linea.


; Visualiza el Mensaje1

;**************************************************** Principal **********************************************************


Principal

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

; Llamar a la subrutina de Comienzo de I2C.


; Seleccionar PCF8591 Receptor. (1001,A2,A1,A0,1)
; (1001) identifica al C.I. PCF8591.
; (A2,A1,A0)=(111) por hardware.
; El ultimo bit a 1 para poner el C.I. PCF8591 como
receptor.

; Llamar a la subrutina de recepcion de datos y leemos la


entrada analogica.
; Llamar a la subrutina de parada.
; LLamar a la subrutina Visualiza.

;********************************************** Subrutinas "Visualiza" **************************************************


; Visualiza el valor que se le introduce por el registro de trabajo W en formato de tension.
; Hay que tener en cuenta que el PCF8591 del esquema trabaja con una resolucion de
; LSB=10mV, el valor de entrada sera 10 veces menor que la tension real expresada en
; milivoltios. Asi por ejemplo, si (W)=147 el valor de la tension sera igual a:
; VAIN = LSB x Digital = 10 x 147 = 1470 mV = 1,47 V, que es lo que se debe visualizar
; en la pantalla.
; En conclusion:
;
;
;

- Las centenas del valor de entrada corresponden a las unidades de voltio.


- Las decenas del valor de entrada corresponden a las dcimas de voltio.
- Las unidades del valor de entrada corresponden a las centsimas de voltios.

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

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

; Guarda el dato a enviar.

call
Bit_start_I2C
movlw Esclavo2_Escritura
CALL Transmitir_dato_I2C

; Llamar a la subrutina de Comienzo de I2C.


; Apunta al dispositivo.

movlw b'01000000'
call
Transmitir_dato_I2C

; Carga la palabra de control activando la


; salida analogica.

movf
call

Dato_DAC,W
Transmitir_dato_I2C

; Escribe el dato dos veces para que la


; conversion sea correcta tal como se indica

movf
call
call

Dato_DAC,W
Transmitir_dato_I2C
Bit_stop_I2C

; los cronogramas del fabricante.

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

title "Libreria de Transmision y recepcion de datos con I2C "


Config_transmision_I2C

BSF STATUS,RP0

; Seleciono la pagina 1 de la memoria

BSF TRISC,4
BSF TRISC,3
MOVLW 0X09
MOVWF SSPADD

; Cargas 09H en el registro SSPADD La velocidad de


Transmision sera de 100 KHz

BCF STATUS,RP0
BCF PIR1,SSPIF
BSF SSPCON,SSPM3

; Seleciono la pagina 0 de la memoria


; I2C en modo maestro con una
F de Tr. = Fosc/(4*(SSPADD+1))

BCF SSPCON,SSPM2
BCF SSPCON,SSPM1
BCF SSPCON,SSPM0
BSF SSPCON,SSPEN

; Permites la configuracion serie de los


pines SDA y SCL.

GOTO VOLVER
Bit_start_I2C

BSF STATUS,RP0
BSF SSPCON2,SEN

; Seleciono la pagina 1 de la memoria


; Lanzamos el bit de START.

BCF STATUS,RP0
BTFSS PIR1,SSPIF
GOTO $-1
BCF
PIR1,SSPIF

; Seleciono la pagina 0 de la memoria

GOTO VOLVER
Transmitir_dato_I2C

MOVWF SSPBUF

; Transmitimos el dato al Esclavo

BCF STATUS,RP0
BTFSS PIR1,SSPIF
GOTO $-1
BCF
PIR1,SSPIF

; Seleciono la pagina 0 de la memoria

BSF STATUS,RP0

; Seleciono la pagina 1 de la memoria

BTFSS SSPCON2,ACKSTAT ; Si el esclavo pone ACKSTAT = 0 la transmision es


correcta,
; Si no hay respuesta del esclavo enviamos STOP.
GOTO Trans_correcta
GOTO Bit_stop_I2C
Trans_correcta

BCF STATUS,RP0
GOTO VOLVER

Recibir_dato_I2C

BSF STATUS,RP0
BSF SSPCON2,RCEN

; Seleciono la pagina 0 de la memoria

; Seleciono la pagina 1 de la memoria


; Permito la Recepcion de datos

203

BCF STATUS,RP0

; Seleciono la pagina 0 de la memoria

BTFSS PIR1,SSPIF
GOTO $-1
BCF
PIR1,SSPIF
MOVF SSPBUF,W

; Dato recibido en el registro SSPBUF

BSF STATUS,RP0

; Seleciono la pagina 1 de la memoria

BSF SSPCON2,ACKDT
BSF SSPCON2,ACKEN

; Pone el maestro el bit de reconocimiento


de que ha llegado el Dato.
; Permito que el bit de reconocimiento este activo.

BCF STATUS,RP0

; Seleciono la pagina 0 de la memoria

BTFSS PIR1,SSPIF
GOTO $-1
BCF
PIR1,SSPIF
GOTO VOLVER
Bit_stop_I2C

BSF STATUS,RP0
BSF SSPCON2,PEN

; Seleciono la pagina 1 de la memoria

BCF STATUS,RP0

; Seleciono la pagina 0 de la memoria

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

title " Libreria de Transmision y recepcion de datos con I2C1 "


title " En la subrutina (Transmitir_dato_I2C) el Esclavo no confirma la transmision "
Config_transmision_I2C

BSF STATUS,RP0

; Seleciono la pagina 1 de la memoria

BSF TRISC,4
BSF TRISC,3
MOVLW 0X09
MOVWF SSPADD

; Cargas 09H en el registro SSPADD La velocidad de


Transmision sera de 100 KHz

BCF STATUS,RP0
BCF PIR1,SSPIF
BSF SSPCON,SSPM3

; Seleciono la pagina 0 de la memoria


; I2C en modo maestro con una
F de Tr. = Fosc/(4*(SSPADD+1))

BCF SSPCON,SSPM2
BCF SSPCON,SSPM1
BCF SSPCON,SSPM0
BSF SSPCON,SSPEN

; Permites la configuracion serie


de los pines SDA y SCL.

GOTO VOLVER
Bit_start_I2C

BSF STATUS,RP0
BSF SSPCON2,SEN

; Seleciono la pagina 1 de la memoria


; Lanzamos el bit de START.

BCF STATUS,RP0
BTFSS PIR1,SSPIF
GOTO $-1
BCF
PIR1,SSPIF

; Seleciono la pagina 0 de la memoria

GOTO VOLVER
Transmitir_dato_I2C

MOVWF SSPBUF

; Transmitimos el dato al Esclavo

BCF STATUS,RP0
BTFSS PIR1,SSPIF
GOTO $-1
BCF
PIR1,SSPIF

; Seleciono la pagina 0 de la memoria

GOTO VOLVER
Recibir_dato_I2C

BSF STATUS,RP0
BSF SSPCON2,RCEN

; Seleciono la pagina 1 de la memoria


;Permito la Recepcion de datos

BCF STATUS,RP0

; Seleciono la pagina 0 de la memoria

BTFSS PIR1,SSPIF
GOTO $-1
BCF
PIR1,SSPIF
MOVF SSPBUF,W

; Dato recibido en el registro SSPBUF

BSF STATUS,RP0

; Seleciono la pagina 1 de la memoria

205

BSF SSPCON2,ACKDT

; Pone el maestro el bit de reconocimiento de que ha

BSF SSPCON2,ACKEN

; Permito que el bit de reconocimiento este activo.

BCF STATUS,RP0

; Seleciono la pagina 0 de la memoria

llegado el Dato.

BTFSS PIR1,SSPIF
GOTO $-1
BCF
PIR1,SSPIF
GOTO VOLVER
Bit_stop_I2C

BSF STATUS,RP0
BSF SSPCON2,PEN

; Seleciono la pagina 1 de la memoria

BCF STATUS,RP0

; Seleciono la pagina 0 de la memoria

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

14.- Entrenador Bsico 10

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>

; Este fichero contiene los nombres y direcciones de los


; registros de funciones especiales.
; Este fichero esta localizado en el directorio
; con el nombre MPASM.

;**************************** Registros *********************************************************************************


CBLOCK

0x20

ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;*************************************** Seccin de Configuracin *****************************************************


ORG 0X05
COMIENZO

; Inicio de Programa (Una posicion detras del vector de Interrupcion)

BSF STATUS,RP0
MOVLW D'06'
MOVWF ADCON1
BCF STATUS,RP0
call
LCD_Inicializa
call
RS232_Inicializa

; Poner el Puerto A como seales digitales.

; Inicializa el LCD y las lneas que se


; van a utilizar en la comunicacin con el puerto
; serie RS232.

208

;**************************************************** Principal **********************************************************


Principal

call
call
goto

RS232_LeeDato
LCD_Caracter
Principal

; Espera recibir un caracter.


; Lo visualiza.
; Repite el proceso.

;*************************************************** LIBRERIAS *********************************************************


INCLUDE <RS232_RT.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>

; Subrutinas de control de la comunicacin con el


; puerto serie RS232 del ordenador.

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>

; Este fichero contiene los nombres y direcciones de los


; registros de funciones especiales.
; Este fichero esta localizado en el directorio
; con el nombre MPASM.

;**************************** Registros *********************************************************************************


CBLOCK

0x20

GuardaDato
ENDC

209

;************************* Seccin Cdigo de Reset *******************************************************************


ORG 0X00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;************************************* Seccin de Configuracin *******************************************************


ORG 0X05
COMIENZO

; Inicio de Programa (Una posicion detras del vector de Interrupcion)

BSF STATUS,RP0
MOVLW D'06'
MOVWF ADCON1
BCF STATUS,RP0
call
LCD_Inicializa
call
RS232_Inicializa

; Poner el Puerto A como seales digitales.

; Inicializa el LCD y las lneas que se


; van a utilizar en la comunicacin con el puerto
; serie RS232.

;**************************************************** Principal **********************************************************


Principal

call
RS232_LeeDato
movwf GuardaDato
call
LCD_Caracter

; Espera recibir un caracter.


; Guarda el dato recibido.
; Lo visualiza.

movf
call
goto

; Y ahora lo reenva otra vez al ordenador.

GuardaDato,W
RS232_EnviaDato
Principal

; Repite el proceso.

;*************************************************** LIBRERIAS *********************************************************


INCLUDE <RS232_RT.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
END

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

;*************** Asignacin de nombres 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 ********************************************************************************


RetornoCarro

EQU

d'13'

; Codigo de tecla "Enter" o "Retorno de Carro".

;**************************** Registros *********************************************************************************


CBLOCK

0x20

GuardaDato
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;*************************************** Seccin de Configuracin *****************************************************


ORG 0X05
COMIENZO

; Inicio de Programa (Una posicion detras del vector de Interrupcion)

BSF STATUS,RP0
MOVLW D'06'
MOVWF ADCON1
BCF STATUS,RP0
call
LCD_Inicializa
call
RS232_Inicializa

; Poner el Puerto A como seales digitales.

; Inicializa el LCD y las lneas que se


; van a utilizar en la comunicacin con el puerto
; serie RS232.

;**************************************************** Principal **********************************************************


Principal

call
RS232_LeeDato
movwf GuardaDato
call
LCD_Caracter

; Espera recibir un caracter.


; Guarda el dato recibido.
; Lo visualiza.

movf
call
movlw
call

GuardaDato,W
RS232_EnviaDato
RetornoCarro
RS232_EnviaDato

; Y ahora lo reenva otra vez al ordenador.

goto

Principal

; Ahora el cursor se sita al principio de la


; lnea siguiente en la pantalla del ordenador.

;**************************************************** LIBRERIAS ********************************************************


INCLUDE <RS232_RT.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
END

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>

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


RetornoCarro
CambioLinea

EQU
EQU

d'13'
d'10'

; Codigo la de tecla "Enter".


; Codigo para el "Cambio de linea".

;**************************** Registros *********************************************************************************


CBLOCK

0x20

GuardaDato
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;*************************************** Seccin de Configuracin *****************************************************


ORG 0X05
COMIENZO

; Inicio de Programa (Una posicion detras del vector de Interrupcion)

BSF STATUS,RP0
MOVLW D'06'
MOVWF ADCON1
BCF STATUS,RP0
call
LCD_Inicializa
call
RS232_Inicializa

; Poner el Puerto A como seales digitales.

212

;**************************************************** Principal **********************************************************


Principal

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

; Situar el Cursor en la Lina 2 del LCD.


; no lo visualiza en el LCD. En el monitor del
; ordenador se debe apreciar tambin un cambio
; de lnea.

GuardaDato,W
RS232_EnviaDato
Principal

; Y ahora lo reenva otra vez al ordenador.

;**************************************************** LIBRERIAS ********************************************************


INCLUDE <RS232_RT.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
END

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>

; Este fichero contiene los nombres y direcciones de los


; registros de funciones especiales.
; Este fichero esta localizado en el directorio
; con el nombre MPASM.

213

;**************************** Igualdades ********************************************************************************


RetornoCarro

EQU

d'13'

; Codigo de tecla "Enter" o "Retorno de Carro".

;**************************** Registros *********************************************************************************


CBLOCK

0x20

ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;*************************************** Seccin de Configuracin *****************************************************


ORG 0X05
COMIENZO

call
call

; Inicio de Programa (Una posicion detras del vector de Interrupcion)

LCD_Inicializa
RS232_Inicializa

; Inicializa el modulo LCD y las lneas que se van a


; utilizar en la comunicacin con el puerto serie RS232.

;**************************************************** Principal **********************************************************


Principal

movlw
call
call
goto

Mensaje0
RS232_Mensaje
Retardo_1s
Principal

; Carga la primera posicion del mensaje.


; Lo visualiza en el ordenador.

;********************************************* Subrutina de "Mensajes" ************************************************


Mensajes

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

;**************************************************** LIBRERIAS ********************************************************


INCLUDE
INCLUDE
INCLUDE
INCLUDE

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

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


RetornoCarro

EQU

d'13'

; Codigo de tecla "Enter" o "Retorno de Carro".

;**************************** Registros *********************************************************************************


CBLOCK

0x20

ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************************** Subrutina de "Mensajes" *****************************************************


ORG 0X05

; Inicio de Programa (Una posicion detras del vector de Interrupcion)

Mensajes

addwf PCL,F ; Los mensajes se ponen al principio para no


; superar la posicin 0xFF de memoria de programa.

Mensaje0

DT " Quieres trabajar en dos aos?."


DT RetornoCarro
DT "Quieres aprender hacer estos mensajes?",0x00

Mensaje1

DT " Pues estudia CICLOS FORMATIVOS!.",0x00

215

Mensaje2

DT "En el I.E.S. Joan Miro de San Sebastian de los Reyes"


DT RetornoCarro
DT " se puede estudiar el Ciclo Formativo "
DT RetornoCarro
DT " DESARROLLO de PRODUCTOS ELECTRONICOS.", 0x00

FinMensajes
IF (FinMensajes > 0xFF)
ERROR
MESSG

"ATENCION: La tabla ha superado el tamano de la pagina de los"


"primeros 255 bytes de memoria ROM. NO funcionara

correctamente."
ENDIF
;*************************************** Seccin de Configuracin *****************************************************
COMIENZO

call

RS232_Inicializa

; Inicializa las lineas que se van a


; utilizar en la comunicacin con el puerto serie RS232.

;**************************************************** Principal **********************************************************


Principal

movlw
call
movlw
call
movlw
call
goto

Mensaje0
VisualizaMensaje
Mensaje1
VisualizaMensaje
Mensaje2
VisualizaMensaje
Principal

; Carga la primera posicin del mensaje.


; Lo visualiza en el ordenador.
; El mismo procedimiento para las siguientes.

;***************************************** Subrutina "VisualizaMensaje" ***********************************************


VisualizaMensaje

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>

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


RetornoCarro

EQU

d'13'

; Codigo de tecla "Enter" o "Retorno de Carro".

;**************************** Registros *********************************************************************************


CBLOCK

0x20

ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00

;Direccin del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************************** Subrutina de "Mensajes" *****************************************************


ORG 0X05

; Inicio de Programa (Una posicion detras del vector de Interrupcion)

Mensajes

addwf PCL,F ; Los mensajes se ponen al principio para no


; superar la posicin 0xFF de memoria de programa.

Mensaje0

DT " Quieres trabajar en dos aos?."


DT RetornoCarro
DT "Quieres aprender hacer estos mensajes?",0x00

Mensaje1

DT " Pues estudia CICLOS FORMATIVOS!.",0x00

217

Mensaje2

DT "En el I.E.S. Joan Miro de San Sebastian de los Reyes"


DT RetornoCarro
DT " se puede estudiar el Ciclo Formativo "
DT RetornoCarro
DT " DESARROLLO de PRODUCTOS ELECTRONICOS.", 0x00

FinMensajes
IF (FinMensajes > 0xFF)
ERROR
MESSG

"ATENCION: La tabla ha superado el tamano de la pagina de los"


"primeros 255 bytes de memoria ROM. NO funcionara

correctamente."
ENDIF
;*************************************** Seccin de Configuracin *****************************************************
COMIENZO

call

RS232_Inicializa

call

RS232_LineasBlanco

; Inicializa las lineas que se van a


; utilizar en la comunicacin con el puerto serie RS232.
; Visualiza unas cuantas lneas en blanco.

;**************************************************** Principal **********************************************************


Principal

movlw
call
movlw
call
movlw
call
goto

Mensaje0
Visualiza_y_Espera
Mensaje1
Visualiza_y_Espera
Mensaje2
Visualiza_y_Espera
Principal

; Carga la primera posicion del mensaje.


; Lo visualiza en el ordenador y espera
; pulse "Enter".

;******************************************** Subrutina "Visualiza_y_Espera" *****************************************


Visualiza_y_Espera

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

; Lee el teclado del ordenador.


; Si no ha pulsado el "Enter" vuelve a
; leer de nuevo

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.

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

; 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

GuardaDato
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;*************************************** Seccin de Configuracin *****************************************************


ORG 0X05
COMIENZO

BSF STATUS,RP0
MOVLW D'06'
MOVWF ADCON1

; Poner el Puerto A como seales digitales.

219

BCF
call
call

STATUS,RP0
LCD_Inicializa
RS232_Inicializa

;**************************************************** Principal **********************************************************


Principal

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

; Espera recibir un caracter.


; Guarda el dato recibido.
; Despeja la pantalla del visualizador LCD.
; Recupera el dato leIdo.
; Visualiza el caracter de la tecla pulsada.
; Visualiza el guin.
; Visualiza en el LCD el codigo ASCII.
; Visualiza en el ordenador el guion.

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

; Envia un espacio en blanco para separarlo del


; anterior.
; Envia un espacio en blanco para separarlo del
; anterior

;**************************************************** LIBRERIAS ********************************************************


INCLUDE
INCLUDE
INCLUDE
INCLUDE

<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

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

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


RetornoCarro
CambioLinea

EQU
EQU

d'13'
d'10'

#DEFINE
#DEFINE
#DEFINE
#DEFINE

Entrada0
Entrada1
Entrada2
Entrada3

; Codigo de tecla "Enter" o "Retorno de Carro".


; Codigo para el cambio de linea.
PORTB,4
PORTB,5
PORTB,6
PORTB,7

; Define donde se situan las entradas.

;**************************** Registros *********************************************************************************


CBLOCK

0x20

ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Subrutina de "Mensajes" *****************************************************************


ORG 0X05
Mensajes

addwf PCL,F

; Los mensajes no deben sobrepasar las 256


; primeras posiciones de memoria de programa.

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

;*************************************** Seccin de Configuracin *****************************************************


COMIENZO

call
bsf

RS232_Inicializa
STATUS,RP0

bsf

Entrada0

; del Puerto B respetando la configuracion del

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.

;**************************************************** Principal **********************************************************


Principal

call
call
call
goto

RS232_LineasBlanco ; Para limpiar la pantalla.


LeeEntradasVisualiza ; Lee las entradas y las visualiza.
Retardo_1s
; Cada cierto tiempo.
Principal

;*************************************** Subrutina "LeeEntradasVisualiza" ********************************************


; Lee el estado de las entradas y las monitoriza en la pantalla del HyperTerminal.
LeeEntradasVisualiza call
RS232_LineasBlanco
movlw MensajeEntradas
call
RS232_Mensaje
LeeEntrada3

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

; Visualiza unas cuantas lineas en blanco.


; Nombre de las entradas.
; Lo visualiza en el HyperTerminal.

return
;*************************************** Subrutina "VisualizaAbierto" ************************************************
VisualizaAbierto

movlw MensajeAbierto
call
RS232_Mensaje

; Visualiza el mensaje "Abierto"


; en el HyperTerminal.

return

222

;*************************************** Subrutina "VisualizaCerrado" ************************************************


VisualizaCerrado

movlw MensajeCerrado
call
RS232_Mensaje

; Visualiza el mensaje "Cerrado"


; en el HyperTerminal.

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>

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


RetornoCarro
CambioLinea

EQU
EQU

d'13'
d'10'

#DEFINE
#DEFINE
#DEFINE
#DEFINE

Entrada0
Entrada1
Entrada2
Entrada3

; Codigo de tecla "Enter" o "Retorno de Carro".


; Codigo para el cambio de linea.
PORTB,4
PORTB,5
PORTB,6
PORTB,7

; Define donde se situan las entradas.

223

;**************************** Registros *********************************************************************************


CBLOCK

0x20

ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;*************************** Vector de Interrupcin *********************************************************************


ORG 0X04
GOTO LeeEntradasVisualiza
;**************************** Subrutina de "Mensajes" *****************************************************************
ORG 0X05
Mensajes

addwf PCL,F

; Los mensajes no deben sobrepasar las 256


; primeras posiciones de memoria de programa.

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

;*************************************** Seccin de Configuracin *****************************************************


COMIENZO

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

;**************************************************** Principal **********************************************************


Principal

sleep
goto

Principal

; Espera en modo de bajo consumo que se


; modifique una entrada.

;************************************* Rutina de Servicio a la Interrupcin" *******************************************

224

; Lee el estado de las entradas y las monitoriza en la pantalla del HyperTerminal.


LeeEntradasVisualiza call
RS232_LineasBlanco
movlw MensajeEntradas
call
RS232_Mensaje
LeeEntrada3

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

; Nombre de las entradas.


; Lo visualiza en el ordenador.

; Limpia el flag de reconocimiento de la


; interrupcin.

retfie
;*************************************** Subrutina "VisualizaAbierto" ************************************************
VisualizaAbierto

movlw MensajeAbierto
call
RS232_Mensaje

; Visualiza el mensaje "Abierto"


; en el HyperTerminal.

return
;*************************************** Subrutina "VisualizaCerrado" ************************************************
VisualizaCerrado

movlw MensajeCerrado
call
RS232_Mensaje

; Visualiza el mensaje "Cerrado"


; en el HyperTerminal.

return
;************************************** Librerias ********************************************************************
INCLUDE <RS232_RT.INC>
INCLUDE <RS232MEN.INC>
INCLUDE <RETARDOS.INC>
END

14.11.- RTS23_11.asm

( Entrenador Bsico 10 )
225

title " SISTEMA DE GOBIERNO DESDE ORDENADOR: Desde el teclado de un "


title " ordenador se desea comandar el movimiento de una estructura mvil. "
;************************************************* RTS23_11.asm ******************************************************
; La estructura mvil, obedece a la siguiente tabla:
;
;
;
;
;
;
;

TECLA (Por ejemplo) MOVIMIENTO


------------------- ---------t
Adelante
b
Atras
a
Izquierda
l
Derecha
Espacio
Parada

; La pulsacin de cualquiera de estas teclas activa el estado de las salidas correspondiente


; RB3 (Adelante), RB2 (Atras), RB1 (Izquierda), RB0 (Derecha) y apaga el resto.
;
; El movimiento que se esta realizando aparece reflejado en un mensaje en el visualizador LCD
; del sistema y tambin en la pantalla del ordenador.
;
; El programa debe permitir modificar fcilmente en posteriores revisiones en el hardware de
; la salida. Es decir, para activar las salidas conviene utilizar el direccionamiento por bit
; en lugar de por byte (utilizar instrucciones "bsf" y "bcf", en lugar de "mov..").

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

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


#DEFINE
#DEFINE
#DEFINE
#DEFINE

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'

; Define donde se situan las salidas.

; Codigo de las teclas utilizadas.

226

TeclaParada

EQU

''

Espacio
Retorno_de_carro

EQU
EQU

D'32'
D'13'

; Codigo de la tecla espaciadora, (hay un espacio,


; tened cuidado al teclear el programa).

;**************************** Registros *********************************************************************************


CBLOCK 0x20
TeclaPulsada
MensajeApuntado
Reg_Blancos

; Va a guardar el contenido de la tecla pulsada.


; Va a guarda la direccion del mensaje apuntado.

ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Subrutina de "Mensajes" *****************************************************************


ORG 0X05
Mensajes

addwf PCL,F

MensajeParado

DT "Sistema PARADO", 0x00

MensajeAdelante

DT "Marcha ADELANTE", 0x00

MensajeAtras

DT "Marcha ATRAS", 0x00

MensajeIzquierda

DT "Hacia IZQUIERDA", 0x00

MensajeDerecha

DT "Hacia DERECHA", 0x00

Blanco

DT " ",0x00

;*************************************** Seccin de Configuracin *****************************************************


COMIENZO

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

; Poner el Puerto A como seales digitales.

; Configura como salidas las 4 lineas del


; del Puerto B respetando la configuracion del
; resto de las lineas.

; En principio todas las salidas deben estar apagadas.

;**************************************************** Principal **********************************************************

227

Principal

call
call
goto

RS232_LeeDato
TesteaTeclado
Principal

; Espera a recibir un caracter.

;******************************************* Subrutina "TesteaTeclado" ************************************************


; Testea el teclado y acta en consecuencia.
TesteaTeclado movwf
xorlw
btfsc
goto

TeclaPulsada
TeclaAdelante
STATUS,Z
Adelante

; Guarda el contenido de la tecla pulsada.


; Es la tecla del movimiento hacia adelante?

movf
xorlw
btfsc
goto

TeclaPulsada,W
TeclaAtras
STATUS,Z
Atras

; Recupera el contenido de la tecla pulsada.


; Es la tecla del movimiento hacia atrs?

movf
xorlw
btfsc
goto

TeclaPulsada,W
TeclaIzquierda
STATUS,Z
Izquierda

; Recupera el contenido de la tecla pulsada.


; Es la tecla del movimiento hacia la izquierda?

movf
xorlw
btfsc
goto

TeclaPulsada,W
TeclaDerecha
STATUS,Z
Derecha

; Recupera el contenido de la tecla pulsada.


; Es tecla del movimiento hacia la derecha?

movf
xorlw
btfss
goto

TeclaPulsada,W
TeclaParada
STATUS,Z
Fin

; Recupera el contenido de la tecla pulsada.


; Es la tecla de parada?.

Parado

bcf
bcf
bcf
bcf
movlw
goto

SalidaAdelante
SalidaAtras
SalidaIzquierda
SalidaDerecha
MensajeParado
Visualiza

; Como se ha pulsado la tecla de parada se


; desactivan todas las salidas.

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

; Si, se desea movimiento hacia adelante.

; Si, se desea movimiento hacia atras.

; Si, se desea movimiento hacia la izquierda.

; Si, se desea movimiento hacia la derecha.

; No es ninguna tecla de movimiento y sale.

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

; Guarda la posicion del mensaje.


; Borra la pantalla del modulo LCD.
; Visualiza el mensaje en la pantalla
; del visualizador LCD.
; Introducimos Espacios en Blanco.

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

;************************************** Libreras ********************************************************************


INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE

<RS232_RT.INC>
<RS232MEN.INC>
<LCD_4BIT.INC>
<LCD_MENS.INC>
<RETARDOS.INC>

END

14.12.- RS232_RT.INC

( Entrenador Bsico 10 )

title " Librera de transmisin-recepcin serie asncrona segn normas RS-232."

;******************************************** Librera "RS232_RT.INC" ************************************************


; Utiliza las patillas propias del PIC 16f 876a para la transmisin/recepcin serie que son:
; RC6/TX/CK y RC7/RX/DT
; Los parmetros adoptados para la comunicacin son los siguientes:
; - Velocidad de transmisin de 1200 baudios.
; - Un bit de inicio o Start a nivel bajo.
; - Dato de 8 bits.

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

; Trabajar con velocidad alta de recepcin,


Baud Rate = Fosc/64(X+1)

MOVLW D'12'
MOVWF SPBRG

; Cargar la Velocidad de transmisin de Datos.


; Baud Rate = Fosc/64(X+1)=
1MHz/64(12+1)=1200 Bit/Segundo.

BSF TXSTA,TXEN
BCF TXSTA,SYNC

; Habilitamos la Transmision serie.


; Habilitamos modo asncrono.

BCF STATUS,RP0

; Banco 0

BSF RCSTA,SPEN

; Activamos la Puerta Serie


; (Configuramos las patillas RC7/RX/DT y RC6/TX/CK
como serie).

BSF RCSTA,CREN

; Permitimos las recepciones mltiples

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:

En (W) el dato a enviar.

RS232_EnviaNumero ADDLW
RS232_EnviaDato
No_transmision

'0'

MOVWF TXREG
BSF STATUS,RP0
BTFSS TXSTA,TRMT
GOTO No_transmision
BCF STATUS,RP0

; Envia el codigo ASCII de un numero.


; Lo pasa a cdigo ASCII sumndole el ASCII del 0.
; Comienzo de la transmision de datos en Serie.
;Preguntamos si se ha transmitido el dato.

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

; Preguntamos si ha llegado el dato.

BCF PIR1,RCIF

;Borrar flag de recepcion.

;Cargamos el dato del registro RCREG en el registro

DATO.
RETURN

14.13.- RS232MEN.INC

( Entrenador Bsico 10 )
230

title " Librera de transmisin de mensajes desde el microcontrolador hacia el "


title " ordenador a travs del puerto serie RS232. "

;******************************************** Librera "RS232MEN.INC" *****************:*****************************


;****************************************** Subrutina "RS232_Mensaje" **********************************************
; enva por el puerto serie el mensaje apuntado por el registro W y grabado en memoria
; de programa del PIC. El mensaje se visualizara en el monitor del ordenador. Esta
; subrutina sigue la estructura de funcionamiento similar a la ya conocida "LCD_Mensaje"
; para visualizacin de mensajes en pantallas de mdulos LCD.
CBLOCK
RS232_ApuntaCaracter
RS232_ValorCaracter

; Apunta al caracter a visualizar.


; Valor ASCII del caracter a visualizar.

ENDC
RS232_Mensaje

movwf RS232_ApuntaCaracter
movlw Mensajes
subwf RS232_ApuntaCaracter,F

decf

RS232_ApuntaCaracter,F

RS232_VisualizaOtroCaracter movf
call

; Posicion del primer caracter del mensaje.


; Halla la posicion relativa del primer
; caracter del mensaje respecto del
; comienzo de todos los mensajes
; (identificados mediante la etiqueta
; "Mensajes").
; Para compensar la posicion que ocupa la
; instruccin "addwf PCL,F".

RS232_ApuntaCaracter,W
Mensajes

movwf RS232_ValorCaracter
movf RS232_ValorCaracter,F
btfsc
goto
RS232_NoUltimoCaracter
RS232_FinMensaje

STATUS,Z
RS232_FinMensaje

; Apunta al caracter a visualizar.


; Obtiene el codigo ASCII del
; carcter apuntado.
; Guarda el valor de carcter.
; Lo unico que hace es posicionar
; flag Z. En caso que sea "0x00",
; que es codigo indicador final
; de mensaje, sale fuera.

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

;**************************************** Subrutina "RS232_LineasBlanco" *******************************************


; Visualiza unas cuantas lneas en blanco en el monitor del ordenador.
CBLOCK
RS232_ContadorLineas
ENDC
RS232_LineasBlanco
R232_LineasBlancoLazo

movlw
movwf
movlw
call
decfsz

d'10'
RS232_ContadorLineas
d'10'
RS232_EnviaDato
RS232_ContadorLineas,F

; Por ejemplo este nmero de lineas


; en blanco.
; Codigo del salto de linea

231

goto
R232_LineasBlancoLazo
movlw d'13'
call
RS232_EnviaDato

; Codigo del retorno de carro.


; Finaliza con un retorno de carro.

return

232

15.- Entrenador Bsico 11

233

( Entrenador Bsico 11 )

15.1.- Int_T_01.asm

title " Onda cuadrada de 10 kHz aproximadamente, mediante la


interrupcin por desbordamiento del Timer 0 "
;************************************************** Int_T_01.asm *******************************************************
; Por la lnea 3 del puerto B se genera una onda cuadrada de 10 kHz, cada semiperiodo dura
; 50 us. Los tiempos de temporizacin se lograran mediante la interrupcin por desbordamiento
; del Timer 0. 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.
; 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>

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


TMR0_Carga50us
#DEFINE

EQU d'50'
Salida PORTB,2

;**************************** Registros *********************************************************************************


CBLOCK 0x0C
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Vector de interrupcin ********************************************************************


ORG 0x04
goto

Timer0_interrupcin

;*************************************** Seccin de Configuracin *****************************************************


ORG 0x05
COMIENZO

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

; Sin prescaler para TMR0 (se asigna al Watchdog).


; Acceso al Banco 0.
; Carga el TMR0.
; Autoriza interrupcion T0I y la general (GIE).

;**************************************************** Principal **********************************************************


Principal
goto

; No puede pasar a modo de bajo consumo


; porque detendria el Timer 0.

;********************************* Rutina de interrupcin "Timer0_interrupcin" *************************************


; Como el PIC trabaja a una frecuencia de 4 MHz el TMR0 evoluciona cada microsegundo. Para
; conseguir un retardo de 50 us con un prescaler de 1 el TMR0 tiene que contar 50 impulsos.
; Efectivamente: 1 us x 50 x 1 = 50 us.
Timer0_interrupcin

movlw
movwf
btfsc
goto

TMR0_Carga50us
TMR0
Salida
EstabaAlto

EstabaBajo

bsf
goto

Salida
FinInterrupcion

; Estaba bajo y lo pasa a alto.

EstabaAlto

bcf

Salida

; Estaba alto y lo pasa a bajo.

FinInterrupcion

bcf
retfie

INTCON,T0IF

; Repone flag del TMR0.

; Recarga el timer TMR0.


; Testea el anterior estado de la salida.

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

title " Onda cuadrada de 10 kHz exactos, mediante la interrupcin


por desbordamiento del Timer 0 "
;*********************************************** Int_T_02.asm **********************************************************
; Por la linea 3 del puerto B se genera una onda cuadrada de 10 kHz. Cada semiperiodo dura
; 50 us exactos. Los tiempos de temporizacin se lograran mediante la interrupcin del
; Timer 0. A la lnea de salida se puede conectar un altavoz que producir un pitido.
; El calculo de la carga del TMR0 se realiza teniendo en cuenta los tiempos que tardan en
; ejecutarse las instrucciones y saltos para conseguir tiempos exactos. Para calcular el valor
; de carga del TMR0 se ayuda del simulador del MPLAB y de la ventana de reloj Stopwatch.
; Programa para PIC 16F84a.
; Velocidad del Reloj:1 MHz.
; Reloj instruccin: 250 KHz = 4 uS.
; Perro Guardin deshabilitado.

235

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

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


TMR0_Carga50us
#DEFINE

EQU d'43'
Salida PORTB,3

;**************************** Registros *********************************************************************************


CBLOCK 0x0C
ENDC
;**************************** Seccin Cdigo de Reset ***************************************************************
ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Vector de interrupcin ********************************************************************


ORG 0x04
goto

Timer0_interrupcin

;*************************************** Seccin de Configuracin *****************************************************


ORG 0x05
COMIENZO

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).

;**************************************************** Principal **********************************************************


Principal
goto

; No puede pasar a modo de bajo consumo


; porque detendria el Timer 0.

236

;********************************* Rutina de interrupcin "Timer0_interrupcin" *************************************


; Como el PIC trabaja a una frecuencia de 4 MHz el TMR0 evoluciona cada microsegundo. Para
; conseguir un retardo de 50 microsegundos con un prescaler de 1 el TMR0 tiene que contar
; 43 impulsos. Efectivamente: 1us x 1 x 43 + tiempo de los saltos y otros = 50 us.
;
; Las instrucciones "nop" se ponen para ajustar el tiempo a 50 us exacto y lograr una onda
; cuadrada perfecta. El simulador del MPLAB comprueba unos tiempos para la onda cuadrada de
; 10 kHz exactos de 50 us para el nivel alto y otros 50 us para el bajo.
Timer0_interrupcin

nop
movlw
movwf
btfsc
goto

TMR0_Carga50us
TMR0
Salida
EstabaAlto

nop
bsf
goto

Salida
FinInterrupcion

; Estaba bajo y lo pasa a alto.

EstabaAlto

bcf

Salida

; Estaba alto y lo pasa a bajo.

FinInterrupcion bcf

INTCON,T0IF
retfie

EstabaBajo

; Recarga el TMR0.
; Testea el anterior estado de la salida.

; Repone flag del TMR0.


; Retorno de interrupcion

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>

; Este fichero contiene los nombres y direcciones de los


; registros de funciones especiales.
; Este fichero esta localizado en el directorio
; con el nombre MPASM.

237

;**************************** Igualdades ********************************************************************************


Carga500ms EQU
TMR0_Carga50ms
#DEFINE

d'10'
EQU
LED

d'195'
PORTB,1

;**************************** Registros *********************************************************************************


CBLOCK 0x0C
Registro50ms
ENDC

; Registro auxiliar para conseguir una temporizacion mayor.

;**************************** Seccin Cdigo de Reset ****************************************************************


ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Vector de interrupcin ********************************************************************


ORG 0x04
goto

Timer0_interrupcin

;*************************************** Seccin de Configuracin *****************************************************


ORG 0x05
COMIENZO

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.

; Activa interrupcion del TMR0 (TOIE) y la general.

;**************************************************** Principal **********************************************************


Principal
goto

; No se puede utilizar el modo bajo consumo


; porque el Timer se detiene.

;********************************* Rutina de interrupcin "Timer0_interrupcin" *************************************


; Como el PIC trabaja a una frecuencia de 4MHz, el TMR0 evoluciona cada microsegundo.
; El bucle central se hace en un tiempo de 50 ms. Para ello se utiliza un prescaler
; de 256 y el TMR0 tiene que contar 195 impulsos. Efectivamente:
; 195 x 256 = 49929 us = 50 ms aproximadamente.
; Para conseguir una temporizacin de 500 ms, habr que repetir 10 veces el lazo de 50 ms.
Timer0_interrupcin

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

; Testea el ultimo estado del LED.

EstabaApagado

bsf
goto

LED
FinInterrupcion

; Estaba apagado y lo enciende.

EstabaEncendido

bcf

LED

; Estaba encendido y lo apaga.

FinInterrupcion

bcf
retfie

INTCON,T0IF

; Repone flag del TMR0.

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

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


Carga500ms EQU
Carga800ms EQU
TMR0_Carga50ms
#DEFINE

d'10'
d'16'
EQU
LED

d'195'
PORTB,1

;**************************** Registros *********************************************************************************


CBLOCK 0x0C

239

Registro50ms

; Registro auxiliar para conseguir una temporizacion mayor.

ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Vector de interrupcin ********************************************************************


ORG 0x04
goto

Timer0_interrupcin

;*************************************** Seccin de Configuracin ****************************************************


ORG 0x05
COMIENZO

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.

; Autoriza interrupcion del TMR0 (T0IE) y la GIE.

;**************************************************** Principal **********************************************************


Principal
goto

; No puede pasar a modo bajo consumo porque


; el Timer 0 se detendria.

;********************************* Rutina de interrupcin "Timer0_interrupcin" *************************************


; Como el PIC trabaja a una frecuencia de 4 MHz el TMR0 evoluciona cada microsegundo.
; El bucle central se hace en un tiempo de 50 ms. Para ello se utiliza un prescaler
; de 256 y el TMR0 tiene que contar 195. Efectivamente 195 x 256 = 49929 us = 50 ms.
; Para conseguir una temporizacin de 500 ms habr que repetir 10 veces el lazo de 50 ms.
; Para conseguir una temporizacin de 800 ms habr que repetir 16 veces el lazo de 50 ms.
Timer0_interrupcin

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

; Estaba apagado y lo enciende.


; Repone el contador nuevamente para que este
; 800 ms encendido.

EstabaEncendido

bcf
LED
movlw Carga500ms

; Estaba encendido y lo apaga.


; Repone el contador nuevamente para que este
; 500 ms apagado.

240

CargaRegistro50ms

movwf Registro50ms

FinInterrupcion

bcf
retfie

INTCON,T0IF

; Repone flag del TMR0.


; Retorno de interrupcin.

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>

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


Carga500ms EQU
TMR0_Carga50ms
#DEFINE

d'10'
EQU
LED

d'195'
PORTB,1

;**************************** Registros *********************************************************************************


CBLOCK 0x0C
Registro50ms
Guarda_W
Guarda_STATUS

; Registro auxiliar para conseguir una temporizacion mayor.

ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

241

;**************************** Vector de interrupcin ********************************************************************


ORG 0x04
goto

Timer0_interrupcin

;*************************************** Seccin de Configuracin *****************************************************


ORG 0x05
COMIENZO

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

; Prescaler de 256 para el TMR0


; Carga el Timer 0.
; Nmero de veces a repetir la interrupcion.
; Activa interrupcion del TMR0 (TOIE) y la
; general (GIE).

;**************************************************** Principal **********************************************************


Principal

movlw MensajeLargo
call
LCD_MensajeMovimiento
goto
Principal

;********************************* Rutina de interrupcin "Timer0_interrupcin" *************************************


; La interrupcin se produce cada 50 ms aproximadamente. Para conseguir una temporizacin
; de 500 ms habr que repetir 10 veces el lazo de 50 ms.
; Como esta subrutina altera los valores del registro de trabajo W y del STATUS
; habr que preservar su valor previo y restaurarlos al final.
Timer0_interrupcin

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.

; Para asegurarse de que trabaja con el banco 0.


; Recarga el TMR0.
; Decrementa el contador.
; Repone el contador nuevamente.
; Pasa a conmutar el estado del LED.

; Restaura W como estaba antes de producirse


; la interrupcin.

242

bcf
retfie

INTCON,T0IF

;******************************************** Subrutina "Mensajes" ****************************************************


Mensajes

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>

; 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 ********************************************************************************
Carga500ms EQU
Carga300ms EQU
TMR0_Carga50ms

10
6
EQU

d'195'

; 500 ms, ya que 50ms x 10 = 500ms


; 300ms, ya que 50ms x 6 = 300ms
; Para conseguir la interrupcion del
; Timer 0 cada 50 ms.

;**************************** Registros *********************************************************************************


CBLOCK 0x0C
Registro50ms

243

Intermitencia

; Si es cero se apaga en intermitencia. Para


; cualquier otro valor se enciende.

ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Vector de interrupcin ********************************************************************


ORG 0x04
goto

Timer0_interrupcin

;*************************************** Seccin de Configuracin *****************************************************


ORG 0x05
COMIENZO

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

; Visualiza mensaje fijo en la primera


; linea.
; Prescaler de 256 para el TMR0.
; Carga el TMR0.

;**************************************************** Principal *********************************************************


Principal
goto

;********************************* Rutina de interrupcin "Timer0_interrupcin" *************************************


Timer0_interrupcin

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

;*********************************************** Subrutina "Visualiza" **************************************************


; Visualiza, o no, un mensaje en funcin del contenido del registro Intermitencia.
Visualiza

call
btfss
goto
movlw
call

LCD_Linea2
Intermitencia,0
ApagaMensaje
MensajeIntermitente
LCD_Mensaje

; Se situa en la segunda linea.


; Apaga o enciende el mensaje en intermitencia?
; Apaga el mensaje.
; Visualiza el mensaje intermitente.

244

movlw Carga500ms
movwf Registro50ms
goto
FinVisualiza

; Debe estar 500 ms encendido.

ApagaMensaje call
LCD_LineaEnBlanco
movlw Carga300ms
movwf Registro50ms
FinVisualiza

; Visualiza una linea en blanco.


; Debe estar 300 ms apagado.

return

;********************************************** Subrutina "Mensajes" ***************************************************


Mensajes

addwf PCL,F

MensajeFijo

DT "

MensajeIntermitente

DT " ELECTRONICA", 0x00

Estudia", 0x00

;******************************************** Libreras ***************************************************************


INCLUDE <RETARDOS.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <LCD_MENS.INC>
END

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

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

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


TMR0_Carga50us
NumeroFrec

EQU
EQU

d'42'
d'8'

#DEFINE Salida
#DEFINE Pulsador

PORTB,2
PORTB,7

; El semiperiodo patron va a ser de 50 us.


; Ocho posibles frecuencias: 10 kHz, 5 kHz, 2 kHz,
; 1 kHz, 500 Hz, 200 Hz, 100 Hz y 50 Hz.

;**************************** Registros *********************************************************************************


CBLOCK 0x0C
ApuntadorFrecuencia
Semiperiodo
ENDC
;**************************** Seccin Cdigo de Reset ***************************************************************
ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO
;Comienzo del Programa
;**************************** Vector de interrupcin ********************************************************************
ORG 0x04
goto

ServicioInterrupcion

;*********************************** Subrutina "CargaContador" *******************************************************


ORG 0x05
CargaContador addwf PCL,F
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

d'1'
d'2'
d'5'
d'10'
d'20'
d'50'
d'100'
d'200'

; Semiperiodo 1 x 50 = 50 us, frecuencia = 10 kHz.


; Semiperiodo 2 x 50 = 100 us, frecuencia = 5 kHz.
; Semiperiodo 5 x 50 = 250 us, frecuencia = 2 kHz.
; Semiperiodo 10 x 50 = 500 us, frecuencia = 1 kHz.
; Semiperiodo 20 x 50 = 1000 us, frecuencia = 500 Hz.
; Semiperiodo 50 x 50 = 2500 us, frecuencia = 200 Hz.
; Semiperiodo 100 x 50 = 5000 us, frecuencia = 100 Hz.
; Semiperiodo 200 x 50 = 10000 us, frecuencia = 50 Hz.

;************************************* Subrutina "CargaMensaje" *****************************************************


CargaMensaje addwf PCL,F

246

retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

Mensaje10kHz
Mensaje5kHz
Mensaje2kHz
Mensaje1kHz
Mensaje500Hz
Mensaje200Hz
Mensaje100Hz
Mensaje50Hz

;**************************************** Subrutina "Mensajes" *********************************************************


Mensajes

addwf PCL,F

MensajeFrecuencia
Mensaje10kHz
Mensaje5kHz
Mensaje2kHz
Mensaje1kHz
Mensaje500Hz
Mensaje200Hz
Mensaje100Hz
Mensaje50Hz

DT "Frec.: ", 0x00


DT "10 kHz. ", 0x00
DT "5 kHz. ", 0x00
DT "2 kHz. ", 0x00
DT "1 kHz. ", 0x00
DT "500 Hz. ", 0x00
DT "200 Hz. ", 0x00
DT "100 Hz. ", 0x00
DT "50 Hz. ", 0x00

;*************************************** Seccin de Configuracin *****************************************************


COMIENZO

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

; TMR0 sin prescaler.


; Visualiza la frecuencia inicial.
; Carga el TMR0.
; Activa interrupciones del TMR0, RBI y general.

;**************************************************** Principal *********************************************************


Principal

goto

Principal

;********************************* Rutina de interrupcin "ServicioInterrupcion" **************************************


ServicioInterrupcion

btfsc
call
btfsc
call
bcf
bcf

INTCON,T0IF
Timer0_interrupcin
INTCON,RBIF
Pulsador_Interrupcion
INTCON,T0IF
INTCON,RBIF

; Interrupcion por desbordamiento del TMR0?.


; Interrupcion por cambio en el Puerto B?.
; Repone flag del TMR0.
; Repone flag del RBI.

retfie

247

;**************************************** Subrutina "Pulsador_Interrupcion" *******************************************


; Subrutina de atencin a la interrupcin por cambio en la lnea RB7 donde se ha
; conectado un pulsador.
; Incrementa el registro (ApuntadorFrecuencia) desde b'00000000' (que corresponde a una
; frecuencia de 10 kHz) hasta b'00000111' (que corresponde a una frecuencia de 50 Hz), segn
; la tabla especificada en el enunciado del ejercicio.
Pulsador_Interrupcion

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

; Apunta a la siguiente frecuencia.


; Va a comprobar si ha llegado al
mximo.
; (W)=(ApuntadorFrecuencia)NumeroFrec
; Ha llegado a su maximo?
; Si llega al maximo lo inicializa.
; Va a cargar el valor del factor de
; multiplicacion del semiperiodo
; segun la tabla.
; Visualiza la frecuencia
seleccionada.

; ************************************** Subrutina "Timer0_interrupcin" *********************************************


CBLOCK
Timer0_ContadorA
ENDC
Timer0_interrupcin

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

; Estaba alto y lo pasa a bajo.

248

;******************************************** Libreras ***************************************************************


INCLUDE <LCD_MENS.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
END

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

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


MaximoPeriodo
MinimoPeriodo

EQU
EQU

d'200'
d'15'

#DEFINE Salida

PORTB,2

; Corresponden a una frecuencia entre 300 Hz y


; 4 kHz tal como se demuestra posteriormente.

;**************************** Registros *********************************************************************************


CBLOCK 0x0C
ApuntadorFrecuencia
SentidoFrecuencia

; (SentidoFrecuencia)=0 (frecuencia ascendente).


; (SentidoFrecuencia)=1 (frecuencia descendente).

Guarda_W
Guarda_STATUS
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************

249

ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Vector de interrupcin ********************************************************************


ORG 0x04
goto

Timer0_interrupcin

;*************************************** Seccin de Configuracin *****************************************************


ORG 0X05
COMIENZO

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

; Prescaler de 8 asignado al TMR0.


; Inicializa el sentido de la variacion de
; frecuencia ascendente en la sirena.
; Inicializa a la frecuencia minima.
; Carga en el Timer 0 con signo negativo.
; Activa interrupcion del TMR0 (TOIE).

;**************************************************** Principal *********************************************************


Principal

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

; Mantiene la frecuencia durante


este tiempo.
; Aumenta el periodo, disminuye la
frecuencia.
; Ha llegado a su maximo valor de
periodo?
; (W)=(ApuntadorFrecuencia)MaximoPeriodo
; C=0?,(W) negativo?,
(ApuntadorFrecuencia)< mximo.
; No. La siguiente pasada entra en
"FrecuenciaAscendente".
; Mantiene la frecuencia durante
este tiempo.
; Disminuye el periodo, aumenta la
frecuencia.
; Ha llegado a su minimo valor de
periodo?
; (W)=(ApuntadorFrecuencia)MinimoPeriodo
; C=1?,(W) positivo?,
(ApuntadorFrecuencia)>=Mnimo.
; No. La siguiente pasada entra en
"FrecuenciaDescendente".

250

;********************************* Rutina de interrupcin "Timer0_interrupcin" *************************************


; Con un prescaler de 8 el periodo variara segn el valor de ApuntadorFrecuencia entre:
;
;
;
;

- Para (ApuntadorFrecuencia)=15, frecuencia = 4 kHz.


(efectivamente 15 x 8 = 120 us de semiperiodo que son 4 kHz aproximadamente).
- Para (ApuntadorFrecuencia)=200, frecuencia = 300 Hz.
(efectivamente 200 x 8 = 1600 us de semiperiodo que son 300 Hz aproximadamente).

Timer0_interrupcin

movwf
swapf
movwf
bcf
movf
sublw

Guarda_W
STATUS,W
Guarda_STATUS
STATUS,RP0
ApuntadorFrecuencia,W
d'0'

; Guarda el valor de W y STATUS.

; Carga en el Timer 0 con signo


negativo.

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

; Restaura el valor de W y STATUS.

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

;************************************** Elegimos PIC ********************************************************************


LIST p=16F84A
;***************** Asignacin de nombres de Registros de Funciones especiales a direcciones *****************
INCLUDE <P16F84A.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 ********************************************************************************


MaximoPeriodo EQU
MinimoPeriodo EQU
#DEFINE
#DEFINE
#DEFINE
#DEFINE

d'200'
d'15'

; Corresponden a una frecuencia entre 300 Hz y


; 4 kHz tal como se demuestra posteriormente.

Salida
PORTB,2
EntradaActivar PORTB,7
EntradaApagarPORTB,6
AutorizaSirena Flags,0

;**************************** Registros *********************************************************************************


CBLOCK 0x0C
Flags
ApuntadorFrecuencia
SentidoFrecuencia

; (SentidoFrecuencia)=0 (frecuencia ascendente).


; (SentidoFrecuencia)=1 (frecuencia descendente).

Guarda_W
Guarda_STATUS
Guarda_R_ContA
Guarda_R_ContB
ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Vector de interrupcin ********************************************************************


ORG 0x04
goto

ServicioInterrupcion

;*************************************** Seccin de Configuracin *****************************************************


ORG 0X05
COMIENZO

call
bsf
bcf
bsf
bsf
movlw
movwf
bcf

LCD_Inicializa
STATUS,RP0
Salida
EntradaApagar
EntradaActivar
b'00000010'
OPTION_REG
STATUS,RP0

; Prescaler de 8 asignado al TMR0.

252

call
clrf
movlw
movwf
sublw
movwf
movlw
movwf

ApagarSirena
SentidoFrecuencia
MaximoPeriodo
ApuntadorFrecuencia
d'0'
TMR0
b'10101000'
INTCON

; En principio apaga la sirena.


; Inicializa el sentido de la variacion de
; frecuencia ascendente en la sirena.
; Inicializa a la frecuencia minima.
; Carga en el Timer 0 con signo negativo.
; Activa interrupcion del TMR0 (TOIE), por cambio
; lineas del Puerto B (RBIE) y la general (GIE)

; El programa principal se dedica exclusivamente a generar el sonido de la sirena con


; ayuda de la interrupcin del Timer 0 en caso de que esta activada.
;**************************************************** Principal *********************************************************
Principal
SirenaAutorizada
FrecuenciaDescendente

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

; Si no se autoriza sirena, va a modo


de bajo consumo
; Mantiene la frecuencia durante
este tiempo.
; Aumenta el periodo, disminuye la
frecuencia.
; Ha llegado a su maximo valor de
periodo?
; (W)=(ApuntadorFrecuencia)MaximoPeriodo.
; C=0?,(W) negativo?,
(ApuntadorFrecuencia)<mximo?
; No. La siguiente pasada entra en
"FrecuenciaAscendente".
; Mantiene la frecuencia durante
este tiempo.
; Disminuye el perodo, aumenta la
frecuencia.
; Ha llegado a su minimo valor de
periodo?
; (W)=(ApuntadorFrecuencia)MinimoPeriodo
; C=1?,(W) positivo?,
(ApuntadorFrecuencia)>=Mnimo.
; No. La siguiente pasada entra en
"FrecuenciaDescendente".

btfss

STATUS,C

incf

SentidoFrecuencia,F

goto

Fin

SirenaNoAutorizada

bcf
sleep

Salida

; Pone la salida en bajo.


; Detiene el Timer 0 y espera en
modo bajo consumo

Fin

goto

Principal

; una interrupcion del pulsador.

;********************************* Rutina de interrupcin "ServicioInterrupcion" **************************************


ServicioInterrupcion

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

; Garantiza que se trabaja en el Banco 0.


; Guarda los registros utilizados en esta
; subrutina y tambin en la principal.

btfsc
call
btfsc

INTCON,RBIF
RBI_Interrupcion
INTCON,T0IF

; Interrupcion por cambio en el Puerto B?

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

; Interrupcion por desbordamiento del


TMR0?
; No. Entonces ha sido el Timer 0.
; Restaura registros W y STATUS.

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

; Espera a que se estabilicen niveles.


; Esta presionado el pulsador de apagado?
; No, compueba el pulsador de activacion.
; La sirena se apaga en el programa principal.
; Visualiza el mensaje.
; Esta presionado el pulsador de activacion?.
; No hay activado pulsador alguno y sale.
; La sirena se activa en el programa principal.
; Visualiza el mensaje.

; Espera que desaparezcan las seales de entrada.

return
;********************************** Subrutina "Timer0_interrupcin" ***************************************************
; Con un prescaler de 8 el periodo variara segn el valor de ApuntadorFrecuencia entre:

254

;
;
;
;

- Para (ApuntadorFrecuencia)=15, frecuencia = 4 kHz.


(efectivamente 15 x 8 = 120 us de semiperiodo que son 4 kHz aproximadamente).
- Para (ApuntadorFrecuencia)=200, frecuencia = 300 Hz.
(efectivamente 200 x 8 = 1600 us de semiperiodo que son 300 Hz aproximadamente).

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

; Estaba alto y lo pasa a bajo.

;***************************************** Subrutina "Mensajes" ********************************************************


Mensajes

addwf PCL,F

MensajeApagado
MensajeActivada

DT " Sirena APAGADA", 0x00


DT " Ahora ACTIVADA", 0x00

;******************************************** Libreras ***************************************************************


INCLUDE <LCD_4BIT.INC>
INCLUDE <LCD_MENS.INC>
INCLUDE <RETARDOS.INC>
END

15.10.- Int_C_04.asm

( Entrenador Bsico 11 )

title " Control del Ciclo de Trabajo de un seal cuadrada "


;**************************************************** Int_C_04.asm *****************************************************
; Ejemplo de control del ciclo de trabajo.
; Por la lnea 2 del Puerto B se genera una onda cuadrada de frecuencia constante a 100 Hz y
; ciclo de trabajo variable desde 0% a 100%, es decir, el tiempo en alto varia entre 0 us (0%)
; y 10.000 us (100%).
; El valor del ciclo de trabajo cambia mediante activacin del pulsador conectado al pin
; 7 del Puerto B, de la siguiente forma:
;
;
;
;
;
;
;
;
;
;
;
;
;

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>

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


TMR0_Carga
IncrementoDC

EQU
EQU

d'89'
d'10'

#DEFINE Salida
#DEFINE Pulsador

PORTB,2
PORTB,7

; El semiperiodo patron va a ser de 100 us.


; Incremento de cada paso del ciclo de trabajo.

;**************************** Registros *********************************************************************************


CBLOCK 0x0C
CicloTrabajo
Timer0_ContadorA

; Ciclo de trabajo deseado.


; Contador auxiliar.

ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Vector de interrupcin ********************************************************************


ORG 0x04
goto

ServicioInterrupcion

;****************************************** Subrutina "Mensajes" *******************************************************


ORG 0X05
Mensajes

addwf PCL,F

Mensaje_DC
Mensaje_TantoPorCiento

DT "Duty Cycle: ", 0x00


DT "% ", 0x00

256

;*************************************** Seccin de Configuracin *****************************************************


COMIENZO

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

; TMR0 sin prescaler.

; Inicializa con un DC=0%, por tanto salida


; en bajo permanentemente.
; Habilita solo interrupcion RBI.

;**************************************************** Principal ***********************************************************


Principal

goto

Principal

;********************************* Rutina de interrupcin "ServicioInterrupcion" **************************************


ServicioInterrupcion

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

; Pone la salida siempre en bajo.


; Inicializa el ciclo de trabajo a 0%.

DC_100PorCiento

Salida
d'100'
CicloTrabajo
INTCON,T0IE

; Pone la salida siempre en alto.


; Esta al maximo, DC=100%.

InhabilitaInterrupcionTMR0

bsf
movlw
movwf
bcf

Visualiza

call

VisualizaCicloTrabajo

; Visualiza el ciclo de trabajo


seleccionado.

; Si no es la linea del pulsador sale.


; En principio habilita interrupciones
TMR0.
; Se le va a sumar al ciclo de trabajo
; (W)=(CicloTrabajo)+IncrementoDC
; Guarda resultado.
; Si DC ha llegado al 100% la salida
; pasa a alto permanentemente.
; Si pasa de 100, lo inicializa.

257

EsperaDejePulsar

btfss
goto

Pulsador
EsperaDejePulsar

Fin_PulsadorInterrupcion

movf
movwf
movlw
movwf
return

CicloTrabajo,W
Timer0_ContadorA
TMR0_Carga
TMR0

; Carga todos los contadores.

;************************************* Subrutina "Timer0_interrupcin" ************************************************


; Mantiene la salida en alto un tiempo igual a 100us x (CicloTrabajo)
; y en bajo un tiempo igual a 100us x (100-CicloTrabajo).
Timer0_interrupcin

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.

; Estaba bajo y lo pasa a alto.


; Repone el contador nuevamente
; con el tiempo en alto.

Fin_Timer0_interrupcin
Salida
CicloTrabajo,W
.100
Timer0_ContadorA

; Estaba alto y lo pasa a bajo.


; Repone el contador nuevamente
; con el tiempo en bajo.

;********************************* Subrutina "VisualizaCicloTrabajo" **************************************************


; Visualiza el ciclo de trabajo en el visualizador LCD. Se hace de manera tal que cuando
; haya que visualizar un numero mayor de 9, las decenas siempre se visualicen aunque sean
; cero. Y cuando sea menor de 99 las decenas no se visualicen si es cero.
VisualizaCicloTrabajo

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

; Visualiza las centenas.


; Vuelve a recuperar este valor.
; Lo pasa a BCD.
; Visualiza las decenas (aunque sea cero) y
; unidades.

258

VisualizaTantoPorCiento

movlw Mensaje_TantoPorCiento
call
LCD_Mensaje

; Y ahora el smbolo "%".

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 )

title "Reloj digital en tiempo real sin puesta en hora "


title " utilizando la interrupcin del Timer 0 "
;********************************************** Int_Re_01.asm **********************************************************
; Programa para un reloj digital en tiempo real sin puesta en hora. Visualiza en un formato:
; " 8:47:39" (Segunda lnea).
; Las temporizaciones necesarias del reloj se logran mediante interrupciones por desbordamiento
; del Timer 0 cada 50 ms. tambin actualiza un contador llamado MedioSegundo incrementado cada
; 500 ms y que ser utilizado en las intermitencias de posteriores programas.
; 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>

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


TMR0_Carga50ms

EQU

d'195'

; Para conseguir la interrupcion del


; Timer 0 cada 50 ms.

;**************************** Registros *********************************************************************************


CBLOCK 0x0C
Hora

; Guarda las horas.

259

Minuto
Segundo
MedioSegundo
Registro50ms

; Guarda los minutos.


; Guarda los segundos.
; Se incrementa cada medio segundo.
; Se incrementa cada 50ms.

ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Vector de interrupcin ********************************************************************


ORG 0x04
goto

Timer0_interrupcin

;*************************************** Seccin de Configuracin *****************************************************


ORG 0x05
COMIENZO

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).

;**************************************************** Principal ***********************************************************


; La seccin "Principal" es de mantenimiento. Solo espera las interrupciones.
; No se puede poner en modo de bajo consumo porque la instruccin "sleep" detiene el Timer 0.
Principal

goto

Principal

;********************************* Rutina de interrupcin "Timer0_interrupcin" *************************************


Timer0_interrupcin

btfsc
call

INTCON,T0IF
Reloj

FinInterrupcion bcf

INTCON,T0IF
retfie

; Si es una interrupcion procedente del


; desbordamiento del Timer 0, actualiza el reloj.
; correspondiente.

;************************************************ Subrutina "Reloj" *****************************************************


; Esta subrutina actualiza los contadores Horas, Minutos, Segundos, MedioSegundo 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 . Sumndole el retardo de 71 us y el pequeo tiempo de los saltos iniciales

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.

;******************************************* Subrutina "VisualizaReloj" *************************************************


; Visualiza el reloj en la segunda lnea en formato: " 8:47:39" (Segunda lnea).
VisualizaReloj

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

; Se coloca para centrar la visualizacion


; en la segunda linea.
; Va a visualizar las horas.
; Lo pasa a BCD.
; Visualiza rechazando el cero de las decenas.
; Envia ":" para separar datos.
; Visualiza minutos.
; Lo pasa a BCD.
; Envia ":" para separar datos.
; Visualiza segundos.
; Lo pasa a BCD.

;***************************************** Subrutina "IncrementaRegistro50ms" **************************************


; Incrementa el valor de la variable Registro50ms. Cuando llega a 10, lo cual supone
; medio segundo (50 ms x 10 = 500 ms), lo resetea y sale con el Carry a "1".
IncrementaRegistro50ms

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

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

; Incrementa los segundos.


; Ha superado valor mximo?. (W)=(Segundo)-60.
; C=0?, (W) negativo?, (Segundo)<60?
; Lo inicializa si ha superado su valor maximo.

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

; Incrementa los minutos.


; Ha superado su valor mximo?. (W)=(Minuto)-60.
; C=0?, (W) negativo?, (Minuto)<60?
; Lo inicializa si ha superado su valor maximo.

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

; Incrementa las horas.


; Ha superado su valor mximo?. (W)=(Hora)-24.
; C=0?, (W) negativo?, (Hora)<24?
; Lo inicializa si ha superado su valor mximo.

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",

; (por ejemplo "I.E.S. Joan Miro"


;
" 8:47:39"

(Primera lnea)
(Segunda Linea)
(Primera lnea)
(Segunda Lnea).

; Las temporizaciones necesarias del reloj se logran mediante el Timer 0 que


; produce una interrupcin cada 50 ms.
; La "PuestaEnHora" se logra mediante dos pulsadores: "MODO" e "INCREMENTAR".
; Su modo de operacin es:
;
;
;
;

1.
2.
3.

Pulsa MODO, las "Horas" se ponen intermitente y se ajustan mediante el


pulsador INCREMENTAR.
Pulsa MODO y pasa a ajustar los "Minutos" de forma similar.
Pulsa "MODO" y se acabo la "PuestaEnHora", pasando a visualizacin normal.

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

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


#DEFINE
#DEFINE
#DEFINE
#DEFINE
#DEFINE

ModoPulsador
IncrementarPulsador
F_AjusteHora
F_AjusteMinuto
F_Intermitencia

TMR0_Carga50ms

PORTB,7
PORTB,6
FlagsAjuste,1
FlagsAjuste,0
Intermitencia,0

; Los pulsadores se conectan a estos


; pines del Puerto B.
; Flags utilizados en la puesta en hora.

EQU

; Para conseguir la interrupcion del


; Timer 0 cada 50 ms.

d'195'

; Si es 0, apaga en intermitencia.

;**************************** Registros *********************************************************************************


CBLOCK 0x0C

263

Hora
Minuto
Segundo
MedioSegundo
Registro50ms
Intermitencia
FlagsAjuste

; Guarda las horas.


; Guarda los minutos.
; Guarda los segundos.
; Incrementa cada medio segundo.
; Incrementa cada 50 ms
; Para lograr la intermitencia.
; Guarda los flags para establecer los
; ajustes de hora y minuto.

ENDC
;**************************** Seccin Cdigo de Reset ****************************************************************
ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Vector de interrupcin ********************************************************************


ORG 0x04
goto

ServicioInterrupcion

;****************************************** Subrutina "Mensajes" *******************************************************


ORG 0X05
Mensajes

addwf PCL,F

MensajePublicitario

DT "I.E.S. Joan Miro", 0x00

;*************************************** Seccin de Configuracin *****************************************************


COMIENZO

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.

;**************************************************** Principal **********************************************************


; La seccin "Principal" es mantenimiento. Solo espera las interrupciones.
; No se puede poner en modo de bajo consumo porque la instruccin "sleep" detiene el Timer 0.
Principal

goto

Principal

264

;********************************* Rutina de interrupcin "ServicioInterrupcion" **************************************


; Detecta que ha producido la interrupcin y ejecuta la subrutina de atencin correspondiente.
ServicioInterrupcion

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

; Si es una interrupcion procedente del


; desbordamiento del Timer 0, actualiza el reloj.
; Si es una interrupcion RBI, lee los pulsadores.
; Esta presionado el pulsador de "MODO"?
; Si, pasa a poner en hora.
; Pulsado "INCREMENTAR"?.
; Si, pasa a incrementar el registro de tiempo
; correspondiente.

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

; Retardo de 71 microsegundos para


; ajustar a 50 milisegundos exactos.

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.

; Si esta en "ModoAjusteHora", o "ModoAjusteMinuto" conmuta el flag de intermitencia y


; salta a 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.

; Conmuta el flag F_Intermitencia cada 500 ms.


; Visualiza el reloj y sale.

265

ActualizaReloj

call

FinReloj

return

VisualizaReloj

; Visualiza el reloj.

;***************************************** Subrutina "VisualizaReloj" ***************************************************


; Visualiza el reloj en la segunda lnea en formato: " 8:47:39".
; Cuando se ajusta una variable, esta debe aparecer en intermitencia. Para ello, utiliza
; el flag F_Intermitencia que conmuta cada 500 ms en la subrutina Reloj.
VisualizaReloj

movlw
call
btfss
goto
btfss
goto

d'4'
LCD_PosicionLinea2
F_AjusteHora
EnciendeHoras
F_Intermitencia
ApagaHoras

; Para centrar visualizacion


; en la segunda linea.
; Esta en la puesta en hora?
; No. visualizacin normal.
; Si. Intermitencia si procede.
; Apaga las horas en la intermitencia.

EnciendeHoras

movf
call
call
goto

Hora,W
BIN_a_BCD
LCD_Byte
VisualizaMinutos

; Va a visualizar las horas.


; Lo pasa a BCD.
; Visualiza rechazando cero de las decenas.

ApagaHoras

call

LCD_DosEspaciosBlancos

VisualizaMinutos

movlw
call
btfss
goto
btfss
goto

':'
LCD_Caracter
F_AjusteMinuto
EnciendeMinutos
F_Intermitencia
ApagaMinutos

; Envia ":" para separar datos.

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

; Visualiza dos espacios en blanco.

; Esta en la puesta en hora?.

; Visualiza dos espacios en blanco.

; Enva ":" para separar datos.


; Visualiza segundos.
; Lo pasa a BCD.

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

; Espera se estabilicen niveles de tension.


; Si es un rebote sale fuera.
; Visualiza siempre mientras incrementa.

266

call
call
call
btfss
goto
FinIncrementar

Retardo_100ms
VisualizaReloj
Retardo_200ms
IncrementarPulsador
Incrementar

; Visualiza mientras espera que deje


; de pulsar.
; Mientras permanezca pulsado,
; incrementa el digito.

return

;************************************** Subrutina "IncrementaRegistro50ms" *****************************************


; Incrementa el valor de la variable Registro50ms. Cuando llega a 10, lo cual supone
; medio segundo (50 ms x 10 = 500 ms), lo resetea y sale con el Carry a "1".
IncrementaRegistro50ms

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

; Incrementa los segundos.


; Ha superado valor mximo?. (W)=(Segundo)-60.
; C=0?, (W) negativo?, (Segundo)<60?
; Lo inicializa si ha superado su valor maximo.

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

; Incrementa los minutos.


; Ha superado su valor mximo?. (W)=(Minuto)-60.
; C=0?, (W) negativo?, (Minuto)<60?
; Lo inicializa si ha superado su valor maximo.

return

267

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

; Incrementa las horas.


; Ha superado su valor mximo?. (W)=(Hora)-24.
; C=0?, (W) negativo?, (Hora)<24?
; Lo inicializa si ha superado su valor maximo.

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":

bit 1 de "FlagsAjuste", para ajustar las horas.


bit 0 de "FlagsAjuste", para ajustar los minutos.

; as pues el contenido del registro FlagAjuste identifica los siguientes ajustes:


;
;
;

- (FlagsAjuste)=00000010. Esta ajustando el registro Hora.


- (FlagsAjuste)=00000001. Esta ajustando el registro Minuto.
- (FlagsAjuste)=00000000. Esta en visualizacin normal del reloj en tiempo real.

; Pueden ocurrir tres casos:


;
;
;
;
;
;
;
;
;
;

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

; Espera a que se estabilicen niveles.


; Si es un rebote sale fuera.
; Al pulsar "MODO" se apaga la variable de
; tiempo que se va a ajustar.
; Si antes estaba en funcionamiento normal, ahora
; pasa a ajustar la hora.
; Si no pasa a ajustar la variable de tiempo

siguiente.
; Pasa a ajustar la hora.
; Inicializa contador de segundos y el resto.

268

AjustaSiguiente

FinPuestaEnHora

bcf
rrf

STATUS,C
FlagsAjuste,F

; Desplaza un "1" a la derecha del registro


; FlagsAjuste para ajustar secuencialmente
; cada uno de los registros de tiempo:
; hora y minuto.

call
btfss
goto

VisualizaReloj
ModoPulsador
FinPuestaEnHora

; Ahora espera deje de pulsar.

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 )

title " Temporizador digital de precisin "


;************************************************* INT_Temp.asm ******************************************************
; Programa de control para un temporizador digital de precisin. La programacin del tiempo
; de temporizacin se realiza mediante dos pulsadores: "AJUSTE" y "ON/INCREM". Funcionamiento:
; - En estado de reposo la salida del temporizador esta apagada y el pantalla aparece el
;
tiempo deseado para la prxima temporizacin.
; - Si se pulsa "ON/INCREM" comienza la temporizacin.
; - Cuando acaba la temporizacin pasa otra vez a reposo.
; - Si pulsa "AJUSTE" antes que haya acabado el tiempo de temporizacin acta como pulsador
;
de paro: interrumpe la temporizacin, apaga la carga y pasa al estado de reposo.
; Para ajustar la temporizacin al tiempo deseado.
; - Pulsa "AJUSTE" y ajusta el tiempo deseado mediante el pulsador "ON/INCREM".
; - Se vuelve a pulsar "AJUSTE" y pasa a modo de reposo.
; Al apagar el sistema debe conservar el tiempo de temporizacin deseado para la prxima vez
; que se encienda.
; 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

269

;**************** Asignacin de nombres de Registros de Funciones especiales a direcciones ******************


INCLUDE <P16F84A.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 0x0C
Tiempo deseado
Tiempo
FlagsModos

; El tiempo deseado de temporizacin.


; Tiempo que resta de temporizacin.
; Guarda los flags con los diferentes
; modos de funcionamiento.

ENDC
;**************************** Igualdades en zona EEPROM ***********************************************************
ORG

0x2100

DE

0x00

; Corresponde a la direccion 0 de la zona


; EEPROM de datos. Aqu se va a guardar el
; tiempo de temporizacin deseado.

#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

; Salida donde se conecta la carga.


; Salida donde se conecta el zumbador.
; Los pulsadores estan conectados a estas
; lineas del Puerto B.

;**************************** Seccin Cdigo de Reset ****************************************************************


ORG 0X00

;Direccion del Vector Reset

GOTO COMIENZO

;Comienzo del Programa

;**************************** Vector de interrupcin ********************************************************************


ORG 0x04
goto

ServicioInterrupcion

;**************************** Subrutina de "Mensajes" *****************************************************************


ORG 0X05
Mensajes

addwf PCL,F

Mensaje_ON

DT " En MARCHA", 0x00

Mensaje_Ajuste

DT "Tiempo deseado:", 0x00

Mensaje_OFF

DT "

PARADO", 0x00

270

;*************************************** Seccin de Configuracin *****************************************************


COMIENZO

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

; Prescaler de 256 asignado al TMR0 habilita


; resistencias de Pull-Up del Puerto B.
; Configurados como entradas.
; Configurados como salidas.
; Lee la posicion 0x00 de memoria EEPROM de
; datos donde se guarda el tiempo deseado de la
; ultima vez que se ajusto.
; Modo de funcionamiento inicial.
; Activa interrupciones RBI.

;**************************************************** Principal **********************************************************


Principal
goto
Principal
;******************************* Rutina de interrupcin "ServicioInterrupcion" ****************************************
; Detecta que ha producido la interrupcin y ejecuta la subrutina de atencin correspondiente.
ServicioInterrupcion

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

; Si es una interrupcion RBI lee los


pulsadores.
; Esta presionado el pulsador de
"AJUSTE"?.
; Si, pues salta a la subrutina
correspondiente.
; Pulsado "ON/INCREM"?.
; No, pues salta al final y sale.
; Espera que se estabilice el nivel de
tensin.
; Si es un rebote del pulsador "ON/INCREM"
sale fuera.
; Estaba en reposo cuando pulso
"ON/INCREM"?
; Si, pues comienza la temporizacion.
; Estaba ajustando tiempo?
; Si, pues pasa a incrementar el tiempo
deseado.
; Limpia los flags de reconocimiento.

;******************** Subrutinas "CambiarModo" y todas las de MODO de funcionamiento ***********************


;
; Subrutina de atencin a la interrupcin producida al presionar el pulsador "AJUSTE" que cambia
; el modo de funcionamiento.
; Hay identificados tres modos de funcionamiento que se diferencian mediante los tres flags:
; A) Modo "Temporizador_OFF" o estado inicial. A el se pasa en el estado inicial cada vez

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

- (FlagsModos)=b'00000001'. Est en el modo "Temporizador_OFF", en reposo.


- (FlagsModos)=b'00000010'. Est en el modo "Temporizador_Ajuste", ajustando tiempo deseado.
- (FlagsModos)=b'00000100'. Est en el modo "Temporizador_ON", activa la carga y temporizador.

; Al pulsar "AJUSTE" pueden darse tres casos:


;
;
;
;
;

- Si estaba en modo "Temporizador_OFF", pasa a modo "Temporizador_Ajuste".


- Si estaba en modo "Temporizador_Ajuste", pasa a modo "Temporizador_OFF", pero antes salva
el tiempo de temporizacin deseado en la EEPROM de datos.
- Si estaba en modo "Temporizador_ON", pasa a modo "Temporizador_OFF". (Interrumpe la
temporizacin).

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

; Cada vez que pulsa origina un pitido.


; Si es un rebote sale fuera.
; Esta en reposo?
; Si, pues pasa a ajustar la temporizacion.
; Esta ajustando?
; No, pues pasa a reposo.
; Si, pues antes de pasar a reposo salva en la
; posicion 00h de memoria EEPROM de datos el
; tiempo de temporizacion deseado. Se conserva
; aunque se apague la alimentacion.

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 y resetea tiempo deseado.


; Actualiza el registro FlagsModos pasando
; al modo inicial "Temporizador_OFF".
; Prohibe las interrupciones del TMR0.
; Repone otra vez el tiempo que se desea
; para la proxima temporizacion.
; Borra la pantalla.
; En pantalla el mensaje correspondiente.

; 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

; Espera deje de pulsar.

;********************************* Subrutina "Temporizador" ***********************************************************


; Esta subrutina va decrementando el tiempo de temporizacin y visualizndolo en la pantalla.
; Se ejecuta debido a la peticin de interrupcin del Timer 0 cada 50 ms exactos, comprobado
; experimentalmente con la ventana "Stopwatch" del simulador del MPLAB.
CBLOCK
Registro50ms

; Guarda los incrementos cada 50 ms.

ENDC
TMR0_Carga50ms
Carga_1s

EQU
EQU

d'195'
d'20'

; Para conseguir la interrupcion cada 50 ms.


; Leera cada segundo (20 x 50ms = 1000 ms).

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

; Ajuste fino de 71 microsegundos para


; ajustar a 50 milisegundos exactos.

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

;**************************************** Subrutina "VisualizaTiempo" *************************************************


; Visualiza el registro Tiempo en formato "Minutos:Segundos". as por ejemplo, si
; (Tiempo)=124 segundos en la segunda lnea de la pantalla visualiza " 2:04", ya que 124
; segundos es igual a 2 minutos mas 4 segundos.
VisualizaTiempo

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

;**************************************** Subrutina "MinutosSegundos" ***********************************************


; Una cantidad expresada exclusivamente en segundos y contenida en el registro W es
; convertida a minutos y segundos. El resultado se guarda en dos posiciones de memoria
; llamadas TemporizadorMinutos y TemporizadorSegundos.
; El mximo numero a convertir ser el 255 que es el mximo valor que puede adquirir el
; numero binario de entrada de 8 bits. (255 segundos = 4 minutos + 15 segundos)
; El procedimiento utilizado es mediante restas de 60 tal como se explica en el siguiente
; ejemplo que trata de la conversin del 124 segundos a minutos y segundos.
; 124 segundos = 2 minutos + 4 segundos.
; Minutos
Segundos
(Segundos)<60?
; ------------------------------------------------------------; 0
124
NO. Resta 60 a (Segundos) e incrementa (Minutos).
; 1
64
NO. Resta 60 e (Segundos) e incrementa (Minutos).
; 2
4
Si, se acabo.
;
; Entrada:
En el registro W el numero de segundos a convertir.
; Salidas:
En (TemporizadorMinutos) y (TemporizadorSegundos) el resultado.
CBLOCK
TemporizadorMinutos
TemporizadorSegundos
ENDC
;
MinutosSegundos
Resta60

movwf TemporizadorSegundos
clrf
TemporizadorMinutos

; Carga el numero de segundos a convertir.


; Carga los registros con el resultado inicial.

movlw d'60'
subwf TemporizadorSegundos,W

; Resta 60 en cada pasada.


; (W)=(TemporizadorSegundos)-60.

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.

;******************************* Subrutina "IncrementarTiempoDeseado" ********************************************


; Subrutina de atencin a la interrupcin por cambio de la lnea RB6 a la cual se ha
; conectado el pulsador "INCREMENTAR".
; Estando en el modo "Temporizador_Ajustar" incrementa el valor del tiempo deseado
; expresado en segundos en intervalos de 5 segundos y hasta un mximo de 255 segundos.
SaltoIncremento

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

; Cada vez que pulsa se oye un


pitido.
; Incrementa el tiempo deseado de
temporizacin
; saltos de "SaltoIncremento"
segundos.
; Si pasa del valor maximo lo
inicializa.
; Visualiza mientras espera que deje
de pulsar.
; Mientras permanezca pulsado,
; incrementa el digito.
; Actualiza el tiempo deseado.
; Este es el tiempo deseado.

;******************************* Subrutinas "PitidoLargo", "Pitido" y "PitidoCorto" ***********************************


PitidoLargo
Pitido
PitidoCorto

bsf
call
bsf
call
bsf
call
bcf
return

Zumbador
Retardo_500ms
Zumbador
Retardo_200ms
Zumbador
Retardo_20ms
Zumbador

;********************************************* Libreras *****************************************************************


INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE

<RETARDOS.INC>
<BIN_BCD.INC>
<LCD_4BIT.INC>
<LCD_MENS.INC>
<EEPROM.INC>

END

275

También podría gustarte