Está en la página 1de 12

PROGRAMACIÓN DE MICROCONTROLADORES

Laboratorio N°14
TECLADO MATRICIAL Y LCD 16X2 CON
XC8 PIC18F4550

Integrantes:

Amaya Canchumanta, Fabrizio Santiago

Vigo Cuadrado, Diego Fabricio

Yancan Lanzaca, Cristhian

2023 - 1
Lab. N° 14 TECLADO MATRICIAL Y LCD 16X2 CON XC8 PIC18F4550

TECLADO MATRICIAL Y LCD 16X2 CON XC8


PIC16F877A
Objetivos
1. Configuración del teclado matricial 4x4 y LCD 16x2 con lenguaje C y el compilador XC8.
2. Utilizar uso de librerias Estándar de ANSI C para crear tipos de variables.

Introducción
Teclado Matricial 4x4

Un teclado matricial es un arreglo de botones conectados en filas y columnas, de tal


manera que se pueden leer varios botones con el mínimo número de entradas requeridas.
Un teclado matricial 4×4 solamente ocupa 4 líneas de un puerto para leer las filas y otras 4
líneas para las columnas, de este modo se pueden leer 16 teclas utilizando solamente 8
entradas (un solo puerto) de un microcontrolador.

El funcionamiento básico del teclado matricial consiste en rastrear la unión entre una fila
y una columna, mediante un algoritmo que descifra cual tecla fue presionada.

Preparación
Para la realización de este laboratorio se requiere la lectura previa de la información proporcionada
para el curso, como el texto y el manual del fabricante.

Equipos y Materiales

● Computadora
● Software de desarrollo MPLAB X IDE Última versión.
● Proyector multimedia
● Texto del curso
● Manual del fabricante Datasheet

pá g. 2 Ing. César Ciriaco Martinez


Lab. N° 14 TECLADO MATRICIAL Y LCD 16X2 CON XC8 PIC18F4550

Seguridad
Trabajar con Seguridad evita que las personas sufran daños, y provee un ambiente satisfactorio de
trabajo.

Al trabajar en este laboratorio o taller y cualquiera de los subsiguientes, realice el siguiente


procedimiento:

1. Al ingresar, inspeccione:
Las vías de acceso.
Orden y limpieza.

2. En su estación de trabajo evalúe las condiciones de:


Orden y Limpieza.
Herramientas y equipos.

3. Realice su trabajo teniendo en cuenta:


Orden y limpieza.
Seguridad.
Proceda a realizar las conexiones de los equipos o implementación de los circuitos
comprobando que la línea eléctrica se encuentre desconectada.
Solicite visto bueno al profesor antes de aplicar energía eléctrica.

4. Realice el análisis de riesgo personal:


¿Qué es lo que voy a hacer?
¿Qué es lo que puede salir mal?
¿Qué debo hacer para que no salga mal?

5. Al terminar sus labores, deje su estación de trabajo en buenas condiciones:


Ordenado y limpio.
Seguro.
Desconecte el suministro de energía eléctrica.

pá g. 3 Ing. César Ciriaco Martinez


Lab. N° 14 TECLADO MATRICIAL Y LCD 16X2 CON XC8 PIC18F4550
Procedimiento del laboratorio:

1. Programa de librería de teclado en XC8.

/*
File: teclado_lib.c
Author: Ing. César Ciriaco Martinez
fila1--> RB0--> 1 2 3 A
fila2--> RB1--> 4 5 6 B
fila3--> RB2--> 7 8 9 C
fila4--> RB3--> * 0 # D
| | | |
RB4 RB5 RB6 RB7
COL1 COL2 COL3 COL4
*/
#include <xc.h>
#include "fusibles.h"
#include "teclado_lib.h"

