Vous êtes sur la page 1sur 21

.

LABORATORIO N 1
MICROPROCESADORES E INTERFASES
Jess Moreno, Dillam J. Daz, Vanessa Cucha B.
jesus.moreno@mail.escuelaing.edu.co, dillam.diaz@mail.escuelaing.edu.co ingrid.cuchia@mail.escuelaing.edu.co
Universidad Rosario, Escuela Colombiana de Ingeniera Julio Garavito.
Bogot, Colombia.

Resumen- El presente informe recopila el diseo e


implementacin de un sistema digital en un PIC16F877A el cual
permite jugar Picas y Fijas. El juego consiste en descubrir un
nmero de cuatro cifras y el sistema diseado muestra al usuario
dinmicamente los aciertos en la posicin correcta (Fijas) o en
diferente posicin (Picas), todo el cdigo realizado se llev a
cabo en el entorno de desarrollo integrado MPLAB v.8 lo que
permiti la sntesis e implementacin del mismo. En las
secciones que contemplan este documento se explicar el
desarrollo y la solucin al problema planteado.
Palabras Claves- juego Picas y Fijas, microcontrolador,
MPLAB v.8, PIC16F877A.
I.

INTRODUCCIN

Los microcontroladores son circuitos integrados capaces de


ejecutar rdenes que fueron grabadas en su memoria. Su
composicin est dada por varios bloques funcionales, los
cuales cumplen una tarea especfica. Estos dispositivos
operan uno o ms procesos, por lo general, estn basados en
arquitectura tipo Harvard, la cual consiste en dispositivos de
almacenamiento separados (memoria de programa y
memoria de datos). Son ampliamente utilizados para
controlar diversos sistemas, como aplicaciones industriales
de automatizacin y robtica.
Entre la gran familia de microcontroladores se tiene el
PIC16F877A el cual cuenta con memoria de programa tipo
FLASH, lo que genera facilidad en el desarrollo de
prototipos al permitir reprogramarlo sin necesidad de
borrarlo con anterioridad. El encapsulado para este tipo de
microcontrolador es el DIP (Dual In-line Pin) de 40 pines
los cuales se organizan en 5 puertos [1] como se ve en la
Figura 1.

Figura 1. Distribucin de los puertos y pines del


microcontrolador PIC16F877A [1].
Todo microcontrolador requiere de un circuito externo que
le indique la velocidad a la cual debe trabajar, se habla
entonces del oscilador y en este caso se trabaja con uno tipo
XT cristal de 4MHz el cual internamente posee una
frecuencia que est dividida por cuatro lo que indica que la
frecuencia de trabajo es de 1Mhz luego cada instruccin que
se ejecute se da en un microsegundo su conexin se realiza
como se muestra en la Figura 2
.

Figura 2. Conexin oscilador tipo XT [2]


Es importante resaltar la importancia que tiene el PICKIT 3
en la programacin del microcontrolador utilizando el

.
entorno de desarrollo MPLAB al permitir programar el
micro en tiempo real con su propio hardware.
El objetivo del proyecto es comprender y manejar el
lenguaje ensamblador en el modelamiento de sistemas
digitales por medio de la programacin del
microcontrolador PIC16F877A en la creacin del juego Picas
y Fijas para de esta manera trascender en forma prctica la
teora vista en clase.
.
II. METODOLOGA

Para emprender la implementacin del sistema se realiz un


esquema general del circuito. Esta etapa de pre-diseo
facilit la definicin de una metodologa para la solucin
del laboratorio, ya que nos estamos familiarizando con la
programacin
del
microcontrolador
en
lenguaje
ensamblador. La etapa de pre-diseo grfico nos permiti
tener una visin ms clara del acople de los componentes y
descripcin interna de los mismos de igual manera se
realizaron diagramas de flujo para visualizar y tener un
concepto ms claro y detallado de lo que se quera realizar
permitiendo la ejecucin del cdigo de una forma ms clara
y funcional (Ver Fig. 1 en Anexo 1).

El registro para este proceso se llama visu01 que indica la


posicin de la pantalla con la cual se desea visualizar.

Se cre un registro llamado A el cual se encarga de la


decodificacin de la corriente, empleando un decodificador
(74LS138P) 3 a 8 , las 3 entradas para decodificar las 8
salidas y 1 enable. Para poder visualizar lo primero que se
realiza es configurar el dato que se desea por el puerto C
siendo este de nivel bajo y el puerto D nivel alto ya que
nuestro display de visualizacin tiene 16 segmentos para
pintar.

Por lo tanto si se desea pintar en el primer display se manda


el dato de decodificacin, en este caso seria 0000 cuando el
bit 4 del PORTA est a nivel alto, el enable est en 1 se
habilita para pintar y cuando est en 0 se deshabilita para
pintar. Una vez configurado el valor que se desea mostrar
por el PORTA se habilita el display.

2.1 Visualizacin Dinmica

Cada vez que se asigna una letra o nmero a un display se


espera un tiempo determinado (retardo) de 400ms para
asignar esa letra al display siguiente hasta garantizar que
recorriera los 8 displays.

Este proceso se implement en 8 displays alfanumricos y


para lograr la visualizacin dinmica se define un registro
para cada uno de los display con el principio de que si se
desea utilizar , se van a reutilizar y solo se van a escribir
sobre ellos el mensaje a visualizar esto es para solo llamar
una funcin con variables globales las cuales van a ser
reescritas por el mensaje que deseamos. La forma de poder
escribir sobre estos displays es la utilizacin y la ubicacin
PCL.

Tabla 1. Decodificacin de la visualizacin.

Con la ubicacin del PCL primero se dio la posicin y se


configura el PCLATH este brinda la ubicacin con la tabla
de la decodificacin respectiva para cada led (Ver Tabla 1),
Como son 8 displays se necesita un registro a nivel bajo y
nivel alto los cuales van a ser reescritos con su mismo valor.

NMLKJH
0
1
2
3
NUMERO 4
S
5
6
7
8
9

11111111
11111111
11111111
11111111
11111111
11111111
11111111
11111111
11111111
11111111

G2G1FEDCBA
(L)
11000000
11111001
00100100
00110000
00011001
00010010
00000010
11111000
00000000
00010000

A
G
M
E
O
P
F
MENSAJE H
GANADO
L
R
N
R
W
I
*
-

11111111
11111111
11111010
11111111
11111111
11111111
11111111
11111111
11111111
11110110
11110111
11010111
11101101
11000000
11111111
11111111

00001000
01000010
11001001
00000110
01000000
00001100
00001110
00001001
11000111
11001001
00001100
11001001
11110110
11111111
00111111
11111111

Tabla 2. Entradas decodificador que habilita los


displays

A2
0
0
0
0
1
1
1
1

A1
0
0
1
1
0
0
1
1

A0
0
1
0
1
0
1
0
1

