Está en la página 1de 78

INDICE

CAPÍTULO 1
1 MICROCONTROLADORES PROGRAMABLES
1.1
¿QUÉ ES UN MICROCONTROLADOR?
1.2
ARQUITECTURA INTERNA
1.2.1
EL PROCESADOR
1.2.2
MEMORIA DE PROGRAMA
1.2.3
ASIGNACION DE PINES
1.2.4
RECURSOS AUXILIARES
1.3
PRIMER PROGRAMA

2

MICROCONTROLADORES DE 8 BITS (PIC)
2.1
LA FAMILIA DE LOS PIC
2.1.1 Gama enana: PIC12C(F)XXX
2.1.2 Gama baja: PIC16C5X
2.1.3 Gama media PIC16C(F)XXX
2.1.4 Gama alta: PIC 17CXXX
2.2
SEGUNDO PROGRAMA

CAPITULO 3
3 EL MICROCONTROLADOR PIC16F84
3.1
Características principales
3.2
Descripción de pines
3.3
Frecuencia de funcionamiento
3.3.1. Tipos de osciladores
3.4
Reset
3.5
Tercer programa

CAPÍTULO 4
4 PROCESADOR INTERNO
4.1
Arquitectura Interna
4.2
Memoria de programa
4.3
Memoria de Datos RAM
4.3.1. Direccionamiento de la memoria de datos
4.4
El Registro de Estado
4.5
Cuarto Programa

5

RECURSOS FUNDAMENTALES
5.1
Temporizador/Contador TMR0
5.1.1
El registro OPTION
5.2
Interrupción del Timer0.
5.3
WatchDog (WDT)
5.4
Puertos de I/O
5.4.1
PORTA y Registros TRISA
5.4.2
PUERTO B Y REGISTROS TRISB
5.5
Palabra de configuración
5.6
Memoria EEPROM de datos
5.7
Quinto programa

6

INTERRUPCIONES, RESET Y RECURSOS AUXILIARES

6.1
Causas de interrupción
6.1.1
El registro de control de interrupciones INTCON
6.1.2
Interrupción externa INT
6.1.3
Interrupción del TMR0
6.1.4
Interrupción del Puerto B
6.1.5
Interrupción en la EEPROM de datos
6.2
Reset
6.3
Modo de bajo consumo
6.4
Sexto programa

7

SET DE INSTRUCCIONES
7.1
RISC
7.2
Tipos de formato
7.2.1
Manejo de registro de tamaño byte
7.2.2
Manejo de bits
7.2.3
Manejo de valor inmediato
7.2.5
Salto condicional
7.3
Instrucciones especiales y de control
7.4
Séptimo programa
7.5
PROGRAMADOR

CAPÍTULO 1
1

1

MICROCONTROLADORES PROGRAMABLES

1

1.1

¿QUÉ ES UN MICROCONTROLADOR?

El microcontrolador es un circuito integrado programable que
contiene periféricos de entrada/salida, memoria. Se utiliza para
controlar diferentes tipos de procesos mediante sensores y
actuadores del dispositivo a controlar.
2

1.2

ARQUITECTURA INTERNA

Las partes principales de un microcontrolador son:
1
2
3
4

5

1.
Procesador
2.
Memoria no volátil para contener el programa
3.
Memoria de lectura y escritura para guardar los datos
4.
Líneas de I/O para los controladores de los
periféricos
a a) Comunicación paralelo
b b) Comunicación serie
5.
Recursos auxiliares
a a) Circuito de reloj
b b) Temporizadores
c c) Watchdog
d d) Convertidores A/D y D/A
e e) Comparadores analógicos
f f) Protección para fallos de alimentación
g g) Estado de bajo consumo

2 1.2.Arquitectura Harvard .2.EEPROM FLASH tipos de memoria que utilizan los OTP El PIC 16C84 y el PIC16F84 utilizan memorias de tipo EEPROM y FLASH respectivamente. máquina pequeña y simple...1 1.. de forma que la mayor parte de las instrucciones se ejecutan en un ciclo de instrucción. .Arquitectura RISC .ROM .EPROM .. El RISC tiene un repertorio de instrucciones..1 EL PROCESADOR El procesador del PIC cuenta con tres técnicas: .2 MEMORIA DE PROGRAMA Existen diferentes microcontroladores: .Segmentación En la arquitectura Harvard son independientes la memoria de instrucciones y la memoria de datos y cada una dispone de su propio sistema de buses para el acceso.

3 1.2.3 Objetivo PRIMER PROGRAMA un .1 se muestra el diagrama del PIC16F84A Figura 1.3 ASIGNACION DE PINES En la figura 1.1 4 1.4 RECURSOS AUXILIARES Los recursos más comunes microcontrolador son los siguientes: a b c d e f g 3 a) b) c) d) e) f) g) con los que cuenta Circuito de reloj Temporizadores Watch Dog Convertidores A/D y D/A Comparadores analógicos Sistema de protección ante fallas de alimentación Sistemas de bajo consumo de energía 1.2.

Desarrollo Generar por medio de un programa una secuencia de datos y reflejarlos en la salida de los puertos del PIC16F84A por medio de led´s. Ver Figura A FIGURA A .Conocer los modos de configuración de los puertos del microcontrolador así como las instrucciones necesarias para mandar y datos por el puerto A y B.

Dirección del conta1 p/retardo .Salto a la primera instrucción ORG 05h .Selecciona la pagina 0 de datos .5 .Dirección del puerto B .*Descripcion: Manda datos al puerto a y b como un contador binario.Datos a mandar por PORTB .Inicio del ensamblado desde 00 GOTOINICIO .Termino todo el sentido? GOTO OTRO .PROGRAMA 1 *************************************************************************** .Manda de w a PORTB MOVWF PORTA .Manda de w a PORTA MOVLW 0B0h .w .Incrementa al puerto en uno DECFSZ CICLO1.Carga dato en w MOVWF PORTB .Registro de configuración E/S .Selecciona la pagina 1 de datos CLRF TRISB . .asm .*************************PROGRAMA PRINCIPAL******************************** ORG 00h .f . .Indica el fin de luces2 .*después inicia otra secuencia de luces* .Ensamblar de la localidad 05h INICIO BSF STATUS.Carga las veces a ciclo1 CLRF DATO . continua .Dirección del registro de EQU EQU EQU EQU EQU EQU EQU EQU EQU .Carga w con B0 para el retardo CALL RETARDO .********************************IGUALDADES********************************* STATUS estado PORTB TRISB CONTADOR1 CONTADOR2 DATO CICLO1 CICLO2 w f EQU 3 .Incrementa en uno a dato GOTO OTRO .5 .Destino el propio registro 6 6 0Ch 0Dh 0Eh 0Fh 10h 0 1 .*Programa: luces.Veces que se repite luces1 MOVWF CICLO1 .Indica el fin de luces1 .Programa PORTB como salida CLRF TRISA .f .El registro dato se pone en ceros OTRO MOVF DATO.*************************************************************************** .Llama a un retardo INCFSZ DATO.Dirección del conta2 p/retardo .No.Destino w .**************************INICIO LUCES 1 ****************************************** INICIO2 MOVLW 01 .Programa porta como salida BCF STATUS.

Verifica el acarreo GOTO MAS1 .No.Recorre de nuevo el bit a la der MOVLW 01h .f .Llama al retardo RRF PORTB.Se cargan los contadores con el LOOP2 MOVWF CONTADOR2 .Llama al retardo RLF PORTB. INICIO DE LUCES 2 *********************************** MOVLW 05h .f .f . repite todo .Recorre el bit a la derecha BTFSS STATUS.Si.Carga w con E0 . sigue decrementando DECFSZ CONTADOR1.Termino recorrido? GOTO INI .Manda el dato al puerto BCF STATUS.Regresa al programa principal .valor inicial de w LOOP1 DECFSZ CONTADOR2..Recorre de nuevo el bit a la izq DECFSZ CICLO2.0 .Recorre el bit a la izquierda BTFSS STATUS.Lo pasa al puerto b MOVLW 0E0h .**************************SI.*************************************************************************** END .No.0 .Veces que se repite luces2 MOVWF CICLO2 .Carga las veces a ciclo2 INI MOVLW 80h .*************************************************************************** .Verifica el acarreo GOTO MAS .Pone a uno el bit 0 de w MOVWF PORTB .0 . sigue el recorrido GOTOINICIO2 .Termino de decrementar? GOTO LOOP2 .Regresa a decrementar conta2 RETURN .Carga w con E0 .f .f .Borra posible carry MOVLW 0E0h .Borra posible carry MAS1 CALL RETARDO .Fin del programa .**************************INICIO DE LUCES 2 EN SENTIDO DERECHA ********** MAS CALL RETARDO .**************************INICIO DE LUCES2 EN SENTIDO IZQUIERDA*********** BCF STATUS.*******************************RETARDO************************************* RETARDO MOVWF CONTADOR1 .Termino de decrementar? GOTO LOOP1 .0 .Pone en uno el bit7 de w MOVWF PORTB .

CAPITULO 2 2 1 2 2.5VDC y consumen menos de 2mA.1. Se alimenta entre 2.5VDC y 5.2 Gama baja: PIC16C5X Esta serie de PIC cuenta con un repertorio de 33 instrucciones cuyo formato consta de 12 bits.1 MICROCONTROLADORES DE 8 BITS (PIC) LA FAMILIA DE LOS PIC Microchip cuenta con 4 familias de microcontroladores de 8 bits: 2.3 Gama media PIC16C(F)XXX . El formato de sus instrucciones puede ser de 12 a 14 bits y cuenta de 33 o 35 instrucciones respectivamente.1. 2.1.1 Gama enana: PIC12C(F)XXX Su principal característica es su reducido tamaño. 2. Este tipo de microcontrolador no admite interrupciones.

serie y paralelo. puertos de comunicación. La característica más importante en esta gama es su arquitectura abierta.4 Gama alta: PIC 17CXXX Maneja 58 instrucciones de 16 bits en el repertorio. de 14 bits cada una y compatible con el de la gama baja. . contiene variados controladores de periféricos. por su posibilidad de ampliación del microcontrolador con elementos externos.1. 2. Disponen de interrupciones y una pila de 8 niveles que permite el anidamiento de subrutinas.El repertorio de instrucciones es de 35.

A las entradas del Puerto B se conectan los 7 segmentos de un display de cátodo común. Desarrollo Se conecta al las entradas menos significativas del Puerto A el Dip Switch por donde se introducirá un numero binario comprendido del 0000 al 1111. diseñar el hardware y software para controlar un display de 7 segmentos desde un Dip Switch.2 2.2 SEGUNDO PROGRAMA Objetivo Manejar todo el conjunto de instrucciones. Ver Figura B FIGURA B .