void Teclado_Init(void){

ADCON1=0X0F; //CONVERTIMOS LAS ENTRADAS ANALOGICAS A DIGITALES especialmemte el PUERTOb


QUE SE QUIERE TRABAJAR
INTCON2bits.RBPU=0; //se habilita las resistencias pull up DEL PUERTO B
TRISB=0b11110000; //RB7:RB4 --> ENTRADAS RB3:RB0 -->SALIDAS RB7_RB4--> FILAS RB3:RB0 --
>COLUMNAS
}
int Teclado_getc(){
letra='0';
LATB0=0;LATB1=1;LATB2=1;LATB3=1;
__delay_us(100);
if(RB4==0 && RB5==1 && RB6==1 && RB7==1){letra=1;}
if(RB4==1 && RB5==0 && RB6==1 && RB7==1){letra=2;}
if(RB4==1 && RB5==1 && RB6==0 && RB7==1){letra=3;}
if(RB4==1 && RB5==1 && RB6==1 && RB7==0){letra=10;}

LATB0=1;LATB1=0;LATB2=1;LATB3=1;
__delay_us(100);
if(RB4==0 && RB5==1 && RB6==1 && RB7==1){letra=4;}
if(RB4==1 && RB5==0 && RB6==1 && RB7==1){letra=5;}
if(RB4==1 && RB5==1 && RB6==0 && RB7==1){letra=6;}
if(RB4==1 && RB5==1 && RB6==1 && RB7==0){letra=11;}

LATB0=1;LATB1=1;LATB2=0;LATB3=1;
__delay_us(100);
if(RB4==0 && RB5==1 && RB6==1 && RB7==1){letra=7;}
if(RB4==1 && RB5==0 && RB6==1 && RB7==1){letra=8;}
if(RB4==1 && RB5==1 && RB6==0 && RB7==1){letra=9;}
if(RB4==1 && RB5==1 && RB6==1 && RB7==0){letra=12;}

LATB0=1;LATB1=1;LATB2=1;LATB3=0;
__delay_us(100);
if(RB4==0 && RB5==1 && RB6==1 && RB7==1){letra=13;}
if(RB4==1 && RB5==0 && RB6==1 && RB7==1){letra=0;}
if(RB4==1 && RB5==1 && RB6==0 && RB7==1){letra=14;}
if(RB4==1 && RB5==1 && RB6==1 && RB7==0){letra=15;}

return letra;
}
pá g. 4 Ing. César Ciriaco Martinez
Lab. N° 14 TECLADO MATRICIAL Y LCD 16X2 CON XC8 PIC18F4550

Programa principal:

/*
* File: teclado_lcd_1.c
* Author: Ing. César Ciriaco Martinez
*/

#include <xc.h>
#include <stdio.h> // Standard I/O - required for printf() function
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <math.h> //pow(numero,exponente) pow(2,3) sqrt(4)
#include "fusibles.h"
#include "teclado_lib.h"
#include "xlcd.h"
uint8_t tecla_pulsada=0;
char string_tecla[5];
void main(void) {
TRISD=0;
Teclado_Init();
XLCDInit();
XLCDgotoXY(0,0);
putrsXLCD("TECLA PULSADA");
XLCDgotoXY(1,0);
putrsXLCD(" --> : ");
__delay_ms(1000);
while(true){
tecla_pulsada = Teclado_getc();
__delay_ms(100);
if(tecla_pulsada !='0')
{ sprintf(string_tecla,"%u",tecla_pulsada);
XLCDgotoXY(1,7);
putsXLCD(" ");
XLCDgotoXY(1,7);
putsXLCD(string_tecla);
__delay_ms(100);
}
}
return;
}

pá g. 5 Ing. César Ciriaco Martinez


Lab. N° 14 TECLADO MATRICIAL Y LCD 16X2 CON XC8 PIC18F4550

TEXTO MOSTRADO AL PRESIONAR LA TECLA 5

TEXTO MOSTRADO AL PRESIONAR LA TECLA 1

pá g. 6 Ing. César Ciriaco Martinez


Lab. N° 14 TECLADO MATRICIAL Y LCD 16X2 CON XC8 PIC18F4550

Programa para caracteres en LCD

/* PROGRAMA QUE MUESTRA CARACTERES ESPECIALES HACIENDO USO DE LA MEMORIA CGRAM


*/
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include "fusibles.h"
#include "xlcd.h"

Aplicación de lo aprendido:
void InitPort(void)

Implementar
{
un programa en C, en el cual en la pantalla LCD 16X2 se pueda escoger las siguientes 3
funciones:
ADCON1= 0x0F; // Configurando el Puerto B como I/O Digital
TRISD = 0x00; // Configurando todo el Puerto D como salida Digital para el LCD
1.} SERVOMOTOR:
El movimiento de ángulo de un servomotor, controlado por el Teclado matricial 4x4.
unsigned char bateria[8]={0x0E,0x0A,0x1B,0x11,0x11,0x1F,0x1F,0x00};
unsigned char campana[8]={0x04,0x0E,0x0E,0x0E,0x0E,0x1F,0x04,0x00};
2. MOTOR DC:
unsigned char pacman[8]={0x04,0x0E,0x1B,0x1C,0x1F,0x0E,0x04,0x00};
Insertar desde el teclado el % de duty cycle para controlar un motor dc a 4Khz.
unsigned char carita[8]={0x00,0x0A,0x00,0x11,0x0E,0x00,0x00,0x00};

