title " La pantalla del LCD visualiza el orden de la tecla pulsada utilizando la técnica de polling"
;************************************** Tecla_01.asm ******************************************************************* ; El modulo LCD visualiza el orden de la tecla pulsada expresado en decimal. Utiliza
; técnica Polling o lectura constante del puerto al que esta conectado el teclado.
; ************************************************************************************************************************** ;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 uS. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT.
;Protección de Código: OFF.
;************************************** Elegimos PIC ******************************************************************** list p=16f877, f=inhx32
;******************* Asignación de nombres de Registros de Funciones especiales a direcciones *************** #include <p16f877.inc> ;Este fichero contiene los nombres y direcciones de los
; registros de funciones especiales.
; Este fichero esta localizado en el directorio ; con el nombre MPASM.
;************************************** Igualdades *********************************************************************** ;************************************** Registros ************************************************************************
CBLOCK 0x20
GUARDA_TECLA ; Registro que guarda el orden de la tecla pulsada. ENDC
;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset
GOTO COMIENZO ;Comienzo del Programa
;*********************************** Sección de Configuración ******************************************************** COMIENZO clrf PORTA ; Reseteamos el PORTA.
bsf STATUS,RP0 ; Ir al Banco 1.
movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1
bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD.
call Teclado_Inicializa ; Configura las líneas del teclado.
Principal call Teclado_LeeOrdenTecla ; Lee el teclado.
btfss STATUS,C ; Si se pulsa alguna tecla el Cy=1 y salta una instrucción.
goto Fin ; No, por tanto sale.
movwf GUARDA_TECLA ; Guarda el orden de la tecla pulsada. call Teclado_EsperaDejePulsar ; No sale hasta que levante el dedo. movf GUARDA_TECLA,W
call BIN_a_BCD ; Lo pasa a BCD. call LCD_ByteCompleto ; Visualiza en pantalla. Fin goto Principal
;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC> INCLUDE <BIN_BCD.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END
9.2.- Tecla_02.asm
( Entrenador Básico 7 )
title " La pantalla del LCD visualiza el valor hexadecimal de la tecla pulsada utilizando la técnica de polling"
;************************************** Tecla_02.asm ******************************************************************* ; En pantalla aparece el valor hexadecimal de la tecla pulsada. Se esta leyendo constantemente
; el teclado mediante técnica Polling.
;*************************************************************************************************************************** ;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 uS. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT.
;Protección de Código: OFF.
;************************************** Elegimos PIC ******************************************************************** list p=16f877, f=inhx32
;***************** Asignación de nombres de Registros de Funciones especiales a direcciones ***************** #include <p16f877.inc> ;Este fichero contiene los nombres y direcciones de los
; registros de funciones especiales.
; Este fichero esta localizado en el directorio ; con el nombre MPASM.
;************************************** Igualdades *********************************************************************** ;************************************** Registros ***********************************************************************
CBLOCK 0x20
GUARDA_TECLA ; Registro que guarda el valor de la tecla pulsada. ENDC
;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset
GOTO COMIENZO ;Comienzo del Programa
;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA.
bsf STATUS,RP0 ; Ir al Banco 1.
movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1
bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD.
call Teclado_Inicializa ; Configura las líneas del teclado.
;************************************* Principal ************************************************************************** Principal call Teclado_LeeHex ; Lee el teclado hexadecimal.
btfss STATUS,C ; Si se pulsa alguna tecla el Cy=1 y salta una instrucción.
goto Fin ; No, por tanto, sale.
movwf GUARDA_TECLA ; Guarda el valor de la tecla pulsada. call Teclado_EsperaDejePulsar ; No sale hasta que levante el dedo. movf GUARDA_TECLA,W
call LCD_Nibble ; Visualiza el valor en pantalla. Fin goto Principal
;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC>
INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END
9.3.- Tecl_03.asm
( Entrenador Básico 7 )
title " La pantalla del LCD visualiza el valor hexadecimal de la tecla pulsada utilizando técnicas de interrupción "
;************************************************* Tecl_03.asm ********************************************************* ; El modulo LCD visualiza el valor hexadecimal de la tecla pulsada. Para la lectura del
; teclado se utiliza la interrupción RBI o por cambio en las líneas <RB7:RB4> del Puerto B.
; ************************************************************************************************************************** ;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 uS. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT.
;Protección de Código: OFF.
;************************************** Elegimos PIC ******************************************************************** list p=16f877, f=inhx32
;**************** Asignación de nombres de Registros de Funciones especiales a direcciones ****************** #include <p16f877.inc> ;Este fichero contiene los nombres y direcciones de los
; registros de funciones especiales.
; Este fichero esta localizado en el directorio ; con el nombre MPASM.
;************************************** Igualdades *********************************************************************** ;************************************** Registros ************************************************************************
CBLOCK 0x20
GUARDA_TECLA ; Registro que guarda el valor de la tecla pulsada. ENDC
;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset
GOTO COMIENZO ;Comienzo del Programa
;************************************* Vector de Interrupción *********************************************************** ORG 4 ;Dirección del Vector de Interrupción.
GOTO Interrup ;Ir a rutina de Interrupción
;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA.
bsf STATUS,RP0 ; Ir al Banco 1.
movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1
bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD.
call Teclado_Inicializa ; Configura las líneas del teclado. movlw b'10001000' ; Habilita la interrupción RBI y la general. movwf INTCON
;************************************* Principal ************************************************************************** Principal sleep ; Espera en modo bajo consumo que pulse teclado.
goto Principal
;************************************ Rutina de Interrupción "Interrup" ************************************************* Interrupcall Teclado_LeeHex ; Obtiene el valor hexadecimal de la tecla pulsada.
movwf GUARDA_TECLA ; Guarda el valor de la tecla pulsada. call Teclado_EsperaDejePulsar ; Para que no se repita el mismo carácter movf GUARDA_TECLA,W
call LCD_Nibble ; Visualiza el valor en pantalla.
movf PORTB,w ; Necesario en proteus para limpiar flag. bcf INTCON,RBIF ; mientras permanece pulsado. Limpia flag. retfie ;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END
9.4.- Tecla_04.asm
( Entrenador Básico 7 )
title " La pantalla del LCD visualiza caracteres españoles en función de la tecla pulsada "
;************************************************** Tecla_04.asm ******************************************************* ; Supone un teclado con los 16 primeros caracteres del alfabeto español. Por tanto hay
; que cambiar la tabla respecto de los ejercicios anteriores. Lo que se va escribiendo por ; el teclado aparece en pantalla como si fuera un teclado alfabético.
;*************************************************************************************************************************** ;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 uS. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT.
;Protección de Código: OFF.
;************************************** Elegimos PIC ******************************************************************** list p=16f877, f=inhx32
;**************** Asignación de nombres de Registros de Funciones especiales a direcciones ****************** #include <p16f877.inc> ;Este fichero contiene los nombres y direcciones de los
; registros de funciones especiales.
; Este fichero esta localizado en el directorio ; con el nombre MPASM.
;************************************** Igualdades *********************************************************************** ;*************************************** Registros ***********************************************************************
CBLOCK 0x20
GUARDA_TECLA ; Registro que guarda el valor de la tecla pulsada. ENDC
;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset
GOTO COMIENZO ;Comienzo del Programa
;************************************* Vector de Interrupción *********************************************************** ORG 4 ;Dirección del Vector de Interrupción.
GOTO Interrup ;Ir a rutina de Interrupción
;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA.
bsf STATUS,RP0 ; Ir al Banco 1.
movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1
bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD.
call Teclado_Inicializa ; Configura las líneas del teclado. movlw b'10001000' ; Habilita la interrupción RBI y la general. movwf INTCON
;************************************* Principal ************************************************************************** Principal sleep ; Espera en modo bajo consumo que pulse teclado.
goto Principal
;************************************ Rutina de Interrupción "Interrup" ************************************************ ; La subrutina de atención a la interrupción obtiene el valor ASCII de la tecla pulsada.
; A continuación se expone la relaci0n entre el numero de orden de la tecla y los valores ; correspondientes para el teclado supuesto.
; ORDEN DE TECLA: TECLADO UTILIZADO: ; 0 1 2 3 A B C D ; 4 5 6 7 E F G H ; 8 9 10 11 I J K L ; 12 13 14 15 M N O P
Interrupcall Teclado_LeeOrdenTecla ; Lee el Orden de la tecla pulsada movwf GUARDA_TECLA ; Guarda el orden de la tecla pulsada. call Teclado_EsperaDejePulsar ; Para que no se repita el mismo carácter. movf GUARDA_TECLA,W
call Tecl_ConvierteOrdenEnASCII ; Lo convierte en su valor ASCII mediante call LCD_Caracter ; una tabla, y lo visualiza.
movf PORTB,W ; Necesario en proteus para limpiar flag. bcf INTCON,RBIF ; Limpia flag.
retfie
;************************************ Subrutina " Tecl_ConvierteOrdenEnASCII " ************************************ Tecl_ConvierteOrdenEnASCII addwf PCL,F ; Según el teclado utilizado resulta
DT "ABCD" ; Primera fila del teclado. DT "EFGH" ; Segunda fila del teclado. DT "IJKL" ; Tercera fila del teclado. DT "MNÑO" ; Cuarta fila del teclado.
;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC>
INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END
9.5.- Tecla_05.asm
( Entrenador Básico 7 )
title " La pantalla del LCD aparece un mensaje en movimiento y fijo en la primera línea " title " y en la segunda línea visualiza la tecla pulsada "
;************************************************* Tecla_05.asm ******************************************************** ; Primero aparece un mensaje de presentación en movimiento. Luego en la primera línea aparece
; un mensaje estático y lo que se va escribiendo por el teclado aparece en la segunda fila.
;*************************************************************************************************************************** ;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 uS. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT.
;Protección de Código: OFF.
;************************************** Elegimos PIC ******************************************************************** list p=16f877, f=inhx32
;*************** Asignación de nombres de Registros de Funciones especiales a direcciones ******************* #include <p16f877.inc> ;Este fichero contiene los nombres y direcciones de los
; registros de funciones especiales.
; Este fichero esta localizado en el directorio ; con el nombre MPASM.
;************************************** Igualdades *********************************************************************** ;*************************************** Registros ***********************************************************************
CBLOCK 0x20
GUARDA_TECLA ; Registro que guarda el valor de la tecla pulsada. ENDC
;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset
GOTO COMIENZO ;Comienzo del Programa
;************************************* Vector de Interrupción *********************************************************** ORG 4 ;Dirección del Vector de Interrupción.
GOTO Interrup ;Ir a rutina de Interrupción
;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA.
bsf STATUS,RP0 ; Ir al Banco 1.
movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1
bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD.
movlw Mensaje presentación ; Visualiza el mensaje en movimiento. call LCD_MensajeMovimiento
call LCD_Borra ; Borra la pantalla y se sitúa en la primera línea. movlw MensajePulsa ; Visualiza el mensaje fijo de la primera línea. call LCD_Mensaje
call LCD_Linea2 ; Pasa a la segunda línea. call Teclado_Inicializa ; Configura las líneas del teclado. movlw b'10001000' ; Habilita la interrupción RBI y la general. movwf INTCON
;************************************* Principal ************************************************************************** Principal sleep ; Espera en modo bajo consumo que pulse teclado.
goto Principal
;************************************ Rutina de Interrupción "Interrup" ************************************************* Interrupcall Teclado_LeeHex ; Obtiene el valor hexadecimal de la tecla pulsada.
movwf GUARDA_TECLA ; Guarda el valor de la tecla pulsada. call Teclado_EsperaDejePulsar ; Para que no se repita el mismo carácter. movf GUARDA_TECLA,W
call LCD_Nibble ; Visualiza el valor en pantalla.
movf PORTB,W ; Necesario en proteus para limpiar flag. bcf INTCON,RBIF
retfie
;******************************************* Subrutina de "Mensajes" ************************************************** Mensajes addwf PCL,F
MensajePresentacion DT " "
DT "Estudia Desarrollo de Productos Electrónicos" DT " ", 0x00
MensajePulsa DT "LUCAS, pulsa:", 0x00
;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <RETARDOS.INC> END
9.6.- Tecla_06.asm
( Entrenador Básico 7 )
title " La pantalla del LCD aparece la tecla pulsada primero " title " la línea 1 y después en la línea 2 repitiéndose el proceso "
;************************************************* Tecla_06.asm ******************************************************** ; En pantalla aparecen el código de las teclas que se van pulsando. Cuando llega al final de la primera ; línea, pasa a la segunda línea. Cuando llega al final de la segunda línea borra todo y
; comienza de nuevo al principio de la línea 1.
;*************************************************************************************************************************** ;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 uS. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT.
;Protección de Código: OFF.
;************************************** Elegimos PIC ******************************************************************** list p=16f877, f=inhx32
;**************** Asignación de nombres de Registros de Funciones especiales a direcciones ****************** #include <p16f877.inc> ;Este fichero contiene los nombres y direcciones de los
; registros de funciones especiales.
; Este fichero esta localizado en el directorio ; con el nombre MPASM.
;************************************** Igualdades *********************************************************************** CaracteresUnaLinea EQU d'16' ; Numero de caracteres de una línea.
CaracteresDosLineas EQU d'32' ; Numero de caracteres de dos líneas.
;************************************** Registros *********************************************************************** CBLOCK 0x20
GuardaTecla ; Guarda el valor de la tecla pulsada. ContadorCaracteres ; Guarda el numero de caracteres pulsados. ENDC
;*********************************** Sección Código de Reset ********************************************************* ORG 0 ;Dirección del Vector Reset
GOTO COMIENZO ;Comienzo del Programa
;************************************* Vector de Interrupción *********************************************************** ORG 4 ;Dirección del Vector de Interrupción.
GOTO Interrup ;Ir a rutina de Interrupción
;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA.
bsf STATUS,RP0 ; Ir al Banco 1.
movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1
bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD.
call Teclado_Inicializa ; Configura las líneas del teclado. movlw b'10001000' ; Habilita la interrupción RBI y la general. movwf INTCON
clrf ContadorCaracteres ; En principio no hay caracteres escritos.
;************************************* Principal ************************************************************************** Principal sleep ; Espera en modo bajo consumo que pulse teclado.
goto Principal
;************************************ Rutina de Interrupción "Interrup" ************************************************* Interrup call Teclado_LeeHex ; Obtiene el valor de la tecla pulsada.
movwf GuardaTecla ; Reserva el valor de la tecla pulsada. call Teclado_EsperaDejePulsar ; Para que no se repita el mismo carácter. movf GuardaTecla,W
movlw CaracteresUnaLinea ; Comprueba si ha llegado al numero máximo de subwf ContadorCaracteres,W ; caracteres de una línea.
btfsc STATUS,Z
call LCD_Linea2 ; Se sitúa en la segunda línea.
movlw CaracteresDosLineas ; Comprueba si ha llegado al numero máximo de subwf ContadorCaracteres,W ; caracteres de dos líneas.
btfss STATUS,Z
goto EscribeCaracter ; No, por tanto, sigue escribiendo.
call LCD_Borra ; Si, borra pantalla e inicializa el contador. clrf ContadorCaracteres
EscribeCaracter incf ContadorCaracteres,F ; Un nuevo carácter escrito. movf GuardaTecla,W
call LCD_Nibble ; Visualiza el carácter en pantalla. movf PORTB,W ; Necesario en proteus para limpiar flag. bcf INTCON,RBIF ; Limpia flag.
retfie ;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END
9.7.- Tecla_07.asm
( Entrenador Básico 7 )
title " La pantalla del LCD aparece la tecla pulsada si esta es decimal " title " si se pulsa otra tecla borra pantalla "
;***************************************** Tecla_07.asm **************************************************************** ; Los valores decimales que va escribiendo por el teclado aparecen en pantalla. Si pulsa cualquier
; otra tecla que no sea un numero decimal lo interpreta como tecla de borrado de pantalla.
;*************************************************************************************************************************** ;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 uS. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT.
;Protección de Código: OFF.
;************************************** Elegimos PIC ******************************************************************** list p=16f877, f=inhx32
;********************* Asignación de nombres de Registros de Funciones especiales a direcciones ************* #include <p16f877.inc> ;Este fichero contiene los nombres y direcciones de los
; registros de funciones especiales.
; Este fichero esta localizado en el directorio ; con el nombre MPASM.
;************************************** Igualdades *********************************************************************** ;*************************************** Registros ***********************************************************************
CBLOCK 0x20 GuardaValor ENDC
;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset
GOTO COMIENZO ;Comienzo del Programa
;************************************* Vector de Interrupción *********************************************************** ORG 4 ;Dirección del Vector de Interrupción.
GOTO Interrup ;Ir a rutina de Interrupción
;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA.
bsf STATUS,RP0 ; Ir al Banco 1.
movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1
bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD.
call Teclado_Inicializa ; Configura las líneas del teclado. movlw b'10001000' ; Habilita la interrupción RBI y la general.
movwf INTCON
;************************************* Principal ************************************************************************** Principal sleep ; Espera en modo bajo consumo que pulse teclado.
goto Principal
;************************************ Rutina de Interrupción "Interrup" ************************************************* Interrup call Teclado_LeeHex ; Obtiene el valor hexadecimal de la tecla pulsada.
movwf GuardaValor ; Guarda el valor leído.
call Teclado_EsperaDejePulsar ; Para que no se repita el mismo carácter. movf GuardaValor,W
sublw 0x09 ; Comprueba si es mayor de 9. btfss STATUS,C
goto BorraPantalla ; Si no es un carácter numérico salta a borrar. movf GuardaValor,W ; Recupera el valor leído y lo
call LCD_Nibble ; visualiza en la pantalla. goto limpiar_flag
BorraPantalla call LCD_Borra ; Borra la pantalla.
limpiar_flag movf PORTB,W ; Necesario en proteus para limpiar flag. bcf INTCON,RBIF retfie ;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END
9.8.- Tecla_08.asm
( Entrenador Básico 7 )
title " Suma el valor de tres teclas y aparece en el LCD " title " en decimal y hexadecimal "
;***************************************** Tecla_08.asm **************************************************************** ; Suma el valor de tres teclas pulsadas consecutivamente. En la primera línea de la pantalla del
; modulo LCD aparece en hexadecimal y en la segunda en decimal. Así por ejemplo, si pulsa ; "A", "6" y "F" en pantalla aparece:
; Hex: A+6+F=1F (Primera Línea) ; Dec: 10+06+15=31 (Segunda Línea)
;*************************************************************************************************************************** ;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 uS. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT.
;Protección de Código: OFF.
;************************************** Elegimos PIC ******************************************************************** list p=16f877, f=inhx32
#include <p16f877.inc> ;Este fichero contiene los nombres y direcciones de los ; registros de funciones especiales.
; Este fichero esta localizado en el directorio ; con el nombre MPASM.
;************************************** Igualdades *********************************************************************** ;************************************** Registros *********************************************************************** CBLOCK 0x20 ContadorTeclasPulsadas GuardaValor Operando1 Operando2 Operando3 Resultado ENDC
;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset
GOTO COMIENZO ;Comienzo del Programa
;************************************* Vector de Interrupción *********************************************************** ORG 4 ;Dirección del Vector de Interrupción.
GOTO Interrup ;Ir a rutina de Interrupción
;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA.
bsf STATUS,RP0 ; Ir al Banco 1.
movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1
bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD.
call Teclado_Inicializa ; Configura las líneas del teclado. clrf ContadorTeclasPulsadas ; Resetea este contador.
movlw b'10001000' ; Habilita la interrupción RBI y la general. movwf INTCON
;************************************* Principal ************************************************************************** Principal sleep ; Espera en modo bajo consumo que pulse teclado.
goto Principal
;******************************* Macro "VisualizaHex" ****************************************************************** VisualizaHex MACRO Operando,Caracter
movf GuardaValor,W ; Recupera el valor y lo visualiza. movwf Operando ; Lo guarda para sumar después. call LCD_Nibble ; Visualiza el valor en la pantalla
movlw Caracter
call LCD_Caracter ; Visualiza el signo '+' o '-' según corresponda. incf ContadorTeclasPulsadas,F
ENDM
;******************************* Macro "VisualizaDec" ****************************************************************** VisualizaDec MACRO Operando,Caracter
movf Operando,W ; (Operando) -> (W) call BIN_a_BCD ; Lo pasa a BCD. call LCD_ByteCompleto ; Visualiza en pantalla.
movlw Caracter ; A continuación signo '+' o '=' según corresponda. call LCD_Caracter
ENDM
;************************************ Rutina de Interrupción "Interrup" ************************************************ Interrupcall Teclado_LeeHex ; Obtiene el valor hexadecimal de la tecla pulsada.
movwf GuardaValor ; Guarda el valor leído.
call Teclado_EsperaDejePulsar ; Para que no se repita el mismo carácter. movf ContadorTeclasPulsadas,W ; Según el numero de tecla pulsada realiza una addwf PCL,F ; función distinta.
goto PrimeraTeclaPulsada goto SegundaTeclaPulsada goto TerceraTeclaPulsada
PrimeraTeclaPulsada call LCD_Borra ; Borra la pantalla anterior. movlw MensajeHex ; En pantalla el mensaje "Hex:" call LCD_Mensaje
VisualizaHex Operando1,'+' goto FinInterrupcion SegundaTeclaPulsada VisualizaHex Operando2,'+'
goto FinInterrupcion TerceraTeclaPulsada VisualizaHex Operando3,'='
movf Operando1,W ; Procede a la suma de los tres valores. addwf Operando2,W
addwf Operando3,W movwf Resultado
call LCD_Byte ; Visualiza el resultado.
call LCD_Linea2 ; Ahora visualiza la segunda línea. movlw MensajeDec ; En pantalla el mensaje "Dec:" call LCD_Mensaje
VisualizaDec Operando1,'+' VisualizaDec Operando2,'+' VisualizaDec Operando3,'=' VisualizaDec Resultado,' '
clrf ContadorTeclasPulsadas ; Resetea este contador.
FinInterrupcion movf PORTB,W ; Necesario en proteus para limpiar flag. bcf INTCON,RBIF
retfie
;************************************ Subrutina "Mensajes" ************************************************************* Mensajes addwf PCL,F
MensajeHex DT "Hex: ", 0x0 MensajeDec DT "Dec: ", 0x0 ;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <RETARDOS.INC> INCLUDE <BIN_BCD.INC> END
9.8.- Tecla_09.asm
( Entrenador Básico 7 )
title " Cerradura Electrónica "
;******************************************** Tecla_09.asm ************************************************************ ; Cerradura Electrónica: la salida se activa cuando una clave de varios dígitos introducida
; por teclado sea correcta.
; Tiene una salida "CerraduraSalida" que, cuando se habilita, activa durante unos segundos ; el electroimán de la cerradura permitiendo la apertura de la puerta:
; - Si (CerraduraSalida) = 1, la puerta se puede abrir. ; - Si (CerraduraSalida) = 0, la puerta no se puede abrir. ;Funcionamiento:
; - En pantalla visualiza "Introduzca CLAVE". Según se va escribiendo, visualiza asteriscos '*'. ; - Cuando termine de escribir la clave pueden darse dos posibilidades:
; - Si la clave es incorrecta la cerradura sigue inactivada, en pantalla aparece el mensaje ; "Clave INCORRECTA" durante unos segundos y tiene que repetir de nuevo el proceso. ; - Si la clave es correcta la cerradura se activa durante unos segundos y la puerta
; puede ser abierta. En pantalla aparece: "Clave CORRECTA" (primera línea) y "Abra ; la puerta" (segunda línea). Pasados unos segundos, se repite el proceso.
;*************************************************************************************************************************** ;Programa para PIC 16F877.
;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 uS.