PROGRAMA 2 .Resta el valor de dato a w BTFSC STATUS.2 GOTO TRES MOVLW 0X04 .Mueve 04 a W .*Programa: Decoder.Mueve 02 a W SUBWF DATO.Si son iguales manda a uno MOVLW 0X02 .Si son iguales manda a cero MOVLW 0X01 .Mueve 03 a W SUBWF DATO.W .W .2 .*************************VERIFICA DIP SWITCH********************************* CODIF MOVLW 0X00 .2 GOTODOS MOVLW 0X03 .Verifica el resultado GOTO UNO .w MOVWF DATO GOTO CODIF .5 CLRF TRISB MOVLW 0X0F MOVWF TRISA BCF STATUS.*************************************************************************** .*************************PROGRAMA PRINCIPAL******************************** ORG 00h ORG 05h BSF STATUS.W BTFSC STATUS.*Descripcion: Decodificador BCD a 7 segmentos :*************************************************************************** .W BTFSC STATUS.Verifica el resultado GOTO CERO .Mueve 00 a W SUBWF DATO.*******************************ETIQUETAS*********************************** STATUS EQU 3 PORTA EQU 5 PORTB EQU 6 TRISB EQU 6 TRISA EQU 5 CONTADOR1 EQU 0Ch CONTADOR2 EQU 0Dh DATO EQU 0Eh CICLO1 EQU 0Fh CICLO2 EQU 10h DELAY EQU 0XFF w EQU 0 f EQU 1 .Mueve 01 a W SUBWF DATO.2 .Resta el valor de dato a w BTFSC STATUS.5 GOTO INICIO INICIO MOVF PORTA.asm .

W BTFSC STATUS.Mueve 09 a W SUBWF DATO.2 GOTO SEIS MOVLW 0X07 .**************** BCD --.7 SEGMENTOS ************************** CERO MOVLW 0X3F .W BTFSC STATUS.Llama la subrutina de retardo GOTO INICIO .Mueve valor 2 en 7 segment a W MOVWF PORTB MOVLW DELAY CALL RETARDO GOTO INICIO TRES MOVLW 0X4F .Mueve valor 1 en 7 segment a W MOVWF PORTB MOVLW DELAY CALL RETARDO GOTO INICIO DOS MOVLW 0X5B .Mueve valor 0 en 7 segment a W MOVWF PORTB .Mueve 05 a W SUBWF DATO.Mueve 07 a W SUBWF DATO.W BTFSC STATUS.Mueve 06 a W SUBWF DATO.2 GOTO CUATRO MOVLW 0X05 .Mueve el valor de w al puerto B MOVLW DELAY .Regresa a inicio UNO MOVLW 0X06 .2 GOTO SIETE MOVLW 0X08 .Mueve a w el valor del retardo CALL RETARDO .2 GOTO OCHO MOVLW 0X09 .2 GOTO CINCO MOVLW 0X06 .Mueve valor 3 en 7 segment a W MOVWF PORTB MOVLW DELAY CALL RETARDO GOTO INICIO .W BTFSC STATUS.W BTFSC STATUS.W BTFSC STATUS.SUBWF DATO.2 GOTO NUEVE GOTO INICIO .Mueve 08 a W SUBWF DATO.

Mueve valor 8 en 7 segment a MOVWF PORTB MOVLW DELAY CALL RETARDO GOTO INICIO MOVLW 0X67 .Mueve valor 7 en 7 segment a MOVWF PORTB MOVLW DELAY CALL RETARDO GOTO INICIO MOVLW 0X7F .Mueve valor 6 en 7 segment a MOVWF PORTB MOVLW DELAY CALL RETARDO GOTO INICIO MOVLW 0X07 .f GOTOLOOP1 DECFSZ CONTADOR1.CUATRO W CINCO W SEIS W SIETE W OCHO W NUEVE W MOVLW 0X66 .Mueve valor 4 en 7 segment a MOVWF PORTB MOVLW DELAY CALL RETARDO GOTO INICIO MOVLW 0X6D .Mueve valor 5 en 7 segment a MOVWF PORTB MOVLW DELAY CALL RETARDO GOTO INICIO MOVLW 0X7D .******************************SUBRUTINA DE RETARDO ****************************** RETARDO MOVWF CONTADOR1 LOOP2 MOVWF CONTADOR2 LOOP1 DECFSZ CONTADOR2.Mueve valor 9 en 7 segment a MOVWF PORTB MOVLW DELAY CALL RETARDO GOTO INICIO .f GOTOLOOP2 RETURN END .

Pin externo RB0/INT .   Velocidad de operación: DC – 20 MHz clock input DC – 200 ns ciclo de instrucción   Memoria de programa de 1024 words   RAM de datos de 68 Bytes   EEPROM de datos de 64 Bytes   Stack de 8 niveles   4 Tipos de interrupciones diferentes . Al aprender a manejar este sencillo PIC lograremos programar los de gamas más altas que cuentan con mayores recursos. Se utilizara este microcontrolador debido a que cumple con los requisitos para aprender a diseñar proyectos.TMRO sobreflujo del temporizador . Características de alto desempeño:   Solo 35 instrucciones por aprender   Todas las instrucciones se ejecutan en un ciclo de máquina excepto las de salto que utilizan 2 ciclos.PORTB<7:4> interrupción en cambio .Escritura de datos completa en EEPROM Periféricos: .CAPITULO 3 1 3 3 EL MICROCONTROLADOR PIC16F84 3.1 Características principales Este microcontrolador es de la familia media.

0V a 5. (OST) Oscillator Start-Up Timer   Whatchdog Timer (WDT)   Protección de código   Modo de bajo consumo SLEEP   Oscilador con opción de selección Tecnología CMOS FLASH/EEPROM   Bajo consumo. (PWRT) Power-up-Timer. tecnología de alta velocidad   Rango de operación de voltaje: 2.  13 pines de I/O con control de dirección individual   TMR0 temporizador/contador de 8 bits con 8 bits del prescalador programable.Máxima suministrada por línea 25 mA Características Especiales del Microcontrolador   10.5V 2 3.   Corriente de manejo .000.000 ciclos de borrado/escritura en memoria de datos EEPROM   Retención EEPROM más de 40 años   ICSP In-Circuit Serial Programming   (POR) Power-On-Reset.   OSC2/CLKOUT: Auxiliar del circuito oscilador .000 ciclos de borrado/escritura en memoria de programa FLASH   10.2 Descripción de pines   VDD: Alimentación positiva   VSS: Referencia a tierra   OSC1/CLKIN: Oscilador externo que proporciona la frecuencia de trabajo del microcontrolador.Máxima absorbida por línea 25 mA .

Todas las instrucciones del PIC se realizan en un ciclo de instrucción. le corresponde un ciclo de instrucción de 400ns. 3 3.3 Frecuencia de funcionamiento La frecuencia de trabajo del microcontrolador es un parámetro fundamental a la hora de establecer la velocidad en la ejecución de instrucciones y el consumo de energía. Q3 y Q4. La línea RB0 multiplexa otra función que sirve como entrada a una petición externa de una interrupción. La línea RA4 multiplexa otra función expresada por TOCKI. Durante un ciclo de instrucción. Esta función sirve para recibir una frecuencia externa para alimentar el temporizador interno TMR0. que es su máxima frecuencia.   RA0 – RA4: Puerto A. Q2-Q3: Durante la activación de estas dos señales.  MCLR: Reset del PIC. También se utiliza durante la grabación de la memoria de programa para introducir VPP. se activa con un nivel lógico bajo y reinicia el PIC. 8 líneas de I/O. se produce la decodificación de la instrucción. menos las de salto. Cuando un PIC 16X8X funciona a 10Mhz. o sea 4 x 100ns. se desarrollan las siguientes operaciones: Q1: Durante este pulso se incrementa el contador del programa Q4: Durante este pulso se busca el código de la instrucción en la memoria del programa y se carga en el registro de instrucciones.   RB0-RB7: Puerto B. 5 líneas de I/O. que comprende las 4 señales mencionadas. dando lugar a las señales Q1. Para conseguir ejecutar cada instrucción en un ciclo de instrucción (excepto las de salto). que está comprendida entre 12 y 14 VDC. Los pulso de reloj de OSC1/CLKIN se dividen entre 4 internamente. puesto que cada instrucción tarda en ejecutarse 4 periodos de reloj. que tardan el doble. Q2. se aplica la técnica de la .

que consiste en realizar en paralelo las dos fases que comprende cada instrucción. 3.segmentación <<pipe-line>>. En realidad cada instrucción se ejecuta en dos ciclos: En el primero se lleva a cabo la búsqueda del código de la instrucción en la memoria del programa (fase de búsqueda). y en el segundo se decodifica y se ejecuta (fase de ejecución). por eso en esta situación se sustituye la fase de búsqueda de la siguiente instrucción por un ciclo <<vacío>>. . permite realizar al mismo tiempo la fase de ejecución de una instrucción y la de búsqueda de la siguiente.1. Tipos de osciladores El PIC admite cuatro tipos de osciladores externos para aplicarles la frecuencia de funcionamiento. originando que las instrucciones de salto tarden en realizarse dos ciclos de instrucción. Cuando la instrucción ejecutada corresponde a un salto no se conoce cuál será la siguiente hasta que se complete.3. El tipo empleado debe especificarse en dos bits (FOSC1 y FOSC0) en la palabra de configuración. La estructura segmentada del procesador.

Oscilador tipo RC Éste es un oscilador de bajo costo. diseñado para trabajar en un rango de frecuencias de 35 a 200KHz.4 Esquema del oscilador tipo RC Oscilador tipo HS Es un oscilador que alcanza una alta velocidad comprendida entre 4 y 10 MHz y está basado en un cristal de cuarzo o un resonador cerámico. (Figura 3. Éste no tiene una frecuencia muy estable y su valor depende de los valores de los elementos de la red RC (Figura 3. Oscilador tipo XT Es un oscilador de cristal para frecuencias estándar comprendidas entre 100KHz y 4MHz Oscilador tipo LP Oscilador de bajo consumo con cristal. formado por una resistencia y un capacitor.5) .4) Figura 3.