La entrada de los datos se implement en un teclado


matricial 4x4 donde:

G Guardas

A Nmero Aleatorio

T Enter

M Leer

J Cargar nmero de la EEPROM

El teclado, que est conectado al puerto B de la manera


indicada en la figura 5, se encargaba de asignar los
nmeros presionados a los registros de datos. Este
teclado est compuesto por 16 pulsadores, los cuales,
dependiendo de la configuracin del switch asignaban
cierta letra a los registros de visualizacin

DISP ON
0
1
2
3
4
5
6
7
Figura 3. Teclado matricial 4x4

2.2 Teclado

2.3 Modo Sleep


Se realiza una configuracin del puerto INTCON Y
OPTION_REG (Opcin de Registro) este realiza la
configuracin de la velocidad de los ciclos de las
interrupciones, en este caso se configura 256 habilitando el
TIMER0 (TMR0IE), este timer es un paralelo al reloj lo

.
cual permite hacer operaciones cuando se active su flanco
por ende cada vez que halla un desbordamiento en el
programa va a entrar en la interrupcin. En la interrupcin
se evala si existe una interrupcin de los puertos B
entonces se dirige a teclado pero si por el contrario no existe
ninguna interrupcin se ir a los contadores.
El contador de interrupciones tiene que contar hasta 764
cuando cuenta hasta este valor es equivalente a 50 ms
tiempo estimado para entrar en este modo de bajo consumo
de energa, el valor de esto se obtuvo de la siguiente
manera:

256 256=

50
=764 pulsos
65536 ( 1 106 )

Una vez realizada la configuracin anterior existe una


bandera bandsleep sobre el main principal donde se
encuentra el ciclo que es la visualizacin, cuando dicha
bandera sea 0 se dirige a una parte del programa llamada
sleep en esta parte cuando el primer bit sea 1 se dirige a una
subrutina llamada apagar donde se pone el bit 3 del PORTA
en 0 ya que este bit es el enable y una vez dado este
proceso ya no se visualiza nada en los displays entrando al
modo sleep.
Es importante mencionar que las teclas deben tener una
posibilidad de reiniciar esa bandera, cada vez que se
presione una tecla esa bandera es igual a 0, si esta bandera
bandsleep es igual a 0 va a saltar en el ciclo.
2.4 Almacenamiento en memoria no voltil EEPROM
Para guardar el nmero aleatorio, se us el direccionamiento
indirecto, el cual permite controlar los registros
directamente, es decir, se logra acceder a la direccin del
registro como tal para manipularlo y poderlo usar. Para esto
se usaron los registros FSR y INDF, este ltimo no existe
fsicamente en el microprocesador sin embargo es usado
como un puente para lograr manipular la informacin del
registro.
Luego de tener claro el concepto de direccionamiento
indirecto solo es usar el cdigo que nos brinda el manual del
microprocesador, teniendo en cuenta que hay que cambiar
correctamente de banco y mediante un ciclo se logra
guardar el nmero que se desee.
El proceso de carga es el mismo, se realiza un ciclo con el
direccionamiento indirecto y el cdigo que nos brinda el
manual para as lograr el objetivo de cargar la informacin
guardada en la memoria no voltil.

En cuanto al modo de escritura, una vez se presione la tecla


M en el teclado matricial va al modo de escritura, cuanto
termina este modo la bandera vuelve a ser 0.
2.5 Modo de depuracin o debug
En este modo se lee el puerto PORTA en su bit 4 cuanto este
es igual a 1 quiere decir que se encuentra en el ciclo de
visualizacin normal si este bit es igual a 0 entra a este
modo. Se escogen unas variables y se envan a
decodificacin escribiendo los valores aleatorios generados,
que cuando se estn generando ya no se visualizan porque
en la parte de decodificacin se establecieron como un
asterisco (*), entonces al entrar en este modo se puede
visualizar el nmero secreto.
2.6 Mensaje para finalizar el juego (Ganador)
Para este mensaje se compara el estado 4 de las picas
cuando las fijas son 4 se realiza un XOR si el status de la
bandera es igual a 1 lo que significa que son iguales, lo que
realiza es mover al mensaje de visualizacin un mensaje que
dice Win permitiendo conocer al usuario que ha finalizado
el juego de manera satisfactoria pues descubri el nmero.
2.7 Nmero aleatorio
Este nmero se gener a partir de un registro que se va
desplazando, en este registro se toman los primeros 4 bits
ms significativos, si estos bits son mayores que el dgito 9
se realiza una suma con el nmero 6 guardando el valor
dado sobre un registro. Una vez se hallan guardado los
valores no importa que se repitan porque siempre se valida
cada estado para saber si el nmero es igual si llegado el
caso de que el nmero sea igual se vuelve a generar otro
nmero hasta ratificar que todos sean diferentes.
IV. RESULTADOS Y ANLISIS

Se obtuvo una buena implementacin y diseo del sistema


digital que contempla el juego Picas y Fijas al lograr
generar un nmero aleatorio de cuatro dgitos el cual es el
nmero a descubrir por el usuario. Se corrobora el
funcionamiento comportamental del sistema validando el
nmero de picas y fijas por cada intento que el usuario
realiza. De igual manera se cumplen con los requerimientos
establecidos del almacenamiento y lectura del nmero
aleatorio desde la memoria no voltil EEPROM, el modo de
bajo consumo de energa y el modo de depuracin, los
cuales cumpliendo totalmente los objetivos propuestos para
este laboratorio.
La parte que gener mayor dificultad en la realizacin del
cdigo fue la del guardado el numero en los registros de la

.
memoria EEPROM, esto debido a que pequeos errors en la
codificacin los cuales no eran facilmente identificables en
el procesos de simulacin. Un aspecto a mejorar del sistema
es el metdo de antirrebote para el teclado matricil, ya que, a
pesar que el sistema funcionaba acorde a las
especificaciones del laboratorio, el teclado difcultaba una
adecuada manipulacin del sistema. Cabe mencionar que el
proceso de generacin de numero aleatorio con el mtodo
LFSR resulto ser fcil de implementar en un nuero reducido
de instrucciones, por lo tanto, el procesos de validacin del
nmero implico a constante utilizacin de estas
instrucciones.
Otra dificultad en la realizacin del laboratorio fue el haber
elegido el puerto B para el ingreso de datosel, dado que no
hera posible programar el microcontrolador sobre el
montagea. El constante montar y desmontar del del
microcontrolador debilito el pin uno, pero afortunadamente
no se desprendio. En el futuro se procuara tener encuenta
este citerio a la hora de disear el sistema.

Figura 4. Montaje del circuito que desarrolla el juego Picas y Fijas con 8
displays y teclado matricial 4x4 con el microcontrolador PIC16F877A.

V. CONCLUSIONES

Como resultado del proyecto realizado, es posible concluir


