/*
Teclado sys by Fons
V 1.0.3a
para todopic.com.ar
Entradas: Lectura analogica
Salidas: lcd con mensajes
*/
#define LCD_DATA_PORT getenv("SFR:PORTD")
#include <16f887.h> //Carga librer¡a del uC
#device adc=10
#fuses HS, NOWDT, MCLR
#use delay(clock=20MHz)
#include <lcd.c> //incluir libreria del lcd en carpeta poryecto
#include <ctype.h> //Indicamos la libreria ctype
#include <stdlib.h> //de char a carcter
#include <stdio.h>
/////////////////////////////////////////////////////////////////////
//////////////////// BANDERAS Y CONSTANTES //////////////////////////
//==================================================================
//TECLADO
//Valores para la lectura analogica
const int VminF=150;
//Valores para cada tecla
const long VdO=166, Vc=296, Vb=408, Va=563;
const long VgatoN=178, V9=336, V6=488, V3=728;
const long V0S=182, V8=348, V5=514, V2=788;
const long Vaste=188, V7=371, V4=566, V1=915;
//banderas
int b_teclado=0;
int entradateclado=0;
int superior=0, inferior=0;
char letra='x', numero='x', s_teclado='x';
//==================================================================
//PASS
char pass1[4]={'1','1','1','1'};
int match_1;
int usuario;
/////////////////////////////////////////////////////////////////////
/////////////////////// CONFIGURACION PIC ///////////////////////////
void config()
{
lcd_init(); //Configuracion de lcd
//configuracion de entrada ADC
setup_adc(ADC_CLOCK_DIV_32)
setup_adc_ports(sAN5);
set_adc_channel(5);
}//fin config
/////////////////////////////////////////////////////////////////////
//////////////////// FUNCIONES AUXILIARES ///////////////////////////
/*%%%%%%%%%%%%%%%%%%% ENTRADA DE TECLADO A5 %%%%%%%%%%%%%%%%%%%%%%*/
void teclado()
{
b_teclado=0;
while(b_teclado==0){
//Asegurando una entrada mediante dos mediciones. Filtro por lecturas
entradateclado=0;
while(entradateclado<VminF){ //mientras la bandera sea menor a la referencia minima
entradateclado = read_adc(); //asigmamos una priemra lectura a la bandera
delay_ms(70); //esperamos a que pasen picos de voltaje
entradateclado = read_adc(); //volvemos a hacer una segunda medicion
delay_ms(30); //esperamos a que pasen picos
}//fin while de presionar teclado
//guardando la entrada
entradateclado = read_adc(); //hacemos 3ra lectura donde guardamos el valor [considerando que la tecla se ha mantenido presionado por los 100ms]
superior=entradateclado+1;
inferior=entradateclado-1;
letra='x'; //reinicio de bandera de letra
numero='y'; //reinicio de bandera de numero
if (superior>=VdO && VdO>=inferior)letra='D';
else if (superior>=VgatoN && VgatoN>=inferior)letra='#';
else if (superior>=V0S && V0S>=inferior)numero='0';
else if (superior>=Vaste && Vaste>=inferior)letra='*';
else if (superior>=Vc && Vc>=inferior)letra='C';
else if (superior>=V9 && V9>=inferior)numero='9';
else if (superior>=V8 && V8>=inferior)numero='8';
else if (superior>=V7 && V7>=inferior)numero='7';
else if (superior>=Vb && Vb>=inferior)letra='B';
else if (superior>=V6 && V6>=inferior)numero='6';
else if (superior>=V5 && V5>=inferior)numero='5';
else if (superior>=V4 && V4>=inferior)numero='4';
else if (superior>=Va && Va>=inferior)letra='A';
else if (superior>=V3 && V3>=inferior)numero='3';
else if (superior>=V2 && V2>=inferior)numero='2';
else if (superior>=V1 && V1>=inferior)numero='1';
else{letra='x';numero='y';delay_ms(300);}
if(letra=='x' && numero=='y')b_teclado=0; //si es que no entro en rango de letras, volvemos a entrar al while
//[an pasado menos de 1 ms, maximo, desde las comparaciones;
//por lo que si se presiona por medio segundo se aseguran 4 lecturas almenos]
else b_teclado=1; //si hubo match con alguna tecla, para salir del while (sustituible con un break pero esta al final asi que da igual)
}//fin while de bandera
//hasta aqui se ha asegurado de que no saldra del loop hasta que tenga un valor conocido
//asignamos el caracter medido a la variable s_teclado
if(letra!='x')
s_teclado=letra;
else if(numero!='y')
s_teclado=numero;
}//fin funcion teclado, salida: variable global con cambio de valor, s_teclado
/*%%%%%%%%%%%%%%%%%%% ENTRADA DE PASSWORD %%%%%%%%%%%%%%%%%%%%%%%%*/
void m_Pass()
{
lcd_putc("\fDigite \n *****");
match_1=0;
lcd_gotoxy(1,2);
for(int i=0; i<=3; i++)
{
s_teclado='x';
teclado();
printf(lcd_putc,"%c",s_teclado);
if(s_teclado==pass1[i])
match_1++;
}
if(match_1==4)usuario=1;
else lcd_putc("\fError en pass");
delay_ms(1200);
}//fin de funcion pas. bandera global con cambio : usuario
/////////////////////////////////////////////////////////////////////
//////////////////// FUNCIONES PIRNCIPALES //////////////////////////
/*%%%%%%%%%%%%%%%%%%% MENSAJE DE INICIO %%%%%%%%%%%%%%%%%%%%%%%%%%%*/
void m_inicio()
{
lcd_putc("LOADING . \n "); //MUESTRA EN ´PANTALLA LOADING.
delay_ms(600); //RETRASO
lcd_putc("\f"); //CON ESTO SE LIMPIA PANTALLA
lcd_putc("LOADING . .\n ");
delay_ms(600);
lcd_putc("\f");
lcd_putc("LOADING . . .\n ");
delay_ms(600);
lcd_putc("\f");
delay_ms(1200);
lcd_putc(" Teclado SYS\n V 1.0.3a");
delay_ms(2600);
lcd_putc("\f");
lcd_putc(" Teclado SYS\n by FONS");
}
/////////////////////////////////////////////////////////////////////
//////////////////// LOOP DE TRABAJO //////////////////////////
void main()
{
config();
m_inicio();
while(true)
{
pass();
}
}