apuntando hacia la primera dirección del programa en donde deberá estar la primera instrucción del programa de aplicación. el microcontrolador reinicia su estado provocando los acciones importantes: 1 1. El contador del programa se carga con la dirección 0. .4 Reset Cuando se aplica un nivel bajo en el pin MCLR. La mayoría de los registros de estado y control del procesador toman un estado determinado. 2 2.Figura 3.5 Para frecuencias comprendidas entre 4MHz y 10 MHz C1 y C2 deben de ser de 15pF a 33pF. 4 3.

5 3. Ver Figura C La formula que indica el tiempo es: T  4  Tosc ValorTMR 0  Variable . Desarrollo Realizar por medio de subrutinas diferentes tiempos. Visualizando la frecuencia por medio de un diodo led. guardando el contador del programa en la pila.5 Tercer programa Objetivo Conocer el comportamiento del TMR0. manejarlo y controlar 8 frecuencias diferentes.

2 .asm .W .*************************PROGRAMA PRINCIPAL*********************** ORG 00h ORG 05h BSF STATUS.Guarda el valor de w en dato MOVLW 0X00 SUBWF DATO.*******************************ETIQUETAS*********************************** STATUS EQU 3 TMR_OPT EQU 1 INTCON EQU 0Bh PORTA EQU 5 PORTB EQU 6 TRISB EQU 6 TRISA EQU 5 SEG EQU 0Ch VAR EQU 0Dh DATO EQU 0Eh CICLO1 EQU 0Fh CICLO2 EQU 10h w EQU 0 f EQU 1 .Compara si el dip switch es igual a 3 BTFSC STATUS.Mueve el valor del puerto A en w MOVWF DATO .2 CALL SEG2 MOVLW 0X02 SUBWF DATO.*Programa: tiempo.Compara si el dip switch es igual a 1 BTFSC STATUS.*Descripcion: Generador de 8 frecuencias .2 CALL SEG3 MOVLW 0X03 SUBWF DATO.FIGURA CPROGRAMA 3 .5 CLRF PORTB GOTO INICIO :************************** INICIO DEL PROGRAMA **************************** INICIO MOVF PORTA.Compara si el dip switch es igual a 0 BTFSC STATUS.W .W .W .2 .5 MOVLW 0X1F MOVWF TRISA CLRF TRISB MOVLW 0XD7 MOVWF TMR_OPT BCF STATUS.w .******************************************************************************** .Compara si el dip switch es igual a 2 BTFSC STATUS.******************************************************************************** .Si no es igual salta la instrucción CALL SEG1 .Si es igual llama a subrutina seg1 MOVLW 0X01 SUBWF DATO.

Fija en var el retardo para la frec 5 RETURN SEG6 MOVLW 0X10 MOVWF VAR .0 .2 .W BTFSC STATUS.Fija en var el retardo para la frec 2 RETURN SEG3 MOVLW 0X04 MOVWF VAR .Compara si el dip switch es igual a 4 CALL SEG5 MOVLW 0X05 SUBWF DATO.Manda llamar a inicio .Fija en var el retardo para la frec 6 RETURN SEG7 SEG8 MOVLW MOVWF RETURN MOVLW MOVWF 0X20 VAR .Fija en var el retardo para la frec 4 RETURN SEG5 MOVLW 0X0F MOVWF VAR .0 .************************PARPADEO********************************************* BSF PORTB.Fija en var el retardo para la frec 8 .2 .W BTFSC STATUS.CALL SEG4 MOVLW 0X04 SUBWF DATO.***********************FRECUENCIAS******************************************* SEG1 MOVLW 0X01 MOVWF VAR .Compara si el dip switch es igual a 5 CALL SEG6 MOVLW 0X06 SUBWF DATO.Fija en var el retardo para la frec 7 0X40 VAR .Limpia la variable SEG CALL RETARDO .2 .Fija en var el retardo para la frec 1 RETURN SEG2 MOVLW 0X02 MOVWF VAR .Llama a subrutina de retardo CLRF SEG BCF PORTB.2 .Fija a 1 el bit 0 del puerto B CLRF SEG .W BTFSC STATUS.Fija a 0 el bit 0 del puerto B CALL RETARDO GOTO INICIO .Compara si el dip switch es igual a 7 CALL SEG8 .Fija en var el retardo para la frec 3 RETURN SEG4 MOVLW 0X08 MOVWF VAR .W BTFSC STATUS.Compara si el dip switch es igual a 6 CALL SEG7 MOVLW 0X07 SUBWF DATO.

2 INCF SEG MOVF VAR.2 GOTO RETARDO RETURN END .w BTFSS STATUS.RETURN .*****************************RUTINA DE RETARDO*********************** RETARDO CLRF TMR_OPT INC BTFSS INTCON.2 GOTO INC BCF INTCON.w SUBWF SEG.

1 Figura 4.CAPÍTULO 4 4 1 4.1 Diagrama a bloques del PIC16F84 La arquitectura interna consta de 7 bloques fundamentales: .1 4 PROCESADOR INTERNO Arquitectura Interna Para lograr una compactación del código óptima y una velocidad superior. el PIC incorpora en su procesador 3 de las características   Procesador tipo RISC   Procesador segmentado   Arquitectura HARVARD La arquitectura HARVARD es con la cual se puede acceder de forma simultanea e independiente a la memoria de datos y a la memoria de instrucciones. La arquitectura interna del PIC 16F84 se muestra en el diagrama a bloques de la Figura 4.

3 3. 6 6. El primer 1K x 14 (0000h-03FFh) ya está implementado Figura 4.1 1. temporizador. etc. Memoria de datos formada por dos áreas. . 7 7. Base de tiempos y circuitos auxiliares.2.2 Memoria de programa El PIC16F84 tiene un contador de programa de 13 bits. 5 5. Direccionamiento directo e indirecto de la memoria RAM. Bus de datos con una ALU de 8 bits y un registro de trabajo W 4 4. Direccionamiento de la memoria de programa en base al contador de programa ligado al stack de 8 niveles. Memoria de programa EEPROM de 1K x 14 bits.El vector de reset se encuentra en la dirección 0000h y el vector de interrupción en la 0004h. Recursos conectados al bus de datos tales como puertos de I/O. 2 4. capaz de direccionar un espacio de memoria de 8K x 14. Una RAM donde se alojan 22 registros de propósito especÍfico Especial Function Registers (SFR) y 36 de propósito general General Purpose Registers (GPR) y otra del tipo EEPROM de 64 bytes. 2 2.

y el segundo 36.3 Memoria de Datos RAM La memoria de datos se dispone de dos áreas diferentes: 1 1.Figura 4. 3 4. Área EEPROM de 64 bytes donde.2 Mapa de memoria de programa y stack. El primer banco tiene 24 posiciones de tamaño byte. donde reside el banco de registros específicos (SFR) y el banco de registros de propósito general (GPR). se pueden almacenar datos que no se pierden al desconectar la alimentación. opcionalmente. Área de RAM estática o SRAM. 2 2. . aunque dos de ellas no son operativas.