que la utilizacin del ambiente de desarrollo integrado
MPLAB nos permiti editar e implementar el cdigo en
lenguaje ensamblador para la programacin del
microcontrolador desarrollando de manera eficaz el
problema planteado de la realizacin del juego Picas y Fijas.
Conocer y entender las ventajas que presentan los
microcontroladores son de gran importancia para futuras
aplicaciones al ser sistemas completos con tareas
especficas.
Finalmente cabe resaltar la importancia de este tipo de
laboratorios al permitir desarrollar y afianzar los
conocimientos vistos en clase, de igual manera nos ayuda a
generar un pensamiento estructurado, analtico y lgico para
solucionar de manera ptima los problemas planteados.

REFERENCIAS
[1] El microcontrolador PIC16F877 [Online]. Disponible en:
http://www.utp.edu.co/~eduque/arquitec/PIC16F877.pdf
[2] Qu es un microcontrolador? [Online]. Disponible en:
http://www.electronicaestudio.com/microcontrolador.htm
[3] PIC16F87XA. SEDA. [Online]. Disponible en:
http://190.24.150.73/seda/seda_wp_00/?page_id=30

Figura 5. Esquema para la visualizacin dinmica del juego Picas y Fijas.

Figura 6. Diagrama de Flujo para Interrrupciones

Figura 7. Diagrama de Flujo Nmero aleatorio.

ANEXO CDIGO
;
************************************************
**********************
; Nombre del archivo: decoTecladoInt.asm
; Fecha:
05-09-2015
; Version:
1
;
; Autor:
;
************************************************
**********************
; __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF
& _XT_OSC
list p=16f877A
; list directive to define processor
#include <p16f877A.inc> ; processor specific variable
definitions
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF
& _PWRTE_OFF & _XT_OSC & _WRT_OFF &
_LVP_OFF & _CPD_OFF
; '__CONFIG' directiva usada para la palabra de
configuracin
; Las etiquetas que siguen a la directiva estan definidas en el
archivo .inc
; Revise el datasheet para informacin sobre la palabra de
configuraci?n
;***** VARIABLE DEFINITIONS
w_temp
EQU 0x7D ; variable used for context saving
status_temp EQU 0x7E ; variable used for context
saving
pclath_temp EQU 0x7F ; variable used for context
saving
;
************************************************
**********************
;DEFINICION DE VARIABLES
;
************************************************
**********************
tec
EQU
0x22 ;variable que almacena el valor de
la tecla pulsad
ret1
EQU
0x23

ret2
EQU
0x24 ; variables para retardo
visu01
EQU
0X25 ; VISUALIZACION BAJA
SEGEMENTO 1
cont_part_b EQU
0X26 ; contador ready
pifi01
EQU
0X70 ; numero generado 1
visu02
EQU
0X27 ; VISUALICACI?N BAJA
SEGEMENTO 2
cont_part_a EQU
0X28 ; contador read
pifi02
EQU
0X71 ; nmero generado 2
visu03
EQU
0X29 ; VISUALICACI?N BAJA
SEGEMENTO 3
pifi03
EQU
0X72 ; nmero generado 3
visu04
EQU
0X2B ; VISUALICACI?N BAJA
SEGEMENTO 4
pifi04
EQU
0X73 ; nmero generado 4
visu05
EQU
0X2D ; VISUALICACI?N BAJA
SEGEMENTO 5
valnum
EQU
0X2E ; valida el nmero
visu06
EQU
0X2F ; VISUALICACI?N BAJA
SEGEMENTO 6
cont_dato_1 EQU
0X30 ; contador dato de entrada
visu07
EQU
0X31 ; VISUALICACIN BAJA
SEGEMENTO
visu08
EQU
0X33 ; VISUALICACIN BAJA
SEGEMENTO 8
cont_ret1
EQU
0X34 ;RETARDO PARA EL RELOJ
cont_ret2
EQU
0X36 ;RETARDO PARA EL
RELOJ2
cont_ale
EQU
0X37 ;contador del nmero aletorio
numale
EQU
0X38 ;nmero aletorio
entdato01
EQU
0X32 ; dato de entrada 1
entdato02
EQU
0X39 ; dato de entrada 2
entdato03
EQU
0X3a ; dato de entrada 3
entdato04
EQU
0X3b ; dato de entrada 3
bandera
EQU
0X3c ; dato de entrada 3
pica
EQU
0X40 ; numero de picas
fija
EQU
0X41
bandsleep
EQU
0X42
entdatopica EQU
0x43 ; valor a analisar
ret3
EQU
0x44 ;variables para retardo
cont_in1
EQU
0X45 ;CONTADOR DE INTENTOS
UNO
cont_in2
EQU
0X46 ;CONTADOR DE INTENTOS
D0S
cont_sleep EQU
0X47 ;CONTADOR DE EL MODO
DORMIR

direccion
EQU
0X79 ; DIRECCION DE LA
MEMORIA EEPROM
guardado1
EQU
0X74 ; dato guardado en la
memeoria
guardado2
EQU
0X75 ; dato guardado en la
memeoria
guardado3
EQU
0X76 ; dato guardado en la
memeoria
guardado4
EQU
0X77 ; dato guardado en la
memeoria
dato
EQU
0X78 ; DATO GUARDADO PARA
ESCRIBIR
BANDERA1
EQU
0X4E ; DATO GUARDADO
PARA ESCRIBIR
datoreg
EQU
0X7A
;
************************************************
**********************
ORG
0x000
;vector de reinicializaci?n del
procesador
nop
; nop required for icd
; go to beginning of program
goto main
;ir a main
ORG
0x004
interrupciones

;localizaci?n del vector de

movwf w_temp
; save off current W register
contents
movf STATUS,w
; move status register into W
register
movwf status_temp ; save off contents of STATUS
register
movf PCLATH,w
; move pclath register into w
register
movwf pclath_temp ; save off contents of PCLATH
register
BTFSC INTCON,RBIF
goto TECLADOin
goto ingresosleep

ingresosleep:

incf cont_part_b,f ; aumenta la parte inferior del


progrma
movf cont_part_b,w
xorlw .0 ;
compar cuando se desborde es igual a
cero
btfsc STATUS,Z
incf cont_part_a,f ;incrementa el estado alto
movf cont_part_b,w ;comparar con el numero de
intentos deceasos
xorlw 0xfb
;toca contar hasta 763 con el de menor
valor vamos a contar hasta 256
btfss STATUS, Z
;cuando se cumpla esta condicion
goto fin
movf cont_part_a,w
xorlw .2
btfss STATUS,Z
; CUMPLIO EL NUMERO DE
INTERRUCCIONES NECESARIAS PARA LLAMAR
SLEEP
goto fin
bsf bandsleep,0
; bandera para dormir el programa

