Vous êtes sur la page 1sur 11

INSTITUTO TECNOLOGICO DE HERMOSILLO

INGENIERIA MECATRONICA
MATERIA: MICROCONTROLADORES

PRACTICA 9:
CONTRASEA ENMASCARADA

INTEGRANTES:
Guzmn Granillo Fernando
Souffle Maldonado Rafael

INTRODUCCION:
Se realiza un programa donde se est introduciendo una contrasea de 4 dgitos
enmascarada con '*', el cual se ver reflejado en el mdulo LCD el cual est conectado
al PORTD, una vez introducida la contrasea si es correcta, se mostrara en LCD,
'CORRECTA', de lo contrario se reflejara 'INCORRECTA', as mismo se estar reseteando
el programa por medio de un push button colocado en el puerto RB2.

/*Programa Contrasea Enmascarada


Configuracion:
PIC16F887
Oscilador de 8Mhz
PORTC = CONEXION DE TECLERA 4X4
PORTD = CONEXION DE MODULO LCD
RB1= LED QUE INDICA CONTRASEA INCORRECTA
Desripcion: Se realiza un programa donde se esta introduciendo una contrasea
de 4 digitos enmascarada con '*', el cual se vera reflejado en el modulo LCD el
cual esta conectado al PORTD, una vez introducida la contrasea si es correcta,
se mostrara en LCD, 'CORRECTA', de lo contrario se reflejara 'INCORRECTA', asi
mismo se estara reseteando el programa por medio de un push button colocado en el
puerto RB2.
Nombre: Souffle Maldonado Fco. Rafael, Guzman Granillo Fernando
Materia: Microcontroladores
Maestro: Marco Gomez Valverde
Fecha: 27 de Septiembre de 2016. */

unsigned short kp,kp1,kp2,kp3, cnt, oldstate = 0; //CONSTANTES PARA CADA DIGITO


char txt[6];
char inicio;

char keypadPort at PORTC;

// LCD module connections


sbit LCD_RS at RD4_bit;
sbit LCD_EN at RD5_bit;
sbit LCD_D4 at RD0_bit;
sbit LCD_D5 at RD1_bit;
sbit LCD_D6 at RD2_bit;
sbit LCD_D7 at RD3_bit;

sbit LCD_RS_Direction at TRISD4_bit;

//CONEXION DE TECLERA EN PUERTO C

sbit LCD_EN_Direction at TRISD5_bit;


sbit LCD_D4_Direction at TRISD0_bit;
sbit LCD_D5_Direction at TRISD1_bit;
sbit LCD_D6_Direction at TRISD2_bit;
sbit LCD_D7_Direction at TRISD3_bit;
// End LCD module connections