Cuando RP0 = 1 acceso a banco 1. La figura 4. INTCON. Los registros SFR se clasifican en 2 grupos. Para seleccionar un registro GPR no hay que tener en cuenta el estado del bit RP0. . PCLATH e INTCON). Después de un Reset se accede automáticamente al banco 0. etc. Los 36 registros restantes de cada banco se destinan a GPR y en realidad solo son operativos los 36 del banco 0 por que los del banco 1 se mapean sobre el banco 0. Algunos de los registros se encuentran repetidos en la dirección de los dos bancos. que identifica el banco y sus direcciones están comprendidas entre el valor 0x0c y Ox2f. se accede al mismo del banco 0. Es decir que cuando se apunta a un registro general del banco 1.4 muestra la estructura de estos registros y los valores que toman después de un Reset. En uno se incluye el núcleo del microcontrolador (ESTADO. Solo se hallan implementadas las 48 primeras posiciones de cada banco. de las cuales las 12 primeras están reservadas al SFR. OPTION. FSR. RP0 = 0 acceso a banco 0. porque al estar mapeado el banco 1 sobre el banco 0 cualquier registro del banco 1 corresponde al mismo del banco 0. La posición apuntada por la dirección 7H y la apuntada por la 87H no son operativas. que son los encargados del procesador y sus recursos.3) Para seleccionar el banco para acceder se manipula el bite (RP0) del registro de estado. En el direccionamiento directo a los registros GPR se ignora el bit MSB. ESTADO.La zona de memoria RAM está dividida en dos banco (banco 0 y banco 1)de 128 bytes cada uno.) y en el otro la operación de los recursos auxiliares y periféricos. para simplificar su acceso (INDF. (Figura 4.

.

Las 12 primeras posiciones de cada banco se reservan a los registros SFR y las 36 restantes a los registros GPR. .Figura 4. solo los primeros 48 de cada banco están implementados.3 La memoria RAM de datos se divide en 2 bancos de 128 bytes cada uno.

Direccionamiento de la memoria de datos Direccionamiento Directo El operando que utiliza la instrucción en curso se referencia mediante su dirección. con los 7 bits menos significativos del registro FSR.5) Direccionamiento Indirecto Este modo de direccionamiento se usa cuando en una instrucción se utiliza como operando el registro INDF.3.1.4. se accede la dirección de un banco especificada. Figura 4. que ocupa la dirección 0 de ambos bancos. mientras que los 7 bits menos significativos apuntan a la posición. que viene incluida en el código de operación de la misma en los 7 bits menos significativos. En este modo de direccionamiento el bit IRP = 0 siempre. El bit MSB de FSR junto al bit IRP del registro de estado se encarga de seleccionar el banco a acceder.5 Direccionamiento directo del PIC16F84 . El registro INDF no está implementado físicamente y cuando se le hace referencia. (Figura 4. El banco a acceder lo determinan los bits RP0 y RP1 del registro de estado.

SUBLW.4 El Registro de Estado El registro de estado contiene el estado aritmético de la ALU (C. se deben de utilizar únicamente las instrucciones BCF. Para modificar el registro de estado. RP0 y RP1). SUBWF) (para borrow la polaridad es al revés) 1 = En el resultado de la instrucción se produjo un carry en el cuarto bit de menos peso. BSF. ADDLW. SWAPF y MOVWF ya que estas instrucciones no afectan ningún bit del registro de estado. Selecciona el dato a acceder en la memoria de datos (IRP. Indica el estado de RESET (TO y PD). 0 = No se produjo carry . DC y Z). REGISTRO DE ESTADO bit 7-6 bit 5 bit 4 bit 3 bit 2 No implementado: Se programa como 0 RP0: Selección de banco en direccionamiento directo 01 = Banco 1 (80h – FFh) 00 = Banco 0 (00h – 7Fh) TO: Bit Time-out 1 = Después de energizarlo o al ejecutarse las instrucciones CLRWDT y SEP 0 = Cuando termina el tiempo del WDT (Watchdog) PD: Bit Power-Down 1 = Después de energizarlo o al ejecutar la instrucción CLRWDT 0 = Al ejecutar la instrucción SEP Z: Bit Cero 1 = El resultado de la operación aritmética-lógica ha sido 0 bit 1 0 = El resultado de la operación aritmética-lógica no es 0 DC: Bit Digito de carry/borrow (instrucciones ADDWF.4 4.

0 = No se produjo carry.bit 0 C: Bɩt carry/borrow (instrucciones ADDWF. ADDLW. . SUBLW. SUBWF) (para borrow la polaridad es al revés) 1 = En el resultado de la instrucción se produjo un carry en el bit de más significativo.

5 4. El barrido se hará a una velocidad en la que el ojo humano perciba que están iluminadas todas las columnas. genere un barrido en las 16 columnas de la pantalla y en sincronía con el puerto B mandar los datos a desplegar. Ver figura D .5 Cuarto Programa Objetivo Realizar una pantalla de matriz de 8x16 y desplegar diferentes mensajes Desarrollo Realizar un programa que mediante la ayuda de multiplexores.

Rutina de dato a desplegar MOVWF TABLA .Mueve valor de W al Port A INCF COLUMNA.Guarda dato en la variable MOVLW 0X0F .Carga w con el retardo CALL RETARDO .*Descripcion: Controlar por medio del puerto a y b una pantalla de 16 x 8 .******************************CONTROLA PANTALLA 1**************************** BARRIDO BTFSC PORTA.*************************PROGRAMA PRINCIPAL******************************** ORG 00h ORG 05h BSF STATUS.***************************************************************************** .w .FIGURA DPROGRAMA 4 .Incrementa columna MOVWF COLUMNA CALL DATO .Verifica push GOTO BARRIDO1 .***************************************************************************** .Llama retardo .5 MOVLW 0X00 MOVWF COLUMNA GOTO INICIO INICIO GOTO BARRIDO .5 CLRF TRISB MOVLW 0X10 MOVWF TRISA BCF STATUS.:Autor: Carlos Alberto López González .*******************************ETIQUETAS************************************* STATUS EQU 3 PORTA EQU 5 PORTB EQU 6 TRISB EQU 6 TRISA EQU 5 COLUMNA EQU 0Ch TABLA EQU 0Dh CONTADOR1 EQU 0Eh CONTADOR2 EQU 0Fh CICLO EQU 10h DELAY EQU 0XFF ENABLE EQU 0X08 PCL EQU 02h w EQU 0 f EQU 1 .*Programa: Display 16 x 8 .Va a pantalla 2 MOVF COLUMNA.w .Mueve valor de colum a W MOVWF PORTA .4 .

w BTFSC STATUS.Carga w con 00 MOVWF COLUMNA .w MOVWF COLUMNA CALL DATO1 MOVWF TABLA MOVLW 0X0F CALL RETARDO MOVF TABLA.w MOVWF PORTA INCF COLUMNA.Despliega dato al W puerto B MOVLW 0X10 .2 CALL RESET GOTO BARRIDO2 RESET MOVLW 0X00 .w MOVWF PORTB MOVLW 0X10 SUBWF COLUMNA.*******************************CONTROLA PANTALLA 3 ***************************** BARRIDO2 BTFSC PORTA.2 CALL RESET .w MOVWF PORTA INCF COLUMNA.Posición de columna BTFSC STATUS.4 GOTO BARRIDO2 MOVF COLUMNA.Ultima regresa al origen GOTO BARRIDO .Descarga w en columna RETURN .Regresa a barrido .w MOVWF PORTB MOVLW 0X10 SUBWF COLUMNA.w BTFSC STATUS.Carga w con 10 SUBWF COLUMNA.Mueve valor de tabla a MOVWF PORTB .w .*******************************CONTROLA PANTALLA 2**************************** BARRIDO1 BTFSC PORTA.w MOVWF COLUMNA CALL DATO2 MOVWF TABLA MOVLW 0X0F CALL RETARDO MOVF TABLA.4 GOTO BARRIDO3 MOVF COLUMNA.MOVF TABLA.2 CALL RESET GOTO BARRIDO1 .w .

regresa de subrutina con w=81 RETLW 0X01 .regresa de subrutina con w=81 RETLW 0XFF .regresa de subrutina con w=01 RETLW 0X00 .regresa de subrutina con w=81 .f GOTO LOOP2 RETURN .regresa de subrutina con w=01 RETLW 0XFF .regresa de subrutina con w=81 RETLW 0X81 .regresa de subrutina con w=89 RETLW 0X00 .*********************************DATO PANTALLA 2 ******************************* DATO1 ADDWF PCL RETLW 0X00 RETLW 0X82 RETLW 0X81 RETLW 0XFF RETLW 0X80 RETLW 0X80 RETLW 0X00 RETLW 0XFF RETLW 0X91 RETLW 0X91 RETLW 0XF1 RETLW 0X00 RETLW 0XFF RETLW 0X11 RETLW 0X11 RETLW 0x11 RETLW 0X00 ..regresa de subrutina con w=81 RETLW 0X81 .regresa de subrutina con w=81 RETLW 0X89 .********************************RUTINA DE RETARDO **************************** RETARDO MOVWF CONTADOR1 LOOP2 MOVWF CONTADOR2 LOOP1 DECFSZ CONTADOR2.regresa de subrutina con w=01 RETLW 0x01 .regresa de subrutina con w=89 RETLW 0X89 .regresa de subrutina con w=FF RETLW 0X81 .********************************DATO PANTALLA 1 ****************************** DATO ADDWF PCL RETLW 0X81 .*********************************DATO PANTALLA 3 ********************************** DATO2 .regresa de subrutina con w=01 RETLW 0X01 .regresa de subrutina con w=81 RETLW 0X00 .regresa de subrutina con w=00 RETLW 0XFF .regresa de subrutina con w=81 RETLW 0X01 .f GOTO LOOP1 DECFSZ CONTADOR1.regresa de subrutina con w=89 RETLW 0X89 .

ADDWF RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW PCL 0X00 0X00 0XFF 0X91 0X91 0X91 0XFF 0X00 0X00 0X10 0X18 0X14 0X12 0XFF 0X00 0x00 0X00 .

pasa de FFh a 00h y avisa fijando a 1 la bandera señalizadora ido provocando una interrupción. El elemento encargado de realizar esta función es el temporizador TMR0.Como contador de sucesos. se incrementa con cada ciclo de instrucción ( Fosc/4) hasta que se desborda. activando una bandera ido provocando una interrupción. También es frecuente contar los pulsos que se producen en el exterior del sistema y este elemento se denomina contador.. que actúa de dos maneras diferentes: 1. que están representados por los pulsos que se aplican al pin RA4/TOCKI. es determinar intervalos concretos de tiempo. o sea. El PIC 16F84 tiene un temporizador/contador de 8 bits llamado TMR0.1 5 5 RECURSOS FUNDAMENTALES Temporizador/Contador TMR0 Una de las labores más comunes en los programas de control de dispositivos.1 ..Como temporizador. Al llegar al valor FFh se desborda el contador y con el siguiente pulso pasa a 00h. cuando se carga en el registro que implementa al recurso un valor inicial. 2.ENDCAPÍTULO 5 1 5. Ver figura 5.

lo que se traduce en un Reset que reinicia todo el sistema. el flanco activo es negativo y si TOSE = 0 el flanco activo es el positivo. En esta situación el registro TMR0 se incrementa con cada flanco activo en el pin TOCK1. PSA. Para hacer esto se tiene un circuito denominado prescalador que divide la frecuencia utilizada por diversos rangos. El TMR0 y el Watchdog. En realidad el PIC 16F84 dispone de 2 temporizadores. En la figura 5. precisan controlar largos intervalos de tiempo y necesitan aumentar la duración de los pulsos de reloj que los incrementa. TOSE.1 Diagrama a bloques del TIMER0 Nota: 1: TOCS. PS2 (Registro OPTION) 2: El prescalador se comparte con el temporizador del Watchdog Para que el TMR0 funcione como contador se tiene que fijar a 1 el bit TOCS. Para que el TMR0 funcione como temporizador el bit TOCS = 0. Si TOSE = 1. el TMR0 y el Watchdog. El primero actúa como principal y el segundo vigila el programa que se esté ejecutando normalmente y que no este detenido en un ciclo infinito a espera de algún evento que no se produce.Figura 5.2 podemos ver el diagrama a bloques del prescalador del TIMER/WDT . El tipo de flanco activo se elige programando el bit TOSE en el registro OPTION.

1 El registro OPTION Este registro controla el TMR0 y el prescalador . . 1 5. La instrucción adecuada es movf tmr0.2 Diagrama a bloques del Prescalador TIMER0/WDT. El bit T0CS (Timer 0 Clock Edge Select) selecciona el multiplexor MPX1 la procedencia de los pulsos de reloj.Figura 5.1. Si T0SE = 1 el flanco activo es el negativo. y si T0SE = 0 el flanco activo es el positivo. que pueden ser los del oscilador interno (Fosc/4) o los que se aplican desde el exterior por el pin TOCKI.w. Para calcular los tiempos a controlar con TMR0 se utilizan las siguientes fórmulas prácticas. Temporización = 4 * TOSC * (Valor cargado en TMT0)* (Prescaler) Valor a cargar en TMR0 = Temporización/4 * TOSC * Prescaler En cualquier momento se puede leer el valor de TMR0 sin detener su cuenta. El bit T0SE ( Timer 0 Clock Source Select) elige el tipo de flanco activo en los pulsos externos.

2 Interrupción del Timer0. Este desbordamiento fija el bit T0IF (INTCON<2>).El bit PSA del registro OPTION determina la asignación del prescalador al TMR0 (PSA = 0) o al WDT (PSA = 1). La interrupción del TMR0 es generada cuando se desborda el registro de FFh a 00h. REGISTRO OPTION bit 7 RBPU: Bit de habilitación de Pull-up del puerto B 1 = PORTB Pull-up deshabilitado 0 = PORTB Pull-up habilitado bit 6 INTEDG: Bit de selección de flanco de interrupción 1 = Interrupción en flanco negativo 0 = Interrupción en flanco positivo bit 5 TOCS: Bit de selección de reloj fuente del TMR0 1 = Transición en el pin RA4/TOCKI 0 = Ciclo de reloj de instrucción interna (CLKOUT) bit 4 T0SE : Bit de selección de flanco del TMR0 1 = Incrementa en transición negativa en el pin RA4/TOCKI 0 = Incrementa en transición positiva en el pin RA4/TOCKI bit 3 PSA: Bit de asignación del prescalador 1 = Prescalador asignado a WDT 0 = Prescalador asignado al Timer0 bit 2-0 PS2:PS0: Bits de selección de la taza del prescalador BIT Taza TMR0 Taza WDT 000 1:2 1 :1 001 1:4 1:2 010 1:8 1:4 011 1 : 16 1:8 100 1 : 32 1 : 16 101 1 : 64 1 : 32 110 1 : 128 1 : 64 111 1 :256 1 : 128 2 5. La interrupción puede ser enmasacarada limpiando .

el T0IE (INTCON<5>).3 WatchDog (WDT) El watchdog es un contador interno de 8 bits que origina un Reset cuando se desborda. Su control de tiempos es independiente del TMR0 y esta basado en un simple red R-C. El WDT puede ser . rehabilitando esta interrupción. REGISTRO INTCON bit 7 bit 6 bit 5 TMR0 1 = Interrupción habilitada 0 = Interrupción deshabilitada INTE: Habilitación de interrupción externa RB0/INT 1 = Interrupción habilitada 0 = Interrupción deshabilitada RBIE: Habilitación de interrupción de cambio de puerto bit 4 bit 3 RB 1= Interrupción habilitada 0 = Interrupción deshabilitada T0IF: Bit bandera de interrupción de desbordamiento 1 = El registro TMR0 se desbordó 0 = El registro TMR0 no se ha desbordado INTF: Bit bandera de interrupción externa RB0/INT 1 = Ocurrió una interrupción externa 0 = Ningún pin del RB7:RB4 ha cambiado de estado bit 2 bit1 3 GIE: Bit de habilitación de interrupción global 1 = Habilita todas las interrupciones no enmascaradas 0 = Deshabilita todas las interrupciones EEIE: Habilitación de interrupción de escritura completa 1 = Interrupción habilitada 0 = Interrupción deshabilitada T0IE: Habilita la interrupción de desbordamiento del 5. El bit T0IF debe ser limpiado en el programa por la rutina del servicio de interrupción.

al completar su cuenta provocará un reset y sacará al microcontrolador del modo de bajo consumo.permanentemente deshabilitado. programando el bit WDTE como 0 en la palabra de configuración. además de borrar el WDT detiene el sistema y lo mete en un modo de bajo consumo.3 segundos. Esto consiste en ponerlo a cero mediante las instrucciones clrwdt y sep. Figura 5. Se deben analizar las instrucciones para poder situar estas instrucciones antes de que ocurra el desbordamiento y se reinicie el sistema.3 Diagrama a bloques del temporizador WDT . A diferencia de la instrucción sep.3 La instrucción clrwdt borra el WDT y reinicia su cuenta. Ver Figura 5. Para evitar el desbordamiento del WDT se tiene que refrescar previamente. Utilizando el prescalador se puede aumentar hasta alcanzar los 2. El WDT tiene un tiempo nominal de desbordamiento de 18ms (sin prescalador).

4. RA4 multiplexa su función de I/O con la entrada de reloj para el TMR0. Fijando un bit de TRISA (= 1) configurara el pin correspondiente como entrada. estos pines son configurados como entrada. TABLA 5-1: Funciones Puerto A Nombre RA0 RA1 RA2 RA3 RA4/TOCKI Bit bit0 bit1 bit2 bit3 bit4 Tipo de Buffer TTL TTL TTL TTL ST Función Entrada/Salida Entrada/Salida Entrada/Salida Entrada/Salida Entrada/Salida o entrada de reloj externo para TMR0 TABLA 5-2 Registros asociados con el Puerto A Direccion 05h 85h 2 Nombre PORTA TRISA Bit 7 ----- 5.4 Puertos de I/O Algunos pines de los puertos de I/O están multiplexados con una función alterna. Las líneas RA3 – RA0 admiten niveles de entrada TTL y de salida CMOS.2 Bit 6 ----- Bit 5 Bit 4 Bit 3 Bit2 --RA4/TOCKI RA3 RA2 --TRISA4 TRISA3 TRISA2 PUERTO B Y REGISTROS TRISB Bit 1 Bit 0 RA1 RA0 TRISA1 TRISA0 . 1 5. Limpiando un bit TRISA (= 0) configurará el pin correspondiente del puerto A como salida. Nota: Cuando ocurre un Reset. RA4/TOCKI dispone de un circuito Schmitt Trigger que proporciona una buena inmunidad al ruido.4. Su registro de dirección de datos es TRISA.1 PORTA y Registros TRISA PORTA es un puerto bi-direccional de 5 bits.4 5.

Con un solo bit de control se pueden activar todas las resitencias de Pull-up. Limpiando un bit TRISB (= 0) configurará el pin correspondiente del puerto B como salida.PORTB es un puerto bi-direccional de 8 bits. Su registro de dirección de datos es TRISB. Cada pin del puerto B tiene internamente una resistencia de Pull-up. Cuatro pines del puerto B RB7:RB4 tienen la característica de interrupción. TABLA 5-3: Funciones Puerto B Nombre RB0/INT Bit bit 0 Tipo de Buffer TTL/ST RB1 RB2 RB3 RB4 bit 1 bit 2 bit 3 bit 4 TTL TTL TTL TTL RB5 bit 5 TTL RB6 bit 6 TTL/ST RB7 bit 7 TTL/ST RB8 bit 8 TTL/ST Función Pin Entrada/salida o interrupción externa Pin Entrada/salida Pin Entrada/salida Pin Entrada/salida Pin Entrada/salida con en cambio Pin Entrada/salida con en cambio Pin Entrada/salida con en cambio Pin Entrada/salida con en cambio Pin Entrada/salida con en cambio entrada de interrupción interrupción interrupción interrupción interrupción TABLA 5. La interrupción la podemos ver con la badera BIRF que se encuentra en el registro INTCON. El pull-up se desactiva automáticamente cuando el puerto es configurado como salida y al activar el Reset.4 Registros asociados con el puerto B Direcció Nombr n e Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 . Esto se hace mediante el bit RBPU del registro OPTION. Fijando un bit de TRISB (= 1) configurará el pin correspondiente como entrada. Solo los pines configurados como entrada pueden causar esta interrupción.

Al escribirse el programa de la aplicación es necesario grabar el contenido de esta posición de acuerdo con las características del sistema.06h PORTB RB7 86h TRISB 81h OPTIO N INTCO N 0Bh.5 RB0/IN T TRISB TRISB TRISB TRISB TRISB TRISB TRISB TRISB0 7 6 5 4 3 2 1 RBPU GIE RB6 RB5 RB4 TOIE RB3 RB2 RB1 TOIF Palabra de configuración Es una posición reservada de la memoria de programa situada en la dirección 2007h y accesible únicamente durante el proceso de grabación. Ver Figura 5.8Bh 5 5.4: Palabra de configuración Bit 13-4 bit 3 UP” bit 2 bit 1-0 CP: Bit de protección de código 1 = Protección de código desactivado 0 = Toda la memoria de programa está protegida PWRTE: Bit de habilitación del temporizador “POWER1 = Deshabilitado 0 = Habilitado WDTE: Bit de habilitacion del temporizador Watch Dog 1= Habilitado 0 = Deshabilitado F0SC1:F0SC0: Bits de selección del oscilador 11 = Oscilador RC 10 = Oscilador HS 01 = Oscilador XT 00 = Oscilador LP .4 Figura 5.

5 Registro EECON1 bit 7-5 bit 4 bit 3 bit 2 No implementados EEIF: Bandera de interrupción de operación de escritura 1 = Operación de escritura completa 0 = Operación de escritura no se ha completado WRERR: Bandera de error en escritura 1= Operación de escritura terminó antes de tiempo 0= Operación de escritura completa WREN: Bit de habilitación de escritura 1= Permite la escritura de la EEPROM . El registro EECON1. se carga la dirección a acceder de la EEPROM de datos. donde se pueden almacenar datos y variables que interesa que no se pierdan cuando se desconecta la alimentación del sistema.000 de ciclos de escritura/borrado y es capaz de guardar la información sin alterarla más de 40 años. Para poder leerla y escribirla durante el funcionamiento normal del microcontrolador se tienen que utilizar 4 registros del SFR:         EEDATA EEADR EECON1 EECON2 En el registro EEADR.6 5. La memoria EEPROM no está mapeada en la zona de la memoria de datos donde se ubican los registros SFR y GPR. En el registro EEDATA se depositan los datos que se leen o se escriben . El PIC16F84 tiene 64 bytes de memoria EEPROM de datos con un rango de 0h hasta 3Fh.000. funciona para controlar las operaciones de la EEPROM y la distribución de sus bits se presenta en la figura 5.5 Figura 5. Soporta 1.6 Memoria EEPROM de datos El Pic 16F84 tiene 64 bytes de memoria EEPROM de datos.

RP0 EEDATA. BCF MOVLW MOVWF BSF BSF BCF MOVF STATUS. Banco 0 . WREN 55h EECON2 Aah EECON2 EECON1. Habilita INTs. WR INTCON. GIE Quinto programa . W = EEDATA Ejemplo para realizar la escritura de una posición de la EEPROM de datos un valor. Banco 1 . Comienza escritura .7 Objetivo STATUS. Lectura .RP0 INTCON. .Deshabilita INTs . GIE EECON1.0= Inhabilita la escritura de la EEPROM WR: Bit de control de escritura 1= Inicia el ciclo de escritura 0= Ciclo de escritura completo RD: Bit de control de lectura 1= Inicializa la lectura de la EEPROM 0= No inicializa la lectura de la EEPROM bit 1 bit 0 Ejemplo para realizar la lectura de una posición de la EEPROM de datos. W . RP0 EECON1. Habilita escritura . Banco 0 . Dirección a leer . Escribe 55h .RP0 CONFIG_ADDR EEADR STATUS. Escribe Aah . BCF BCF BSF MOVLW MOVWF MOVLW MOVWF BSF BSF 7 5. RD STATUS. Banco 1 .

Ver figura E FIGURA E PROGRAMA 5 . .asm .contador de programa .registro de indireccion pc equ 02h . Conmutando los transistores secuencialmente y a velocidad suficiente se logra hacer parecer al ojo humano que los cuatro displays están iluminados simultáneamente.*************************************************************************** . sino que también se requiere que el transistor este en conducción para lograr la activación del display. Para que el display se ilumine no solo tiene que haber un uno lógico en el segmento a encender.********************************ETIQUETAS*********************************** indo equ 00h .Elaborar un contador de 4 dígitos. Para que no se encienda sobre los cuatro dígitos el mismo número se multiplexa el encendido por medio de cuatro transistores.************************************************************************** . Desarrollo Conectar los cuatro dígitos del display en paralelo. cuando en realidad sólo uno se ilumina.Descripcion: Contador de 4 digitos. diseñando un circuito que requiera la menor cantidad posible de componentes.*Programa: Contador.

status fsr ptoa ptob rota display trisa trisb dig1 dig2 dig3 dig4 loops loops2 z ram memoria c w reset equ equ equ equ equ 03h 04h 05h 06h 0fh .como salidas bcf status.selecciona el banco de memoria alto movlw 10h .variable para desplazamiento de equ equ equ equ equ equ equ equ equ equ 85h 86h 10h 11h 12h 13h 1dh 1eh 02h 05h .lee dato del registro apuntado por fsr .bandera de acarreo equ 00h .bit de seleccion de pagina de equ 00h .variables usadas en retardos .llama la rutina de incremento movlw 08h .checa el push y salta si es 0 call subir . demas bits salidas.colocar en cero el dato del display movwf ptob .configura el puerto a movwf trisa .*******************************PROGRAMA PRINCIPAL**************************** inicio bsf status.registro de seleccion .con el registro selector (fsr) se apunta movwf fsr .acumulador centenas .acumulador decenas .configuracion puerto b .iniciar un 1 en el registro de rotacion movwf rota movlw dig1 .acumulador miles .selecciona el banco de memoria bajo clrf dig1 .configuracion puerto a . movlw 00h .configura el puerto b movwf trisb . ram .puerto b .inicializa acumuladores clrf dig2 clrf dig3 clrf dig4 movlw 00 movwf ptoa .bit de destino a variable de trabajo org 00 goto inicio org 05h .puerto a .bit 4 entrada. w . 4 .registro de estado .Bandera de cero .pasa rotacion del 1 a la variable work movwf ptoa .enciende el transistor (display) movf indo.para apagarlos movf rota. w .al primer dato que se va a mostrar disp movlw 00h .todos los displays a 0 empe btfss ptoa. ram .acumulador unidades .

call tabla .incrementa los miles return . z .pone a cero las centenas incf dig1 . z queda alto call s1000 .pone a cero las unidades incf dig3 .si es cero.*************************RUTINA DE INCREMENTO X 100 ************************* s100 clrf dig3 .si termino.incrementa el contador de centenas movf dig2.desplaza barrido incf fsr .si es cero. goto disp .si numero a.digito a mostrar . w . w . entonces quedara en cero btfsc status. c . entonces quedara en cero btfsc status.carga en w el conteo de las decenas .carga en w el conteo de los miles xorlw 0ah . z queda en alto clrf dig1 .**************************RUTINA DE INCREMENTO X 10************************** s10 clrf dig4 .envia el digito al puerto b movlw 03h call retardo btfsc rota.pone a cero las decenas incf dig2 .incrementa el contador de decenas movf dig3. 0 .si w era 10.Checa si termino barrido goto empe .******************************RUTINA DE INCREMENTO X 1000 ******************* s1000 clrf dig2 . w .incrementa el contador de miles movf dig1. z .carry en cero rrf rota . vuelve desde el comienzo bcf status.genera el digito de 7 segmentos movwf ptob .inicializa los miles return .carga en w el conteo de las centenas xorlw 0ah .incrementa el puntero.*******************************RETARDO************************************** retardo movwf loops top2 movlw d'110' movwf loops2 top nop decfsz loops2 goto top decfsz loops goto top2 retlw 0 .

agrega al cont.incrementa las centenas return .genera el 3 retlw 59h .genera el 4 retlw 6Dh . programa el valor de w retlw 3Fh . entonces quedara en cero btfsc status.si es cero.genera el 5 retlw 6Fh .genera el 7 retlw 7Fh .genera el 2 retlw 7Ch .genera el 9 end . z .***************************RUTINA DE INCREMENTO X 1 ***************************** subir incf dig4 .***************************GENERA LOS NUMEROS SOBRE EL DISPLAY********** tabla addwf pc .incrementa el contador de unidades movf dig4.carga en w el conteo de las unidades xorlw 0ah .si es cero.si w era 10. el flag z queda alto call s100 . w .genera el 6 retlw 38h .genera el 0 retlw 18h . entonces quedara en cero btfsc status.si w era 10. el flag z queda alto call s10 . z .genera el 1 retlw 76h .xorlw 0ah .genera el 8 retlw 7Dh .incrementa las decenas movlw d'250' call retardo return .

(Ver figura 6.1 Registro INTCON bit 7 GIE: Habilitación de interrupciones global 1= Acepta las interrupciones habilitadas INTF RBIF . Cada interrupción tiene su propia bandera. El bit de habilitación global de interrupciones.CAPÍTULO 6 6 1 6 6.1 INTERRUPCIONES.1) 1 GIE bit 7 bit 0 6.1 El registro de control de interrupciones INTCON EEIE TOIE INTE RBIE TOIF Figura 6. GIE habilita o deshabilita individualmente cada una de las interrupciones a través del registro INTCON.1. RESET Y RECURSOS AUXILIARES Causas de interrupción El PIC16F84 tiene 4 fuentes de interrupción:   Interrupción externa por el pin RB0/INT   Interrupción de sobreflujo del TMR0   Interrupciones de cambio del puerto B (Pines RB7:RB4)   Interrupción de fin de escritura de la EEPROM de datos El registro de control de interrupciones (INTCON) graba las interrupciones en bits banderas.

2 6. GIE = 0 y el contador del programa CP se carga con el valor 0004h que es el vector de interrupción. todas las banderas tienen que fijarse a cero.1. aunque la interrupción esté deshabilitada.bit 6 EEPROM 0= No acepta ninguna interrupción EEIE: Habilita interrupción de fin de escritura de la 1= Habilita interrupción 0= Deshabilita interrupción TOIE: Habilita interrupción de sobreflujo del TMR0 1= Habilita interrupción 0= Deshabilita interrupción bit 5 bit 4 INTE: Habilitación de interrupción externa pin RB0/INT 1= Habilita interrupción 0= Deshabilita interrupción RBIE: Habilitación de interrupción por cambio de estado bit 3 en bit 2 bit 1 bit 0 RB7:RB4 1= Habilita interrupción 0= Deshabilita interrupción TOIF: Bandera de sobreflujo del TMR0 1= Sobreflujo en el TMR0 0= TMR0 no se ha tenido sobreflujo INTF: Bandera de activación del pin RB0/INT 1= Se activó RB0/INT 0= No se ha activado RB0/INT RBIF: Bandera de cambio de estado en los pines RB7:RB4 1= Cuando cambia de estado alguno de los 4 pines 0= No ha cambiado el estado Siempre que se produce una interrupción. Antes de regresar de una interrupción al programa. Para saber que tipo de interrupción fue. se localiza la bandera que se haya activado en el registro INTCON.2 Interrupción externa INT .

La interrupción puede ser habilitada o deshabilitada en el bit T0IE en el registro INTCON. La interrupción puede ser habilitada o deshabilitada en el bit RBIE. cada vez que se escribe en este registro se pierden dos ciclos de reloj para la sincronización. cuenta 256 – N y el tiempo que tardará en llegar a esta cuenta está dado por la siguiente formula. Si no se recarga el TMR0 cuando ocurre un sobreflujo. Es importante para atender acontecimientos externos en tiempo real. De forma automática el bit INTF1 = 1 y. 5 6. Cuando se carga el TMR0 con un valor N. 3 6. si el bit de habilitación INTE =1. frecuencia 4 6.1.4 Interrupción del Puerto B Un cambio en la entrada del puerto B 7:4 fijan el bit bandera RBIF en el registro INTCON.1. Esta interrupción esta diseñada específicamente para detectar cuando se pulsa una tecla correspondiente a un teclado matricial que se explora mediante 4 líneas de I/O.Esta interrupción puede programarse tanto de flanco de disparo positivo como negativo en el bit INTDEG en el registro OPTION_REG.3 Interrupción del TMR0 Cuando existe sobreflujo (FFh – 00h) la bandera T0IF se fija a 1. Este registro se puede leer y escribir en cualquier momento. se autoriza el desarrollo de una interrupción. T  4  Tosc   256  N   div.5 Interrupción en la EEPROM de datos . sigue contando desde 00h hasta FFh. Cuando ocurre alguno y se activa el pin RB0/INT.1. se hace una petición de interrupción.

que fija automáticamente la bandera EEIEF a 1 y se habilita en el bit EEIE. Este tiempo garantiza la estabilización del voltaje de alimentación.2 Reset El PIC16F84 tiene diferentes formas para la reinicialización del sistema:           Conexión de la alimentación.El tiempo típico que tarda en desarrollarse una operación de escritura en la EEPROM de datos del PIC16F84 es de 10ms. POR (Power-On Reset) MCLR durante operación normal MCLR durante el modo SEP Reset WDT (Watch Dog) durante operación normal Wake-Up durante modo SLEEP La Figura 6. 2 6. En el pin MCLR. Durante la escritura de este registro debe prohibirse la aceptación de interrupciones para asegurar la operación de escritura. para esto se fija el bit GIE = 0. se tiene un filtro interno para eliminar el ruido e ignorar los pulsos pequeños. . Para asegurarse que se ha completado la escritura y puede continuarse con el flujo de control del programa es aconsejable manejar la interrupción que se origina al finalizar la escritura. El PWRT activa una salida después de cierto tiempo de haber conectado la alimentación. que es considerable comparado con la velocidad a la que el procesador ejecuta las instrucciones.2 muestra un diagrama a bloques de los diferentes tipos de RESET.

3 Modo de bajo consumo Este modo de funcionamiento del PIC.Figura 6. Para entrar en el modo de reposo se tiene que ejecutar la instrucción SLEEP. Para salir del modo SLEEP existen tres alternativas:   Provocando un reset MCLR   WDT sí está en modo SLEEP   Por medio de alguna de las interrupciones excepto la del TMR0 que se detiene en modo SLEEP 4 6. En este modo el pin TOCK1 se conecta a VDD o VSS. Los pines de I/O mantienen el estado anterior al modo de reposo y las que no estén conectadas. se aconseja conectarlas a VDD o VSS para evitar posibles fugas de corriente.2 Diagrama a bloques de los diferentes tipos de Reset 3 6.4 Sexto programa . para eliminar la entrada de pulsos externos al TMR0. El TMR0 también se detiene. está caracterizado por el reducido consumo de energía que requiere y se recomienda en aquellas aplicaciones en las que hay largos periodos en espera de algún suceso.

Mediante subrutinas de incremento variable controlaremos la frecuencia de barrido en las bobinas del motor a pasos.Objetivo Elaborar un control de velocidad y giro de un motor a pasos. Desarrollo Conectar el motor a pasos en el puerto b y utilizar las instrucciones RLF(Rotar a izquierda) y RRF(Rotar a derecha) para controlar el giro. Utilizar el TMR0 para controlar la frecuencia de giro del motor. Ver Figura F . Conectar al Puerto A las entradas de dirección de giro e incremento y decremento de velocidad.

Gira izquierda GOTO DER .FIGURA FPROGRAMA 6 .Fija prescalador .Registro derecha REG_IZQ EQU 0Fh .Variable de frecuencia REG EQU 0Eh .Determina velocidad .*Programa: pasos.*************************PROGRAMA PRINCIPAL******************************** INICIO BTFSC PORTA.*Descripción: Control de Motor a pasos .2 .Velocidad mínima .Verifica entrada pta2 GOTO IZQ .*************************************************************************** .************************************************************************** .5 0X07 TRISA 0XF0 TRISB 0XD7 TMR_OPT STATUS.asm .5 PORTB 0X08 REG 0X10 VAR 0X01 MIN 0XFF MAX SEG INICIO .Velocidad máxima .Gira derecha .Registro Izquierda MIN EQU 10h MAX EQU 11h w EQU 0 f EQU 1 ORG ORG BSF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF BCF CLRF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF CLRF GOTO 00h 05h STATUS.*******************************ETIQUETAS*********************************** STATUS EQU 3 TMR_OPT EQU 1 INTCON EQU 0Bh PORTA EQU 5 PORTB EQU 6 TRISB EQU 6 TRISA EQU 5 SEG EQU 0Ch VAR EQU 0Dh .

0 RLF PORTB.Llama subrutina de retardo CLRF SEG BCF STATUS.2 .0 .Llama subrutina de retardo CLRF SEG RRF PORTB.Incrementa velocidad BTFSC PORTA.W BCF STATUS.Inicia barrido a la derecha MOVWF PORTB BTFSC PORTA.Verifica fin de barrido GOTO DER CALL CAMBIO_DER GOTO INICIO .Verifica entrada de .1 .Si es 1 gira a la derecha MOVF REG.W .Incrementa Velocidad BTFSC PORTA.W .Verifica fin de barrido GOTO IZQ CALL CAMBIO_IZQ GOTO INICIO .Decrementa velocidad CALL RETARDO .****************************GIRO LADO IZQUIERDO****************************** IZQ BTFSS PORTA.Verifica entrada de + Vel CALL INCRE .0 MOVWF REG BTFSS PORTB.Barrido a la izquierda MOVWF PORTB BTFSC PORTA.Vel CALL DECRE .Vel CALL DECRE .Verifica entrada de .Incrementa barrido MOVWF REG BTFSS PORTB.0 .2 .1 ..************************** RESET BARRIDO A LA DERECHA******************* CAMBIO_DER MOVLW 0X08 .Prepara barrido derecha MOVWF REG RETURN .*************************GIRO LADO DERECHO ********************************* DER BTFSC PORTA.*****************************RESET BARRIDO A LA IZQUIERDA******************* CAMBIO_IZQ MOVLW 0X01 .0 .Verifica entrada de + Vel CALL INCRE .W .Si es 0 gira izquierda MOVF REG.3 .Verifica entrada pta2 GOTO IZQ .Verifica entrada pta2 GOTO DER .Decrementa velocidad CALL RETARDO .

W .Compara si es vel max BTFSS STATUS.***************************** DECREMENTA VELOCIDAD***************************** DECRE MOVF VAR.w .Si no es min incrementa RETURN .w SUBWF MAX.Incrementa variable seg MOVF VAR.Verifica desbordamiento GOTO INC BCF INTCON.w .w SUBWF MIN.MOVWF REG RETURN .Si no es max decrementa RETURN .2 INCF VAR .*****************************RUTINA DE RETARDO*********************** RETARDO CLRF TMR_OPT .Mueve velocidad a w MOVWF VAR MOVF VAR.2 .Compara si es la velocidad BTFSS STATUS.Mueve velocidad a w MOVWF VAR MOVF VAR.2 .W .w .Mueve el valor de var a w SUBWF SEG.Compara si es vel min BTFSS STATUS.2 DECF VAR .w .2 .Limpia bandera TOIF INCF SEG .Limpia el TMR0 INC BTFSS INTCON.**************************** INCREMENTA VELOCIDAD*************************** INCRE MOVF VAR.Si es regresa a rutina GOTO RETARDO RETURN .

END 7 1 7. Estos dan una referencia de la dirección que ocupan en la memoria de datos. c c) Campo de operando inmediato o literal (k) Contiene el valor de un operando inmediato.1 7 CAPÍTULO 7 SET DE INSTRUCCIONES RISC Los microcontroladores PIC tienen una arquitectura de tipo RISC (Reduced Instruction Set Computer).2 Tipos de formato Las instrucciones del PIC16F84. b b) Operandos fuente (f) y destino (d) Estos definen los registros que actúan como operandos en la instrucción. tienen 14 bits de longitud. sino que tiene las siguientes características:   Instrucciones simples y rápidas   Instrucciones ortogonales   Longitud de instrucciones y datos constante 2 7. Ésta no implica únicamente que el número de instrucciones máquina que es capaz de interpretar y ejecutar es pequeño. divididos en un código operativo (OPCODE) que especifica el tipo de instrucción y uno o más operandos que especifican la operación de la instrucción. . Ver tabla 7-1 a a) Campo del código OP Los bits de este campo sirven para definir la operación que realiza la instrucción.