call tecla1
;va a tecla1, si fila 1 = 0
btfss PORTB,6
call tecla5
;va a tecla5, si fila 2 = 0
btfss PORTB,5
call tecla9
;va a tecla9, si fila 3 = 0
btfss PORTB,4
call teclaB2
;va a teclaD, si fila 4 = 0
;******BARRIDO PARA TERCERA COLUMNA
movlw b'00001101'
movwf PORTB
;asigna 0 l?gico a la columna 3
btfss PORTB,7
call tecla2
;va a tecla2, si fila 1 = 0
btfss PORTB,6
call tecla6
;va a tecla6, si fila 2 = 0
btfss PORTB,5
call teclaMas
;va a teclaA, si fila 3 = 0
btfss PORTB,4
call teclaB3
;va a teclaE, si fila 4 = 0
;******BARRIDO PARA CUARTA COLUMNA
movlw b'00001110'

TECLADOin:
clrf TMR0
clrf cont_part_b
porque se esta usando
clrf cont_part_a
se esta usando

movwf PORTB
;asigna 0 l?gico a la columna 4
btfss PORTB,7
call tecla3
;va a tecla3, si fila 1 = 0
btfss PORTB,6
call tecla7
;va a tecla7, si fila 2 = 0
btfss PORTB,5
call teclaMenos ;va a teclaB, si fila 3 = 0
btfss PORTB,4
call teclaB4
;va a teclaF, si fila 4 = 0

; limpiar timer0
; Borro contador del timer
; Borro contador del timer porque

;******Antirebote por software


call retardo100ms ;retardo de 100 ms para
Fosc=4MHz
;******BARRIDO PARA PRIMERA COLUMNA
movlw b'00000111'
movwf PORTB
;asigna 0 l?gico a la columna 1
;call retardo50ms
btfss PORTB,7
call tecla0
;va a tecla0, si fila 1 = 0
btfss PORTB,6
call tecla4
;va a tecla4, si fila 2 = 0
btfss PORTB,5
call tecla8
;va a tecla8, si fila 3 = 0
btfss PORTB,4
call teclaB1
;va a teclaC, si fila 4 =
;******BARRIDO PARA SEGUNDA COLUMNA
movlw b'00001011'
movwf PORTB
;asigna 0 l?gico a la columna 2
btfss PORTB,7

;Ingreso de Datos para el programa tener encuenta la


interrucci?nes.
;btfss bandera,5
;goto final
;call ingreso
movlw b'11110000'
movwf PORTB ;lectura del puerto B para poder
; isr code can go here or be located as a call subroutine
elsewhere
fin:
bcf INTCON,RBIF ;borrar bandera
bcf INTCON, TMR0IF ; salir del modo de interruccin

movf pclath_temp,w ; retrieve copy of PCLATH


register
movwf PCLATH
; restore pre-isr PCLATH
register contents
movf status_temp,w ; retrieve copy of STATUS
register
movwf STATUS
; restore pre-isr STATUS
register contents
swapf w_temp,f
swapf w_temp,w
; restore pre-isr W register
contents
retfie

; return from interrupt