void main() {
inicio:
cnt = 0;

// CONTADOR RESETEADO

Keypad_Init();

// INICIO TECLERA

ANSEL = 0;

// ENTRADAS ANALOGICAS

ANSELH = 0;
TRISB.RB1 =0;

// PUERTO B SALIDA PARA LED

TRISB.RB2 =1;

// PUERTO RB2 ENTRADA PARA PB DE RESET

Lcd_Init();

// INICIO LCD

Lcd_Cmd(_LCD_CLEAR);

// LIMPIAR LCD

Lcd_Cmd(_LCD_CURSOR_OFF);

// CURSOR EN OFF

Lcd_Out(1, 1, "BIENVENIDO");

// TEXTO DE LCD

while(1){
kp = 0;
do
kp = Keypad_Key_Click();

// KP IGUAL A DIGITO OPRIMIDO

while (!kp);

switch (kp) {

case 1: kp = 49; break; // 1


case 2: kp = 50; break; // 2
case 3: kp = 51; break; // 3
case 4: kp = 65; break; // A
case 5: kp = 52; break; // 4

// VALORES PARA KP

case 6: kp = 53; break; // 5


case 7: kp = 54; break; // 6
case 8: kp = 66; break; // B
case 9: kp = 55; break; // 7
case 10: kp = 56; break; // 8
case 11: kp = 57; break; // 9
case 12: kp = 67; break; // C
case 13: kp = 42; break; // *
case 14: kp = 48; break; // 0
case 15: kp = 35; break; // #
case 16: kp = 68; break; // D

Lcd_Chr(2, 3, '*');

// TEXTO ENMASCARADO DEL PRIMER DIGITO

kp1 = 0;
do
kp1 = Keypad_Key_Click();

// KP IGUAL AL 2DO DIGITO

while (!kp1);

switch (kp1) {

case 1: kp1 = 49; break; // 1


case 2: kp1 = 50; break; // 2
case 3: kp1 = 51; break; // 3
case 4: kp1 = 65; break; // A
case 5: kp1 = 52; break; // 4
case 6: kp1 = 53; break; // 5
case 7: kp1 = 54; break; // 6
case 8: kp1 = 66; break; // B
case 9: kp1 = 55; break; // 7
case 10: kp1 = 56; break; // 8

// VALORES PARA keypad4x4

case 11: kp1 = 57; break; // 9


case 12: kp1 = 67; break; // C
case 13: kp1 = 42; break; // *
case 14: kp1 = 48; break; // 0
case 15: kp1 = 35; break; // #
case 16: kp1 = 68; break; // D

Lcd_Chr(2, 4, '*');

// TEXTO ENMASCARADO DEL 2DO DIGITO

kp2 = 0;
do
kp2 = Keypad_Key_Click();

// KP IGUAL AL 3ER DIGITO

while (!kp2);

switch (kp2) {

case 1: kp2 = 49; break; // 1


case 2: kp2 = 50; break; // 2
case 3: kp2 = 51; break; // 3
case 4: kp2 = 65; break; // A
case 5: kp2 = 52; break; // 4
case 6: kp2 = 53; break; // 5
case 7: kp2 = 54; break; // 6
case 8: kp2 = 66; break; // B
case 9: kp2 = 55; break; // 7
case 10: kp2 = 56; break; // 8
case 11: kp2 = 57; break; // 9
case 12: kp2 = 67; break; // C
case 13: kp2 = 42; break; // *
case 14: kp2 = 48; break; // 0
case 15: kp2 = 35; break; // #

// VALORES PARA keypad4x4

case 16: kp2 = 68; break; // D

Lcd_Chr(2, 5, '*');

// TEXTO ENMASCARADO DEL 3ER DIGITO

kp3 = 0;
do
kp3 = Keypad_Key_Click();

// KP IGUAL AL 3ER DIGITO

while (!kp3);

switch (kp3) {

case 1: kp3 = 49; break; // 1

// VALORES PARA keypad4x4

case 2: kp3 = 50; break; // 2


case 3: kp3 = 51; break; // 3
case 4: kp3 = 65; break; // A
case 5: kp3 = 52; break; // 4
case 6: kp3 = 53; break; // 5
case 7: kp3 = 54; break; // 6
case 8: kp3 = 66; break; // B
case 9: kp3 = 55; break; // 7
case 10: kp3 = 56; break; // 8
case 11: kp3 = 57; break; // 9
case 12: kp3 = 67; break; // C
case 13: kp3 = 42; break; // *
case 14: kp3 = 48; break; // 0
case 15: kp3 = 35; break; // #
case 16: kp3 = 68; break; // D

Lcd_Chr(2, 6, '*');

// TEXTO ENMASCARADO DEL 4TO DIGITO

if(kp==49&kp1==50&kp2==49&kp3==50) //CONRASEA IGUAL A 1212


{
Lcd_Cmd(_LCD_CLEAR);

//LIMPIA LCD

Lcd_Out(2,4,"CORRECTA");
CORRECTA

//SI LA CLAVE COINCIDE ESCRIBIR EN LCD

Delay_ms(1000);
PORTB.RB1 = 1;

//Y ENCENDER LED EN EL PUERTO RB1

}
else
{Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(2,4,"INCORRECTA");
INCORRECTA
PORTB.RB1 = 0;

//LIMPIA LCD
//SI LA CLAVE NO COINCIDE ESCRIBIR EN LCD

// PUERTO RB1 SE MANTIENE EN OFF

if (PORTB.RB2 = 1)
goto inicio;

} while (1);
}

SIULACION EN PROTEUS:

CONCLUSION:

En esta prctica e presentaron problemas en el cdigo cuando


se ingresaba la contrasea y nos mostraba ya sea correcta o
incorrecta, en el caso cuando se introduca la contrasea
correcta se encenda el LED. Cuando se presionaba el PB para
reset el LED an se encontraba encendido, se realiz un arreglo
en el cdigo para dar solucin.

Vous aimerez peut-être aussi