Campo de la dirección del operando fuente (f) de 7 bits 3 3. se divide en tres campos.1 Manejo de registro de tamaño byte El formato de las instrucciones orientado a manejar registros de tamaño byte. Ver figura 7. e e) Campo de dirección de salto En las instrucciones de salto CALL y GOTO hay un campo de bits que contiene la dirección de la siguiente instrucción que hay que ejecutar.2.1 Manejo de registro de tamaño byte Todas las instrucciones que tienen este tipo de formato las podemos encontrar en la tabla 7-1.1 1 1. Campo del código OP de 6 bits 2 2.d d) Campo de referencia a un bit (b) Es un campo de 3 bits que indica la posición de un bit dentro de un registro de 8 bits. Estos formatos se clasifican en 5 grandes grupos según el tipo de operación que desarrollan 1 2 3 4 1) Operaciones que manejan registros de tamaño byte 2) Operaciones que manejan bits 3) Operaciones que manejan valores inmediatos 4) Operaciones incondicionales de control de flujo de programa 5 5) Operaciones de salto condicional 1 7. TABLA 7-1 . Dicho campo de bits se carga en el PC en las instrucciones de salto condicional. Campo que define él operando destino (d) de 1 bit Figura 7.

d ORWF f. Campo de la posición del bit en el registro de 3 bits En la tabla 7-2 se muestran las instrucciones orientadas a manejar bits Tabla 7-2 Ciclos 14-Bit Opcode .emónicos. Campo del código OP de 4 bits 2 2.d DWF f.d Suma W y f Multiplica W con F Borra f Borra W Complementa f (inv) Decrementa f Decrementa f salta si 0 Incrementa f Incrementa f salta si 0 OR entre W y F Mueve f Mueve w a f No opera Rota f a la izquierda Rota f a la derecha Resta W a f Intercambia nibbles XOR de W con f 2 7.d RF f RW OMF f.2.d RWF f.DC.d RF f.DC.d BWF f.d CFSZ f.2 Ciclos 1 1 1 1 1 1 1(2) 1 1(2) 1 1 1 1 1 1 1 1 14-Bit Opcode Señalizadores MSb 00 0111 00 0101 00 0001 00 0001 00 1001 00 0011 00 1011 00 1010 00 1111 00 0100 00 1000 00 0000 00 0000 00 1101 00 1100 00 0010 00 1111 00 0110 LSb dfff ffff dfff ffff 1fff ffff 0xxx xxxx dfff ffff dfff ffff dfff ffff dfff ffff dfff ffff dfff ffff dfff ffff dfff ffff 0xx0 ffff dfff ffff dfff ffff dfff ffff dfff ffff dfff ffff C.Z Z Z Z Z Z Z Z Z C C C.d CF f. Campo de la dirección del registro fuente 3 3.d CF f.d OVWF f.d OP F f. 1 1.d CFSZ f.d OVF f. erandos Descripción DWF f.d WAPF f.Z Z Manejo de bits El formato al que responden las instrucciones de este grupo tiene tres campos.