void main() {

InitPort();
XLCDInit();
XLCD_WriteChr_CGRAM(&bateria,0); //datos de bateria en la zona 0 de la CGRAM
XLCD_WriteChr_CGRAM(&campana,1); //datos de campana en la zona 1 de la CGRAM
XLCD_WriteChr_CGRAM(&pacman,2); //datos de pacman en la zona 2 de la CGRAM
XLCD_WriteChr_CGRAM(&carita,3); //datos de carita en la zona 2 de la CGRAM
XLCDgotoXY(0,0); //posición 0,0 del LCD
putcXLCD('@'); //imprime un '@' en esa posición
XLCDgotoXY(0,2); //posición 0,2 del LCD
putsXLCD("car. especiales"); //imprime "car. especiales" en esa posición
XLCDgotoXY(1,0); //posición 1,0 del LCD
putcXLCD(0); // Codigo de la zona 0 de la memoria CGRAM que es la bateria
XLCDgotoXY(1,2); //posición 1,2 del LCD
putcXLCD(1); // Codigo de la zona 1 de la memoria CGRAM que es la campana
XLCDgotoXY(1,4); //posición 1,4 del LCD
putcXLCD(2); // Codigo de la zona 2 de la memoria CGRAM que es el pacman
XLCDgotoXY(1,6); //posición 1,6 del LCD
putcXLCD(3); // Codigo de la zona 3 de la memoria CGRAM que es la carita
while(true)
{
}
}}

pá g. 7 Ing. César Ciriaco Martinez


Lab. N° 14 TECLADO MATRICIAL Y LCD 16X2 CON XC8 PIC18F4550

CARACTERES MOSTRADOS

pá g. 8 Ing. César Ciriaco Martinez


Lab. N° 14 TECLADO MATRICIAL Y LCD 16X2 CON XC8 PIC18F4550

Programa de clave con teclado

#include <xc.h>
#include <stdio.h> // Standard I/O - required for printf() function
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <math.h> //pow(numero,exponente) pow(2,3) sqrt(4)
#include "fusibles.h"
#include "teclado_lib.h"
#include "xlcd.h"
void escribir(void);
uint8_t tecla_pulsada=0;
char string_tecla[5]; //array caracter que contiene 5 indices
// NUMERO DE DNI =75348142 (AMAYA)
int clave3[8]={7,5,3,4,8,1,4,2}; //array entero que contiene 8
int contra[8]; //array entero que contiene 8 indices
int i=0, conteo=0; //variables enteras

void main(void) {
TRISD=0;
Teclado_Init(); //inicializamos el teclado
XLCDInit(); //inicializamos el LCD
XLCDgotoXY(0,0); //movemos a la posición 0,0 en el LCD
putrsXLCD("INGRESE"); //imprimer "INGRESE" en esa posición
XLCDgotoXY(1,0); //movemos a la posición 1,0 en el LCD
putrsXLCD(" --> "); //imprimer " --> " en esa posición
__delay_ms(1000); //delay de 1 segundo

while(true){
tecla_pulsada = Teclado_getc(); //tecla_pulsada obtiene el valor de
//Teclado_getc
__delay_ms(100); //delay de 100ms
if(tecla_pulsada !='0') //solo se ejecuta si tecla_pulsada es diferente de '0'
{
contra[i]=tecla_pulsada; //contra[0]=1, contra[1]=2, contra[2]=3
conteo++; //conteo aumenta su valor en +1
i++; //i aumenta su valor en +1
escribir(); //llamamos a escribir();
}

pá g. 9 Ing. César Ciriaco Martinez


Lab. N° 14 TECLADO MATRICIAL Y LCD 16X2 CON XC8 PIC18F4550

if (conteo==8) //solo se ejecuta si conteo es igual a 8


{ if(contra[0]== clave3[0] && contra[1]== clave3[1] && contra[2]== clave3[2] && contra[3]== clave3[3]
&& contra[4]== clave3[4] && contra[5]== clave3[5] && contra[6]== clave3[6] && contra[7]== clave3[7])
{XLCDgotoXY(1,0);putsXLCD("CLAVE CORRECTA");} //solo imprime esto si la clave es mi DNI
else {XLCDgotoXY(1,0);putsXLCD("ERROR DE CLAVE");i=0;conteo=0;} //error si la clave es incorrecta
}
}
return;
}
void escribir(void)
{
sprintf(string_tecla,"%u",tecla_pulsada);
putsXLCD(string_tecla);
__delay_ms(100);
}

INGRESAR DNI (CORRECTO)

pá g. 10 Ing. César Ciriaco Martinez


Lab. N° 14 TECLADO MATRICIAL Y LCD 16X2 CON XC8 PIC18F4550

INGRESAR DNI (INCORRECTO)

pá g. 11 Ing. César Ciriaco Martinez


Lab. N° 14 TECLADO MATRICIAL Y LCD 16X2 CON XC8 PIC18F4550

pá g. 12 Ing. César Ciriaco Martinez

También podría gustarte