main
;******CONFIGURACI?N DE PUERTOS E
INTERRUPCIONES
bsf
STATUS,RP0 ;banco 1
movlw b'11110000' ;Puerto B <7:4> entradas
movwf TRISB & 0x7F ;puerto B <3:0 salida
movlw b'11100000' ;Puerto a <7:5> entradas
movwF TRISA & 0x7f ;Verificaci?n y accinaci?n de
valores (valores de a entrada
bcf
OPTION_REG,7 ;Habilita las pull-ups del
Puerto B
movlw 0x06
movwf ADCON1
; configurar como analogicas

movlw b'11000000' ;valores de entrada <7:6>


valores de salida <5:0>
movwf TRISD & 0x7f
movlw 0x00
;puerto D de salida
movwf TRISC & 0x7f ;puerto C de salida ; la
visualizacion se utiliza c0:a
bcf
STATUS,RP0 ;banco 0
;------------------------------- Configurar
timer-----------------------------------------bsf INTCON, TMR0IE
; HABILITO
INTERRUPCION TIMER
bcf INTCON, TMR0IF
; Borro bandera
de interrupcion por timer
bsf STATUS, RP0
; cambio banco
1

bcf OPTION_REG, T0CS


; HABILITO
FUNCIONE RELOJ INTERNO
bcf OPTION_REG, PSA
; Asignar la
preescala al modulo timer
bsf OPTION_REG, PS0
;
CONFIGURAR RATA 256
bsf OPTION_REG, PS1
;
CONFIGURAR RATA 256
bsf OPTION_REG, PS2
;
CONFIGURAR RATA 256
bcf STATUS,RP0 ;banco 0
bsf INTCON,RBIE ;habilitar interrupcion por cambi
bsf INTCON,GIE ;habilitar interrucpciones
clrf
clrf

tec
;tecla <- 0
PORTB

;---------------------Cambio de banco ------- Cierre de


configuraciones ----------------; numero semillar asignar a numale
movlw 0xf0
movwf numale
clrf cont_dato_1
clrf cont_in1
clrf cont_in2
clrf cont_sleep
clrf guardado1
clrf guardado2
clrf guardado3
clrf guardado4
call mensb
CLRF BANDERA1
clrf bandsleep
call reinicio
clrf cont_in1
ciclo:
;mensaje de ganar la partida
;............ MODO LECTURA ................
BTFSC BANDERA1,5
CALL LECTURARR
;............ MODO ESCRITU ................
BTFSC BANDERA1,7
CALL EESCRIBIRR ;CALL LECTURARR

;............ MODO SLEEP ................


btfsc bandsleep,0
goto apagar
;............ MODO DEBUG ................
btfsc PORTA,4
call debug
;............ MODO MENSAJE GANO ................
movf fija,w
xorlw .4
btfsc STATUS,Z
call gano
;............ PANTALLA ................
call deco
;mostrar el valor de tecla por el puerto A
goto

ciclo

;*******Ejecucion de operaciones segun la tecla


presionada

tecla0:
movlw 0x0
movwf tec
de analisar
call ingre
clrf bandsleep
return

; equivalencia del valor 1

tecla2:
movlw 0x2
movwf tec
de analisar
call ingre

tecla3:
movlw 0x3
movwf tec
de analisar
call ingre
clrf bandsleep
return

tecla4:
movlw 0x4
movwf tec
de analisar
call ingre
clrf bandsleep
return
tecla5:
movlw 0x5
movwf tec
de analisar
call ingre
clrf bandsleep
return

; equivalencia del valor 1

tecla6:
movlw 0x6
movwf tec
de analisar
call ingre
clrf bandsleep
return

; equivalencia del valor 1

tecla7:
movlw 0x7
movwf tec
de analisar
call ingre
clrf bandsleep
return

tecla1:
movlw 0x1
movwf tec
de analisar
call ingre
clrf bandsleep
return

clrf bandsleep
return

tecla8:

; equivalencia del valor 1

; equivalencia del valor 1

; equivalencia del valor 1

; equivalencia del valor 1

; equivalencia del valor 1

movlw 0x8
movwf tec
de analisar
call ingre
clrf bandsleep
return
tecla9:
movlw 0x9
movwf tec
de analisar
call ingre
clrf bandsleep
return
teclaMas:

; equivalencia del valor 1

; equivalencia del valor 1

; increse dato

;movf tecla,w
;movwf entdato01
clrf bandsleep
return
;retorna
teclaMenos:
return
teclaB1:
;general numero aletorio
clrf bandsleep
call asignacion_pifi
call visualaleatorio
call reinicio
clrf cont_in1
clrf cont_in2
return
teclaB2:
; ingresar datos
clrf bandsleep
call visualing
incf bandera,f
movf bandera,w
xorlw 0x05
btfss STATUS,Z
return
call fijas
call picas
movf pica,w
xorlw .4
btfss STATUS,Z
goto reinicio
movf fija,w

xorlw .4
btfss STATUS,Z
goto reinicio
return

return

teclaB3:
clrf bandsleep
BSF BANDERA1,5
return
teclaB4: ; GUADAR
clrf bandsleep
BSF BANDERA1,7
return

apagar:
bcf PORTA,3
goto reposo

; apaga todos los displays

reposo:
clrwdt ; refrestar el perro guardairn
sleep ; entrada al modo de bajo consumo
bcf PIR1,TMR1IF
goto ciclo

;----------------------------reinicio y contador de
intentos .................
reinicio:
clrf bandera
clrf pica
clrf fija
movlw .24
movwf entdato01
movwf entdato02
movwf entdato03
movwf entdato04
incf cont_in1,f
movf cont_in1,w
xorlw .9
btfsc STATUS,Z
goto conteo

conteo:
clrf cont_in1
incf cont_in2,f
return

;----------------------------ingreso .................
ingre:
movf bandera,w
xorlw 0x01
btfsc STATUS,Z
call ing00
movf bandera,w
xorlw 0x02
btfsc STATUS,Z
call ing01
movf bandera,w
xorlw 0x03
btfsc STATUS,Z
call ing02
movf bandera,w
xorlw 0x04
btfsc STATUS,Z
call ing03
call deco
return
ing00:
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
movf

.15
visu08
.25
visu07
.16
visu06
.25
visu05
tec,w

movwf entdato01
movf entdato01,w
movwf visu04

; Unidades de mil

movlw
movwf
movlw
movwf
movlw
movwf
return
ing01:
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf

.24
visu03
.24
visu02
.24
visu01

; centenas
; decenas
; unidades

movlw
movwf
movlw
movwf
return
ing02:
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf

.24
visu02
.24
visu01

.15
visu08
.25
visu07
.16
visu06
.25
visu05

movf entdato01,w
movwf visu04

; decenas
; unidades

return
ing03:
movlw .15
movwf visu08
movlw .25
movwf visu07
movlw .16
movwf visu06
movlw .25
movwf visu05
movf entdato01,w
movwf visu04

tec,w

movwf entdato02
movf entdato02,w
movwf visu03

movf tec,w
movwf entdato03
movf entdato03,w
movwf visu02
movlw .24
movwf visu01

.15
visu08
.25
visu07
.16
visu06
.25
visu05

movf entdato01,w
movwf visu04
movf

movf entdato02,w
movwf visu03

; centenas

movf entdato02,w
movwf visu03
movf entdato03,w
movwf visu02

; decenas
; unidades

movf tec,w
movwf entdato04
movf entdato04,w
movwf visu01
return

;----------------------------------SUBRUTINAS....................................................
fijas:
clrf
clrf
clrf

bandera
fija
pica

movf entdato01,w
xorwf pifi01,w
btfsc STATUS,Z
incf fija,f
movf entdato02 ,w
xorwf pifi02,w
btfsc STATUS,Z
incf fija,f
movf entdato03 ,w
xorwf pifi03,w
btfsc STATUS,Z
incf fija,f
movf entdato04,w
xorwf pifi04,w
btfsc STATUS,Z
incf fija,f
movf fija,w
movwf visu05
return
picas:
clrf bandera
movf entdato01,w
movwf entdatopica
movf bandera,w
xorlw 0x00
btfsc STATUS,Z
call comparapica1
movf entdato02,w
movwf entdatopica
movf bandera,w
xorlw 0x01
btfsc STATUS,Z
call comparapica2
movf entdato03,w
movwf entdatopica
movf bandera,w
xorlw 0x02
btfsc STATUS,Z
call comparapica3
movf entdato04,w
movwf entdatopica
movf bandera,w
xorlw 0x03
btfsc STATUS,Z
call comparapica4
movf pica,w

movwf visu07
clrf bandera
return

movf entdatopica,w
xorwf pifi01,w
btfsc STATUS,Z
incf pica,f

comparapica1:
movf entdatopica,w
xorwf pifi02,w
btfsc STATUS,Z
incf pica,f
movf entdatopica,w
xorwf pifi03,w
btfsc STATUS,Z
incf pica,f
movf entdatopica,w
xorwf pifi04,w
btfsc STATUS,Z
incf pica,f
incf bandera,f
return
comparapica2:
movf entdatopica,w
xorwf pifi01,w
btfsc STATUS,Z
incf pica,f

movf entdatopica,w
xorwf pifi03,w
btfsc STATUS,Z
incf pica,f
movf entdatopica,w
xorwf pifi04,w
btfsc STATUS,Z
incf pica,f
incf bandera ,f
return
comparapica3:

movf
xorwf
btfsc
incf
movf
xorwf
btfsc
incf

entdatopica,w
pifi02,w
STATUS,Z
pica,f
entdatopica,w
pifi04,w
STATUS,Z
pica,f

incf bandera,f
return
comparapica4:
movf entdatopica,w
xorwf pifi01,w
btfsc STATUS,Z
incf pica,f
movf entdatopica,w
xorwf pifi02,w
btfsc STATUS,Z
incf pica,f
movf entdatopica,w
xorwf pifi03,w
btfsc STATUS,Z
incf pica,f
incf bandera,f
return
;-----------------------------------visualizaci?
n ....................................................
EESCRIBIRR:
; guarda el dato numero uno
movf pifi01,w
movwf dato
movlw .0
movwf direccion
call escritura
bcf STATUS,RP0 ;banco 0

bcf STATUS,RP1 ;banco 0


; guarda el dato numero dos
movf pifi02,w
movwf dato
movlw .1
movwf direccion
call escritura
bcf STATUS,RP0 ;banco 0
bcf STATUS,RP1 ;banco 0
; guarda el dato numero tres
movf pifi03,w
movwf dato
movlw .2
movwf direccion
call escritura
bcf
STATUS,RP0 ;banco 0
bcf
STATUS,RP1 ;banco 0
; guarda el dato numero cuatro
movf pifi04,w
movwf dato
movlw .3
movwf direccion
call escritura
bcf
STATUS,RP0 ;banco 0
bcf
STATUS,RP1 ;banco 0
;retornas la banderas a su forma normal
call esctvisul
BCF
BANDERA1,7
bcf
STATUS,RP0 ;banco 0
bcf
STATUS,RP1 ;banco 0
return
LECTURARR:
;lectura del primer dato
bcf
STATUS,RP0 ;banco 0
bcf
STATUS,RP1 ;banco 0
movlw .0
movwf direccion
CALL lectura
movf datoreg,w
movwf guardado1
;lectura del segundo dato
bcf
STATUS,RP0 ;banco 0
bcf
STATUS,RP1 ;banco 0
movlw .1
movwf direccion

CALL lectura
movf datoreg,w
movwf guardado2
;lectura del segundo dato
bcf
STATUS,RP0 ;banco 0
bcf
STATUS,RP1 ;banco 0
movlw .2
movwf direccion
CALL lectura
movf datoreg,w
movwf guardado3
;lectura del segundo dato
bcf
STATUS,RP0 ;banco 0
bcf
STATUS,RP1 ;banco 0
movlw .3
movwf direccion
CALL lectura
movf datoreg,w
movwf guardado4
;retornas la banderas a su forma normal
bcf
STATUS,RP0 ;banco 0
bcf
STATUS,RP1 ;banco 0
call lectvisul
BCF BANDERA1,5
RETURN
lectura:
BANKSEL PORTB
movf direccion,w ; mover la direcci?n al registro w
BANKSEL EEADR
MOVWF EEADR
;direcci?n donde se va a leer el
dato
BANKSEL EECON1
bcf EECON1, EEPGD
bsf EECON1, RD
BANKSEL EEDATA
MOVF EEDATA,W ; Dato se almacena en el registro
W
BANKSEL PORTB
movwf datoreg
RETURN
escritura:
BANKSEL EECON1

BTFSC EECON1,WR
;Espera que se complete o no
haya
GOTO $-1
;iniciado un ciclo de escritura
BANKSEL PORTA
MOVF direccion,W
BANKSEL EEADR
MOVWF EEADR
escribir el dato
BANKSEL PORTA

;Direcci?n donde se va a

MOVF dato,W
BANKSEL EEDATA
MOVWF EEDATA
;Dato que se va a escribir en la
memoria
BANKSEL EECON1
BCF EECON1,EEPGD ;Selecciona operaci?n en la
memoria EEPROM de datos
BSF EECON1,WREN ;Habilita la escritura
MOVLW 0x55
;secuencia requerida
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1,WR
;Iniciar ciclo de escritura
BANKSEL EECON1
bcf EECON1, WREN
BANKSEL PORTB
RETURN

movlw .25
movwf visu03
movlw .11
movwf visu02
movlw .14
movwf visu01
call deco
return
lectvisul:
movlw .12
movwf visu08
movlw .22
movwf visu07
movlw .20
movwf visu06
movlw .10
movwf visu05
movf guardado1,w
movwf visu04
movf guardado2,w
movwf visu03
movf guardado3,w
movwf visu02
movf guardado4,w
movwf visu01
call deco
return
gano:
call mensf
return

esctvisul:
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf

.25
visu08
.19
visu07
.14
visu06
.21
visu05
.25
visu04

visualing:
movlw .15
movwf visu08
movf pica,w
movwf visu07
movlw .16
movwf visu06
movf fija,w
movwf visu05

; Unidades de mil
; centenas
; decenas
; unidades

movf entdato01,w
movwf visu04
movf entdato02,w
movwf visu03
movf entdato03,w
movwf visu02
movf entdato04,w
movwf visu01
return
debug:
movf pifi01,w
movwf visu08
movf pifi02,w
movwf visu07
movf pifi03,w
movwf visu06
movf pifi04,w
movwf visu05
movf entdato01,w
movwf visu04
movf entdato02,w
movwf visu03
movf entdato03,w
movwf visu02
movf entdato04,w
movwf visu01
return

visualaleatorio:
movlw .10
posici?n 8
movwf visu08
movlw .18
en la posici?n 7
movwf visu07
movlw .13
display l en la posici?n 6
movwf visu06
movlw .24
display a en la posici?n 5
movwf visu05
movlw .23
movwf visu04
movlw .23

; Unidades de mil
; centenas

movwf
movlw
movwf
movlw
movwf
return

visu03
.23
visu02
.23
visu01

; centenas
; decenas
; unidades

movwf visu02
movf cont_in1,w
movwf visu01
return
;-----------------Numero aletorio--------------- genera el
moviento del vector aletorio

; decenas
; unidades

; Unidades de mil
; centenas
; decenas
; unidades
; Unidades de mil
; centenas
; decenas
; unidades

mensb:
movlw .17
; mueve a display H en la
posici?n 8
movwf visu08
movlw .14
; mueve a display o
en la posici?n 7
movwf visu07
movlw .18
; mueve a
display l en la posici?n 6
movwf visu06
movlw .10
; mueve a
display a en la posici?n 5
movwf visu05
movlw .25
; mueve a
display (vasio) en la posici?n 5
movwf visu04
movlw .15
movwf visu03
movlw .25
movwf visu02
movlw .16
movwf visu01
return

; mueve a display H en la
; mueve a display o
; mueve a
; mueve a

; Unidades de mil

mensf:
movlw .21
movwf visu08
movlw .22
movwf visu07
movlw .19
movwf visu06
movlw .25
movwf visu05
movlw .15
movwf visu04
movlw .16
movwf visu03
movf cont_in2,w

aleatorio:
clrf cont_ale
realizar

;reinicia el contador del registro a


; 9 55 7,5,4,2

btfsc numale, 4
incf cont_ale, 1
btfsc numale, 5
incf cont_ale, 1
btfsc numale, 6
incf cont_ale, 1
btfsc numale, 0
incf cont_ale, 1
BTFSC cont_ale, 0
goto mov1
registro
goto mov0

x8+x6+x5+x4+1

; le mueve un uno al valor del

mov0:
bcf STATUS,C
el analisis de Xor
rrf numale,1
return
mov1:

; le mueve un 0 al registro en

bsf STATUS,C
el analisis de Xor
rrf numale,1
return

; le mueve un 1 al registro en

generanum:
movf numale,w
a la variable global

; valida el numero aleatorio


; asigna el valor de numale

movwf valnum
reutilizar la funcion
call valida_10a15
la variable global

; variable global para


; asigna el valor de numale a

movf valnum,w
guardar 2
movwf pifi02
goto valida_pifi

; el numero listo que se desea

return
valida_pifi2_3:
asignacion_pifi:
call aleatorio
call generanum
movf valnum,w
guardar
movwf pifi01
generado a la posicion 1
call aleatorio
call generanum
movf valnum,w
guardar 2
movwf pifi02
generado a la posicion
call aleatorio
call generanum
movf valnum,w
guardar 3
movwf pifi03
generado a la posicion
call aleatorio
call generanum
movf valnum,w
guardar 4
movwf pifi04
call valida_pifi
return

; el numero listo que se desea


; mueve el numero

; el numero listo que se desea


; mueve el numero

; el numero listo que se desea


; mueve el numero

; el numero listo que se desea

valida_pifi1_3:
movf pifi01,w
xorwf pifi03,w
btfss STATUS,Z
goto valida_pifi3_4
call aleatorio
call generanum
movf valnum,w
guardar 2
movwf pifi03
goto valida_pifi2_3

; el nmero listo que se desea

valida_pifi3_4:

valida_pifi:
; realiza la validaci?n de los
numeros generales , no necesita condici?n incial
movf pifi01,w
1 y dos no sean iguales
xorwf pifi02,w
btfss STATUS,Z
genera otra vez
goto valida_pifi2_3
call aleatorio
call generanum

movf pifi02,w
xorwf pifi03,w
btfss STATUS,Z
goto valida_pifi1_3 ; valida con el nmero 1 si es igual
vuelve a generar el numero 3
call aleatorio
call generanum
call generanum
movf valnum,w
; el nmero listo que se desea
guardar 2
movwf pifi03
goto valida_pifi2_3

; valida que el numero


; si son iguales z=1 lo

movf pifi03,w
xorwf pifi04,w
btfss STATUS,Z
goto valida_pifi4_1
call aleatorio
call generanum
movf valnum,w
guardar 2
movwf pifi04
goto valida_pifi3_4

; el numero listo que se desea

valida_pifi4_1:
movf pifi01,w
xorwf pifi04,w
btfss STATUS,Z
goto valida_pifi4_2
call aleatorio
call generanum
movf valnum,w
guardar 2
movwf pifi04
goto valida_pifi3_4

; el numero listo que se desea

valida_pifi4_2:
movf pifi02,w
xorwf pifi04,w
btfss STATUS,Z
return
call aleatorio
call generanum
movf valnum,w
guardar 2
movwf pifi04
goto valida_pifi4_1

; el nmero listo que se desea

valida_10a15: ; valida que el numero generado no sea


mayor de 0 a 9
clrf STATUS
movlw 0x0f
andwf valnum,1 ; valida los 4 bits ms significativos
btfss valnum,3 ; esto quiere decir que el nmero est
entre 0 y 7
return
btfsc valnum,2 ; Se descarta que el nmero sea mayor a
12
goto suma6
btfsc valnum,1 ; se revisa que el nmero no sea mayor a
11
goto suma6
return

suma6:
movlw .6
addwf valnum,f ; sumele 6 al numero analizar y guadarlo
en el numero generado
movlw 0x0f
andwf valnum,f
; valida los 4 bits m?s
significativos
return

;------------------------visualizacin dinmica display


--------------------------------------------------deco:
movlw 0x07
movwf PCLATH
movf
visu01,W ; VISUA01 ES EL NUMERO DE
LA PANTALLA A DIVISUALIZAR nivel bajo
call visuaL
movwf PORTC ; NIVEL BAJO
movf
visu01,W ; VISUA01 ES EL NUMERO DE
LA PANTALLA A DIVISUALIZAR nivel Alto
call visuaH ; PINTA A NIVEL ALTO
movwf PORTD
;CONFIGURACION VISUALIZACI?N DINAMICA
movlw
b'00001000' ; habilita el enable para la
visualizacin primer segmento
movwf
PORTA
call
retardo
; valor para retener el numero
bcf
PORTA,3
; apaga todos los displays
;------------------------visualizacin 2 display
--------------------------------------------------movlw 0x07
movwf PCLATH
movf
visu02,W ; VISUA02 ES EL NUMERO DE
LA PANTALLA A DIVISUALIZAR
call visuaL
movwf PORTC ; NIVEL BAJO

movf
visu02,W ; VISUA02 ES EL NUMERO DE
LA PANTALLA A DIVISUALIZAR nivel Alto
call visuaH ; PINTA A NIVEL ALTO
movwf PORTD

movlw
b'00001011' ; habilita el enable para la
visualizaci?n primer segmento
movwf
PORTA
call
retardo
; valor para retener el numero
bcf
PORTA,3
; apaga todos los displays

;CONFIGURACION VISUALIZACI?N DINAMICA


movlw
b'00001001' ; habilita el enable para la
visualizaci?n primer segmento
movwf
PORTA
call
retardo ; valor para retener el numero
bcf
PORTA,3
; apaga todos los displays
;------------------------visualizaci?n 3 display
--------------------------------------------------movlw 0x07
movwf PCLATH
movf
visu03,W ; VISUA03 ES EL NUMERO DE
LA PANTALLA A DIVISUALIZAR
call visuaL
movwf PORTC ; NIVEL BAJO
movf
visu03,w ; nivel alto de visualizaci?n
call visuaH ; PINTA A NIVEL ALTO
movwf PORTD
;CONFIGURACION VISUALIZACI?N DINAMICA
movlw
b'00001010' ; habilita el enable para la
visualizaci?n primer segmento
movwf
PORTA
call
retardo ; valor para retener el numero
bcf
PORTA,3
; apaga todos los displays
;------------------------visualizaci?n 4 display
--------------------------------------------------movlw 0x07
movwf PCLATH
movf
visu04,W ; VISUA04 ES EL NUMERO DE
LA PANTALLA A DIVISUALIZAR
call visuaL
movwf PORTC ; NIVEL BAJO
movf
visu04,w ; visualizaci?n nivel alto
call visuaH ; PINTA A NIVEL ALTO
movwf PORTD
;CONFIGURACION VISUALIZACI?N DINAMICA

;------------------------visualizaci?n 5 display
--------------------------------------------------movlw 0x07
movwf PCLATH
movf
visu05,W ; VISUA05 ES EL NUMERO DE
LA PANTALLA A DIVISUALIZAR nivel bajo
call visuaL
movwf PORTC ; NIVEL BAJO
movf
visu05,W ; VISUA05 ES EL NUMERO DE
LA PANTALLA A DIVISUALIZAR nivel Alto
call visuaH ; PINTA A NIVEL ALTO
movwf PORTD
;CONFIGURACION VISUALIZACI?N DINAMICA
movlw
b'00001100' ; habilita el enable para la
visualizaci?n primer segmento
movwf
PORTA
call
retardo
; valor para retener el numero
bcf
PORTA,3
; apaga todos los displays
;------------------------visualizaci?n 6 display
--------------------------------------------------movlw 0x07
movwf PCLATH
movf
visu06,W ; VISUA02 ES EL NUMERO DE
LA PANTALLA A DIVISUALIZAR
call visuaL
movwf PORTC ; NIVEL BAJO
movf
visu06,W ; VISUA02 ES EL NUMERO DE
LA PANTALLA A DIVISUALIZAR nivel Alto
call visuaH ; PINTA A NIVEL ALTO
movwf PORTD
;CONFIGURACION VISUALIZACI?N DINAMICA
movlw
b'00001101' ; habilita el enable para la
visualizaci?n primer segmento
movwf
PORTA

call
bcf

retardo
; valor para retener el numero
PORTA,3
; apaga todos los displays

;------------------------visualizaci?n 7 display
--------------------------------------------------movlw 0x07
movwf PCLATH
movf
visu07,W ; VISUA03 ES EL NUMERO DE
LA PANTALLA A DIVISUALIZAR
call visuaL
movwf PORTC ; NIVEL BAJO
movf
visu07,w ; nivel alto de visualizaci?n
call visuaH ; PINTA A NIVEL ALTO
movwf PORTD
;CONFIGURACION VISUALIZACI?N DINAMICA
movlw
b'00001110' ; habilita el enable para la
visualizaci?n primer segmento
movwf
PORTA
call
retardo
; valor para retener el numero
bcf
PORTA,3
; apaga todos los displays
;------------------------visualizaci?n 8 display
--------------------------------------------------movlw 0x07
movwf PCLATH
movf
visu08,W ; VISUA04 ES EL NUMERO DE
LA PANTALLA A DIVISUALIZAR
call visuaL
movwf PORTC ; NIVEL BAJO
movf
visu08,w ; visualizaci?n nivel alto
call visuaH ; PINTA A NIVEL ALTO
movwf PORTD
;CONFIGURACION VISUALIZACI?N DINAMICA
movlw
b'00001111' ; habilita el enable para la
visualizaci?n primer segmento
movwf
PORTA
call
retardo
; valor para retener el numero
bcf
PORTA,3
; apaga todos los displays
return
;................................. Retardos----------------------retardo:

movlw .2 ; 10
movwf ret1
for1
movlw .50 ;50
movwf ret2
for2
decfsz ret2,F
goto for2
decfsz ret1,F
goto for1
return
;*******Retardo de 100 ms para evitar rebote en el
teclado
retardo100ms:
movlw .0
movwf ret2
asig_cont_ret1
movlw .102
movwf ret1
decRet1
nop
decfsz ret1,F
goto decRet1
decfsz ret2,F
goto asig_cont_ret1
return
retardo50ms:
movlw .0
movwf ret2
asig_cont_ret2
movlw .25
movwf ret1
decRet2
nop
decfsz ret1,F
goto decRet2
decfsz ret2,F
goto asig_cont_ret2
return
retardo50s:
movlw .20
movwf ret3

asig_cont_ret22
movlw .255
movwf ret2
asig_cont_ret33
movlw .255
movwf ret1
decRet22
nop
decfsz ret1,F
goto decRet22
decfsz ret2,F
goto asig_cont_ret33
decfsz ret3,F
goto asig_cont_ret22
return
;----------------------------guardado de dato y lectura en la
memoria Eeprom --------------------------------------;---------Codificaci?n de la visualizaci?
n--------------------------------------ORG 0X700
visuaL:
andlw 0x3F
addwf PCL,1
retlw
en W
retlw
en W
retlw
en W
retlw
en W
retlw
en W
retlw
en W
retlw
en W
retlw
en W
retlw
en W
retlw
en W

b'11000000' ;Si PCL es 0 retorna con este literal


b'11111001' ;Si PCL es 1 retorna con este literal
b'00100100' ;Si PCL es 2 retorna con este literal
b'00110000' ;Si PCL es 3 retorna con este literal
b'00011001' ;Si PCL es 4 retorna con este literal
b'00010010' ;Si PCL es 5 retorna con este literal
b'00000010' ;Si PCL es 6 retorna con este literal
b'11111000' ;Si PCL es 7 retorna con este literal
b'00000000' ;Si PCL es 8 retorna con este literal
b'00010000' ;Si PCL es 9 retorna con este literal

;*******************CONFIGURACI?N LETRAS
*******************+++++++++++++
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

b'00001000' ;Si PCL 10 es A


b'01000010' ;Si PCL 11 ES G
b'11001001' ;Si PCL 12 ES M
b'00000110' ;Si PCL 13 ES E
b'01000000' ;Si PCL 14 ES O
b'00001100' ;Si PCL 15 ES P
b'00001110' ;Si PCL 16 ES F
b'00001001' ;Si PCL 17 ES H
b'11000111' ;Si PCL 18 ES L
b'11001001' ;Si PCL 19 ES N
b'11001100' ;Si PCL 20 ES R
b'11001101' ;Si PCL 21 ES W
b'11110110' ;Si PCL 22 ES I
b'11111111' ;Si PCL 23 *
b'00111111' ;Si PCL 24 b'11111111' ;Si PCL 25 espacio

visuaH:
addwf PCL,1

retlw
en W
retlw
en W
retlw
en W
retlw
en W
retlw
en W
retlw
en W
retlw
en W
retlw
en W
retlw
en W
retlw
en W

b'11111111' ;Si PCL es 0 retorna con este literal


b'11111111' ;Si PCL es 1 retorna con este literal
b'11111111' ;Si PCL es 2 retorna con este literal
b'11111111' ;Si PCL es 3 retorna con este literal
b'11111111' ;Si PCL es 4 retorna con este literal
b'11111111' ;Si PCL es 5 retorna con este literal
b'11111111' ;Si PCL es 6 retorna con este literal
b'11111111' ;Si PCL es 7 retorna con este literal
b'11111111' ;Si PCL es 8 retorna con este literal
b'11111111' ;Si PCL es 9 retorna con este literal

;*******************CONFIGURACI?N LETRAS
*******************+++++++++++++

retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

END

b'11111111' ;Si PCL 10 es A


b'11111111' ;Si PCL 11 ES G
b'11111010' ;Si PCL 12 ES M
b'11111111' ;Si PCL 13 ES E
b'11111111' ;Si PCL 14 ES O
b'11111111' ;Si PCL 15 ES P
b'11111111' ;Si PCL 16 ES F
b'11111111' ;Si PCL 17 ES H
b'11111111' ;Si PCL 18 ES L
b'11110110' ;Si PCL 19 ES N
b'11110111' ;Si PCL 20 ES R
b'11010111' ;Si PCL 21 ES W
b'11101101' ;Si PCL 22 ES I
b'11000000' ;Si PCL 23 *
b'11111111' ;Si PCL 24 b'11111111' ;Si PCL 25 espacio

; directiva de fin de programa