2.f Limpia el bit f Fija a 1 el bit f Checa bit de f y brinca si es 0 Checa bit de f y brinca si es 1 3 7.2. Las instrucciones de este grupo tienen un formato con sólo 2 campos: 1 1. Campo del código operativo con 6 bits 2 2. erandos F F FSC FSS Descripción MSb b.5 Salto condicional ffff ffff ffff ffff .3 1 1 1(2) 1 01 01 01 01 00bb 01bb 10bb 11bb LSb bfff bfff bfff bfff Manejo de valor inmediato El formato correspondiente a este grupo de formato solo tiene 2 campos 1 1.emónicos.f b. Campo del código OP de 3 bits 2 2.f b.4 Operaciones incondicionales de control de flujo de programa Este tipo de instrucciones afectan al contenido del Contador de Programa (PC) y sirven para romper la secuencia ordenada de las instrucciones del programa.2. Campo de la dirección del salto que se carga en el PC de 11 bits k = Valor inmediato de 11 bits 5 7. Campo del valor inmediato (k) con 8 bits k = Valor inmediato de 8 bits 4 7.f b.

efectúan un salto de instrucción. Operando (8 bits) o dirección para el PC (11 bits) Valor indeterminado de un bit puede ser 1 o 0 Contenido Campo de un bit de un registro En el conjunto de Ejemplo: d  [0.El PIC dispone de algunas instrucciones que comparan. El formato de las instrucciones de salto(skip) es el mismo que el de las operaciones que manipulan registros de un byte. En la tabla 7-2 se encuentran las instrucciones de salto BTFSC y BTFSS 1 7. Opciones .1]. y cuando se cumple alguna condición. Si d = 0 es W si d = 1 es f Campo que contiene un valor inmediato.1 SIMBOLO 0xhh F D K X () <>  [] Nomenclatura y símbolos SIGNIFICADO Se usa para referenciar 2 números en hexadecimal hh Representa la dirección de la memoria RAM de datos Bit que indica el registro destino.

Esta instrucción sirve para poner el bit GIE = 1 ya que al atender una interrupción automáticamente se pone en 0 para evitar que cuando se atiende una interrupción se produzca otra. no ejecutando instrucciones y manteniendo el mismo valor en los puertos de I/O Ver Tabla 7-3 .3 Instrucciones especiales y de control En este grupo se incluyen las instrucciones que rompen la secuencia normal del programa porque alteran el contenido del PC y también las instrucciones especiales. Para regresar de una subrutina existen 2 formas.3 7. carga en W el valor inmediato k que contiene. La primera pone a 0 el watchdog . guarda la dirección de partida guardando en la parte más alta del SP el valor actual de la PC. se carga la dirección de regreso al programa principal. De esta manera al regresar de la subrutina. antes de cargar el PC con la dirección de la instrucción a saltar. La instrucción sleep introduce al procesador en un modo de bajo consumo. De las instrucciones especiales tenemos clrwdt y sleep. es decir lo reinicia. La instrucción de salto condicional goto carga en el PC la dirección de la nueva instrucción. La instrucción call de llamada a subrutina. Para el final de las interrupciones hay otra instrucción cuyo mnemónico es retfie. La más común es return que se limita a regresar cargando el valor del PC y la otra es retlw k. Es decir que devuelve un parámetro desde la subrutina. Esta instrucción se debe de poner en ciertos puntos para evitar el sobre flujo del watchdog y con ello el reset del microcontrolador. que además de hacer la función de return. Detiene al oscilador y el procesador queda congelado.

Tabla 7-3 Operaciones Literales y de Control mónicos. randos DLW DLW L RWDT TO LW VLW TFIE TLW TURN EP BLW RLW k k| k k k k k k k k k Descripción Suma inmediata con w AND inmediata con W Llamado a subrutina Limpia watchdog Salto incondicional OR inmediato con W Mueve a w un valor inmediato Retorno de interrupción Retorno subrutina carga w=k Retorno de subrutina Modo de bajo consumo Resta W de un inmediato XOR con W Ciclos 1 1 2 1 2 1 1 2 2 2 1 1 1 14-Bit Opcode MSb 11 111b 11 1001 11 0kkk 11 0000 10 1kkk 11 1000 11 00xx 00 0000 11 01xx 00 0000 00 0000 11 110x 11 1010 kkkk kkkk kkkk kkkk kkkk kkkk kkkk 0000 kkkk 0000 0110 kkkk kkkk LSb kkkk kkkk kkkk 0100 kkkk kkkk kkkk 1001 kkkk 1000 0011 kkkk kkkk .

cuatro para las filas y cuatro para las columnas al puerto B (Ver Figura G). Hacer mediante software un barrido en las filas de un nivel bajo lógico. Desarrollo Conectar las 8 terminales del teclado.4 Séptimo programa Objetivo Controlar un modulo LCD para visualizar las teclas que se vayan pulsando en un teclado de matriz de 4 x 4. (Ver LCD16x2. dicho nivel saldara por la columna correspondiente a la que haga contacto.4 7.Pdf) FIGURA G . Si existe alguna tecla pulsada en la fila a la que se le introdujo el nivel bajo. Inicializar la pantalla de LCD y desplegar la tecla que se haya pulsado. Al momento de leer las columnas (RB0-RB3) sabremos que tecla a sido pulsada.

registro de estado ram equ 05h .configuracion puerto b lcd_var equ 0fh status equ 03h .*************************************************************************** .PROGRAMA 7 .bit de seleccion de pagina de memoria w equ 00h .*********************** PROGRAMA PRINCIPAL ********************* org 00h goto inicio org 05h inicio call up_lcd bsf status.*************************************************************************** .configuracion puerto a trisb equ 86h .bit de destino a variable F z equ 2 .ram movlw 87h movwf opcion bcf status.bit de destino a variable W f equ 01h .puerto b trisa equ 85h .Contador del programa resul equ 0ch tempo1 equ 0dh temp1 equ 11h temp2 equ 10h delay1 equ 12h delay2 equ 13h barrido equ 14h columna equ 15h tecla_temp equ 16h fin_reng equ 17h enter equ 18h resul_1 equ 19h offset equ 0eh opcion equ 81h porta equ 05h .*Programa: LCD.************************ ETIQUETAS ********************** pcl equ 02h .ram call lcd_ini .asm .*Descripcion: Control de Pantalla de LCD .puerto a portb equ 06h .************************* inicio_1 call INICIALIZA LCD borra_home *********** .zero .

2 .f .w status.w tecla_temp .Rota el barrido de la columna columna.Entra a modo configuracion 0x0f .call bsf movlw call clrf call clrf clrf teclado call movlw xorwf btfsc goto call call call goto .01111111 barrido .w portb portb.ENABLE 80h lcd_reg offset mens enter fin_reng lectura 0x00 enter.verifica si esta presionada una tecla lectura2 status.z .ram .No ha terminado barrido teclado .Sale de modo configuracion 4 columna .Fin de barrido?? lectura1 .7 .Regresa a iniciar barrido .z borra_mensaje convierte ascii despliega teclado L E C T U R A ******************************************* status.f .pone carry barrido.PB0-PB3 Entradas trisb .************************ lectura bsf movlw movwf bcf bcf movlw movwf movlw movwf lectura1 movf movwf movf movwf subwf btfss goto bsf rrf decfsz goto goto display_on_cur_off porta.0 .************************ ******************* lectura2 movlw movwf lectura3 clrf clrwdt RETARDO PARA EVITAR REBOTES 100 delay1 delay2 .PB4-PB7 Salidas opcion.Habilita Pull-Up en puerto B status.w status.ram .primer valor de lectura de tecla barrido.Numero de columnas a explorar 0x7f .Valor de barrido en renglon barrido.

lectura4

decfsz
goto
decfsz
goto
return

delay2,f
lectura4
delay1,f
lectura3

;*************************
CONVIERTECODIGO DE
TECLADO********************
convierte clrf
columna
convierte1 call
tabla_tecla
;busca codigo de tecla
subwf
tecla_temp,w
;compara
btfsc
status,z
goto
convierte2
;si es igual
incf
columna
;no es igual, incrementa tabla
goto
convierte1
convierte2 movf
columna,w
movwf
barrido
return
tabla_tecla movf
columna,w
addwf
pcl,f
retlw
0xed ;0
retlw
0x7e ;1
retlw
0x7d ;2
retlw
0x7b ;3
retlw
0xbe ;4
retlw
0xbd ;5
retlw
0xbb ;6
retlw
0xde ;7
retlw
0xdd ;8
retlw
0xdb ;9
retlw
0xee ;clear
retlw
0xeb ;help
retlw
0xe7 ;enter
retlw
0xd7 ;2nd
retlw
0xb7 ;dwn
retlw
0x77 ;up

;********************* CONVIERTE CODIGO ASCII
ascii
addwfpcl,1
retlw '0'
retlw '1'
retlw '2'
retlw '3'
retlw '4'

****************************

retlw '5'
retlw '6'
retlw '7'
retlw '8'
retlw '9'
retlw 'A'
retlw 'B'
retlw 'C'
retlw 'D'
retlw 'E'
retlw 'F'
;******************
DESPLIEGA EN PANTALLA
********************************
despliega bsf
status,ram
clrf
trisb
clrf
trisa
bcf
status,ram
incf
fin_reng
call
lcd_dato
movlw
0x20
subwf
fin_reng,w
btfsc
status,z
call
clear_lcd
movlw
0x10
subwf
fin_reng,w
btfsc
status,z
call
second_line
return
;*****************
BORRA MENSAJE PRINCIPAL
******************
borra
incf
enter
bsf
status,ram
clrf
trisb
clrf
trisa
bcf
status,ram
call
lcd_delay
call
lcd_delay
bcf
porta,1
bsf
porta,2
movlw
0x01
call
lcd_reg
goto
teclado
;******************
BORRA TODA LA PANTALLA
*****************
clear_lcd
bcf
porta,1
bsf
porta,2
movlw
0x01
call
lcd_reg
clrf
fin_reng
return
;******************
MENSAJE PRINCIPAL
******************
mens
clrf
resul

mens_1

movf
offset,w
addwf
resul,w
call
datos
iorlw
0
btfsc
status,2
return
call
lcd_dato
incf
resul,f
movlw
0x0A
movwf
tempo1
movlw
0x0E
subwf
resul,w
btfsc
status,2
call
second
goto
mens_1
second
bsf
porta,2
movlw
0xC0
call
lcd_reg
bsf
porta,0
return
borra_h
bsf porta,2
;ENABLE
movlw
01h
call lcd_reg
return
display_on_cur_off
bsf porta,2
;ENABLE
movlw
0Eh
call lcd_reg
return
up_lcd
bsf status,ram
clrf trisb
clrf trisa
bcf status,ram
return

lcd_ini

bcf
call
bsf
call
movlw
call
call
bsf
movlw
call
call
bsf

porta,0
lcd_delay
porta,2
lcd_delay
38h
lcd_reg
lcd_delay
porta,2
38h
lcd_reg
lcd_delay
porta,2

;OFF_COMANDO
;ENABLE

;ENABLE

;ENABLE

movlw call call return 38h lcd_reg lcd_delay .**************** MANDA DATO A LCD ********************************** lcd_dato bsf porta.0 .DISABLE return .OFF_COMANDO movwf portb call lcd_delay call lcd_e return lcd_e bcf porta.***************** DATOS A DESPLEGAR EN PANTALLA ************* datos addwfpcl.OFF_COMANDO bsf porta.2 movwf portb call lcd_delay call lcd_e return .ram clrf trisb clrf trisa bcf status.ram bcf porta.2 .***************** MANDA COMANDO A LCD *********************** lcd_reg bsf status.1 retlw 'U' retlw 'N' retlw 'I' retlw 'V' retlw 'E' retlw 'R' retlw 'S' retlw 'I' retlw 'D' retlw 'A' retlw 'D' retlw ' ' .0 .

retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw 'D' 'E' 'L' 'A' '' 'S' 'A' 'L' 'L' 'E' '' 'B' 'A' 'J' 'I' 'O' 0x00 .5 PROGRAMADOR *************************** .f goto lcd_delay_1 return end 5 7.f goto lcd_delay_1 decfsz temp1.******************* RETARDO DE LCD lcd_delay clrwdt movlw 0xA0 movwf temp1 clrf temp2 lcd_delay_1 decfsz temp2.