Mensaje en el LCD
Código en Arduino
#INCLUDE <16F887.H>
#USE DELAY(CLOCK=4000000)
#INCLUDE <LCD.C>
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
void MAIN()
{
LCD_INIT(); //Inicializa el LCD
LCD_PUTC("\f"); //Borrar el contenido del LCD
WHILE(TRUE)
{
LCD_GOTOXY(5,1); //Se ubica En la columna 5 fila 1
LCD_PUTC("Control"); //Muestre el mensaje “Control”
LCD_GOTOXY(3,2); //Ubicarse en la columna 3 fila 2
LCD_PUTC("Automatico"); // Sacar el mensaje “Automatico”
} //Cierra while true
}
Simulación
Animación de Desplazamiento en LCD
Código en Arduino
#INCLUDE <16F887.H>
#fuses XT, NOPROTECT, NOWRT, NOPUT, NOWDT, NOLVP, NOCPD //Órdenes para el programador
#use delay (clock=4000000)
#include <lcd.c> // Librería para el manejo del lcd
const char mensaje[]= {"Control Automatico Educacion"};
///PROGRAMA
void main(void)
{
char y=1; //índice fíla
signed char x=16; //índice columnas (posiciones)
lcd_init(); //inicializa lcd
while(TRUE){ //bucle...
lcd_gotoxy(x,y) ; //ubica cursor para escribir mensaje
lcd_putc(mensaje ) ; //muestra por pantalla el mensaje
delay_ms(100);
x--; //incremento indice de columnas
if(x<-28)
{
//¿se ha mostrado mensaje entero en la primera fila?
x=16; //SI, índice columna x=-16, para que inicie el último caracter en la primera posición
y++; //incremento índice fila (mostrar texto en segunda columna)
if(y>2) //¿se ha mostrado mensaje por segunda fila?
y=1; //SI, restaurar índice de fila
}
lcd_putc("\f" ) ; //borra pantalla
} //...infinito
}
Simulación
LCD y Teclado en el mismo Puerto B
Código en Arduino
#INCLUDE <16F887.H>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
//Definiciones para colocar el LCD y el teclado en el puerto B
#DEFINE USE_PORTB_LCD TRUE
#DEFINE USE_PORTB_KBD TRUE
//Librerías del LCD y Teclado
#INCLUDE <LCD.C>
#INCLUDE <KBD.C>
// Variables Globales
CHAR K;
INT DIR;
//Programa Principal
VOID MAIN()
{
lcd_init(); //Inicializa el LCD
kbd_init(); //Inicializa el Teclado
//Configura las Resistencias PULL-UP del Puerto B
port_b_pullups(0xFF); //PIC16F887
//port_b_pullups(TRUE); //PIC16F877A
LCD_PUTC("\f"); //Limpia el LCD
//Ciclo infinito
WHILE(1)
{
DIR=0;
LCD_PUTC("\f");
while (DIR<17)
{
k=kbd_getc(); //Llamar la función del teclado y almacenar el
//valor digitado en una variable tipo carácter. Si
//no se oprime ninguna tecla el teclado
//retornara el carácter nulo.*/
WHILE( (k=='<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#INCLUDE <16F887.H>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
//Definiciones para colocar el LCD y el teclado en el puerto B
#DEFINE USE_PORTB_LCD TRUE
#DEFINE USE_PORTB_KBD TRUE
//Librerías del LCD y Teclado
#INCLUDE <LCD.C>
#INCLUDE <KBD.C>
// Variables Globales
CHAR K;
INT DIR;
//Programa Principal
VOID MAIN()
{
lcd_init(); //Inicializa el LCD
kbd_init(); //Inicializa el Teclado
//Configura las Resistencias PULL-UP del Puerto B
port_b_pullups(0xFF); //PIC16F887
//port_b_pullups(TRUE); //PIC16F877A
LCD_PUTC("\f"); //Limpia el LCD
//Ciclo infinito
WHILE(1)
{
DIR=0;
LCD_PUTC("\f");
while (DIR<17)
{
k=kbd_getc(); //Llamar la función del teclado y almacenar el
//valor digitado en una variable tipo carácter. Si
//no se oprime ninguna tecla el teclado
//retornara el carácter nulo.*/
WHILE( (k=='\0')) //si no se oprime ninguna tecla sigue llamando al teclado.
{
k=kbd_getc();
}
if( (k!='*')&&(k!='#'))
{
lcd_putc(k);
DIR++;
}
}
}
}</pre>')) //si no se oprime ninguna tecla sigue llamando al teclado.
{
k=kbd_getc();
}
if( (k!='*')&&(k!='#'))
{
lcd_putc(k);
DIR++;
}
}
}
}
Simulación
LCD con Teclado para Contraseña
Código en Arduino
#INCLUDE <16F887.H>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
//Usadas para conectar el LCD y Teclado en el Puerto B
#DEFINE USE_PORTB_LCD TRUE
#DEFINE USE_PORTB_KBD TRUE
//Librerías del LCD y Teclado
#INCLUDE<KBD.C>
#INCLUDE<LCD.C>
#BYTE PORTC=7
#DEFINE LED1 PORTC,7
#DEFINE LED2 PORTC,4
//Variables Globales
CHAR K;
INT MIL,CEN,DEC,UNI,VAL;
//Función Teclado
VOID TECLADO()
{
k=kbd_getc(); //Llamar la función del teclado y almacenar
//el valor digitado en una variable tipo
//carácter. Si no se oprime ninguna tecla el
//teclado retornara el carácter nulo.*/
WHILE(k=='<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#INCLUDE <16F887.H>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
//Usadas para conectar el LCD y Teclado en el Puerto B
#DEFINE USE_PORTB_LCD TRUE
#DEFINE USE_PORTB_KBD TRUE
//Librerías del LCD y Teclado
#INCLUDE<KBD.C>
#INCLUDE<LCD.C>
#BYTE PORTC=7
#DEFINE LED1 PORTC,7
#DEFINE LED2 PORTC,4
//Variables Globales
CHAR K;
INT MIL,CEN,DEC,UNI,VAL;
//Función Teclado
VOID TECLADO()
{
k=kbd_getc(); //Llamar la función del teclado y almacenar
//el valor digitado en una variable tipo
//carácter. Si no se oprime ninguna tecla el
//teclado retornara el carácter nulo.*/
WHILE(k=='\0') //si no se oprime ninguna tecla sigue llamando al teclado.
{
k=kbd_getc();
}
IF( (k!='\0'))
{
IF(K=='0')//Si K es igual a cero
VAL=0;//Val es igual a cero
IF(K=='1')
VAL=1;
IF(K=='2')
VAL=2;
IF(K=='3')
VAL=3;
IF(K=='4')
VAL=4;
IF(K=='5')
VAL=5;
IF(K=='6')
VAL=6;
IF(K=='7')
VAL=7;
IF(K=='8')
VAL=8;
IF(K=='9')
VAL=9;
}
}
VOID MAIN()
{
LCD_INIT(); //Inicializa el LCD
KBD_INIT(); //Inicializa el Teclado
//Configura las Resistencias PULL-UP del Puerto B
PORT_B_PULLUPS(0xFF); //PIC16F887
//port_b_pullups(TRUE); //PIC16F877A
//Configura el puerto C como Salida
SET_TRIS_C(0);
//Programa Principal
WHILE(TRUE)
{
LCD_GOTOXY(1,1);
LCD_PUTC(" BIENVENIDOS ");
LCD_GOTOXY(1,2);
LCD_PUTC(" DIGITE CLAVE ");
DELAY_MS(1000);
TECLADO();
LCD_PUTC("\f");
LCD_GOTOXY(1,1);
IF((k!='#')&&(k!='*'))
{
lcd_putc('*');
UNI=VAL;
}
TECLADO();
IF((k!='#')&&(k!='*'))
{
lcd_putc('*');
DEC=VAL;
}
TECLADO();
IF((k!='#')&&(k!='*'))
{
lcd_putc('*');
CEN=VAL;
}
TECLADO();
IF((k!='#')&&(k!='*'))
{
lcd_putc('*');
MIL=VAL;
}
TECLADO();
WHILE((k!='#'))
{
TECLADO();
}
IF((UNI==1)&&(DEC==2)&&(CEN==3)&&(MIL==4)) //Aquí se compara si
//los números digitados
//están correctos.*/
{
LCD_PUTC("\f"); //Se borra LCD
LCD_GOTOXY(1,1);//Se ubica en la posición 1,1
LCD_PUTC(" CLAVE CORRECTA ");
BIT_SET(LED1);
DELAY_MS(2000);
BIT_CLEAR(LED1);
}
ELSE
{
LCD_PUTC("\f");
LCD_GOTOXY(1,2);
LCD_PUTC(" CLAVE INVALIDA ");
BIT_SET(LED2);
DELAY_MS(4000);
BIT_CLEAR(LED2);
}
}
}</pre>') //si no se oprime ninguna tecla sigue llamando al teclado.
{
k=kbd_getc();
}
IF( (k!='<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#INCLUDE <16F887.H>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
//Usadas para conectar el LCD y Teclado en el Puerto B
#DEFINE USE_PORTB_LCD TRUE
#DEFINE USE_PORTB_KBD TRUE
//Librerías del LCD y Teclado
#INCLUDE<KBD.C>
#INCLUDE<LCD.C>
#BYTE PORTC=7
#DEFINE LED1 PORTC,7
#DEFINE LED2 PORTC,4
//Variables Globales
CHAR K;
INT MIL,CEN,DEC,UNI,VAL;
//Función Teclado
VOID TECLADO()
{
k=kbd_getc(); //Llamar la función del teclado y almacenar
//el valor digitado en una variable tipo
//carácter. Si no se oprime ninguna tecla el
//teclado retornara el carácter nulo.*/
WHILE(k=='\0') //si no se oprime ninguna tecla sigue llamando al teclado.
{
k=kbd_getc();
}
IF( (k!='\0'))
{
IF(K=='0')//Si K es igual a cero
VAL=0;//Val es igual a cero
IF(K=='1')
VAL=1;
IF(K=='2')
VAL=2;
IF(K=='3')
VAL=3;
IF(K=='4')
VAL=4;
IF(K=='5')
VAL=5;
IF(K=='6')
VAL=6;
IF(K=='7')
VAL=7;
IF(K=='8')
VAL=8;
IF(K=='9')
VAL=9;
}
}
VOID MAIN()
{
LCD_INIT(); //Inicializa el LCD
KBD_INIT(); //Inicializa el Teclado
//Configura las Resistencias PULL-UP del Puerto B
PORT_B_PULLUPS(0xFF); //PIC16F887
//port_b_pullups(TRUE); //PIC16F877A
//Configura el puerto C como Salida
SET_TRIS_C(0);
//Programa Principal
WHILE(TRUE)
{
LCD_GOTOXY(1,1);
LCD_PUTC(" BIENVENIDOS ");
LCD_GOTOXY(1,2);
LCD_PUTC(" DIGITE CLAVE ");
DELAY_MS(1000);
TECLADO();
LCD_PUTC("\f");
LCD_GOTOXY(1,1);
IF((k!='#')&&(k!='*'))
{
lcd_putc('*');
UNI=VAL;
}
TECLADO();
IF((k!='#')&&(k!='*'))
{
lcd_putc('*');
DEC=VAL;
}
TECLADO();
IF((k!='#')&&(k!='*'))
{
lcd_putc('*');
CEN=VAL;
}
TECLADO();
IF((k!='#')&&(k!='*'))
{
lcd_putc('*');
MIL=VAL;
}
TECLADO();
WHILE((k!='#'))
{
TECLADO();
}
IF((UNI==1)&&(DEC==2)&&(CEN==3)&&(MIL==4)) //Aquí se compara si
//los números digitados
//están correctos.*/
{
LCD_PUTC("\f"); //Se borra LCD
LCD_GOTOXY(1,1);//Se ubica en la posición 1,1
LCD_PUTC(" CLAVE CORRECTA ");
BIT_SET(LED1);
DELAY_MS(2000);
BIT_CLEAR(LED1);
}
ELSE
{
LCD_PUTC("\f");
LCD_GOTOXY(1,2);
LCD_PUTC(" CLAVE INVALIDA ");
BIT_SET(LED2);
DELAY_MS(4000);
BIT_CLEAR(LED2);
}
}
}</pre>'))
{
IF(K=='0')//Si K es igual a cero
VAL=0;//Val es igual a cero
IF(K=='1')
VAL=1;
IF(K=='2')
VAL=2;
IF(K=='3')
VAL=3;
IF(K=='4')
VAL=4;
IF(K=='5')
VAL=5;
IF(K=='6')
VAL=6;
IF(K=='7')
VAL=7;
IF(K=='8')
VAL=8;
IF(K=='9')
VAL=9;
}
}
VOID MAIN()
{
LCD_INIT(); //Inicializa el LCD
KBD_INIT(); //Inicializa el Teclado
//Configura las Resistencias PULL-UP del Puerto B
PORT_B_PULLUPS(0xFF); //PIC16F887
//port_b_pullups(TRUE); //PIC16F877A
//Configura el puerto C como Salida
SET_TRIS_C(0);
//Programa Principal
WHILE(TRUE)
{
LCD_GOTOXY(1,1);
LCD_PUTC(" BIENVENIDOS ");
LCD_GOTOXY(1,2);
LCD_PUTC(" DIGITE CLAVE ");
DELAY_MS(1000);
TECLADO();
LCD_PUTC("\f");
LCD_GOTOXY(1,1);
IF((k!='#')&&(k!='*'))
{
lcd_putc('*');
UNI=VAL;
}
TECLADO();
IF((k!='#')&&(k!='*'))
{
lcd_putc('*');
DEC=VAL;
}
TECLADO();
IF((k!='#')&&(k!='*'))
{
lcd_putc('*');
CEN=VAL;
}
TECLADO();
IF((k!='#')&&(k!='*'))
{
lcd_putc('*');
MIL=VAL;
}
TECLADO();
WHILE((k!='#'))
{
TECLADO();
}
IF((UNI==1)&&(DEC==2)&&(CEN==3)&&(MIL==4)) //Aquí se compara si
//los números digitados
//están correctos.*/
{
LCD_PUTC("\f"); //Se borra LCD
LCD_GOTOXY(1,1);//Se ubica en la posición 1,1
LCD_PUTC(" CLAVE CORRECTA ");
BIT_SET(LED1);
DELAY_MS(2000);
BIT_CLEAR(LED1);
}
ELSE
{
LCD_PUTC("\f");
LCD_GOTOXY(1,2);
LCD_PUTC(" CLAVE INVALIDA ");
BIT_SET(LED2);
DELAY_MS(4000);
BIT_CLEAR(LED2);
}
}
}
Simulación
Teclado 4×3 PIC 16F887
Código en Arduino
#INCLUDE <16F887.H>
#FUSES XT,NOPROTECT,NOBROWNOUT,PUT,NOLVP
//#USE DELAY(CLOCK=4000000) //Reloj interno 4MHz
#use delay(clock=4000000,crystal)//Crystal Externo 4MHz
Byte CONST display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
#DEFINE USE_PORTB_KBD
#INCLUDE <KBD.C>
#BYTE PORTC= 7
#BYTE PORTB= 6
#BYTE WPUB= 0X95 // declarar registro option
#BYTE OPTION_REG = 0X81
CHAR K;
VOID MAIN()
{
//PORT_B_PULLUPS(TRUE);
OPTION_REG = 0; //en el MAIN desactivas el registro OPTION
WPUB= 0B11111111;// y seleccionas los pullups q vas a utilizar
KBD_INIT(); //Inicializar la rutina del teclado
SET_TRIS_C(0); //Configurar el puerto C como salida
PORTC=(display[0]);//Muestre en el display el número cero
WHILE (TRUE)
{
K=0; //Ponga la variable K en cero
K=KBD_GETC(); //Captura cualquier tecla oprimida
IF(K=='0') //Si la tecla que se oprime es igual al caracter cero
PORTC=(display[0]);//Muestre en el display el número cero
IF(K=='1') //Si la tecla que se oprime es igual al caracter uno
PORTC=( display [1]);//Muestre en el display el número uno
IF(K=='2') //Tecla que se oprime = al caracter dos
PORTC=( display [2]); //Muestre en el display el número dos
IF(K=='3') // Tecla que se oprime = al caracter tres
PORTC=( display [3]);//Muestre en el display el número tres
IF(K=='4') // Tecla que se oprime = caracter cuatro
PORTC=( display [4]);//Muestre en el display el número cuatro
IF(K=='5') // Tecla que se oprime = caracter cinco
PORTC=( display [5]);//Muestre en el display el número cinco
IF(K=='6') // Tecla que se oprime = caracter //seis
PORTC=( display [6]);//Muestre en el display el número seis
IF(K=='7') // Tecla que se oprime = caracter siete
PORTC=( display [7]);//Muestre en el display el número siete
IF(K=='8') // Tecla que se oprime = caracter ocho
PORTC=( display [8]);//Muestre en el display el número ocho
IF(K=='9') // Tecla que se oprime = caracter nueve
PORTC=( display [9]);//Muestre en el display el número nueve
}
}
Simulación
Teclado Matricial 4×4 PIC 16F887
Código en Arduino
#INCLUDE <16F887.H>
#device adc=10
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
//#DEFINE USE_PORTB_LCD TRUE
#DEFINE USE_PORTB_KBD //Por defecto el teclado se conecta al puerto D,
//como el microcontrolador que se esta usando
//no tiene puerto D se conecta al puerto B.*/
#INCLUDE <LCD.C>
#INCLUDE <KBD4x4.C> //Incluir en el encabezado el driver para
//manejar el teclado telefónico MODIFICADO
#use standard_io(b)
#define KEYHIT_DELAY 200 //Tiempo de espera del teclado en milisegundos
#byte PORTB= 6
#byte PORTC= 7
#BYTE PORTA= 5
#BYTE PORTD= 8
long bits; //Variable almacena los bits
float tem; //Almacena la temperatura
INT DIR;
/*===========================================================================*/
/*======================= FUNCION TECLA =======================*/
/*===========================================================================*/
//Funcion encargada de esperar a que se presione una tecla
char tecla(void)
{
char c;
do{ //espera hasta que se presione una tecla
c=kbd_getc(); //Captura valor del teclado
}
while(c=='<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#INCLUDE <16F887.H>
#device adc=10
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
//#DEFINE USE_PORTB_LCD TRUE
#DEFINE USE_PORTB_KBD //Por defecto el teclado se conecta al puerto D,
//como el microcontrolador que se esta usando
//no tiene puerto D se conecta al puerto B.*/
#INCLUDE <LCD.C>
#INCLUDE <KBD4x4.C> //Incluir en el encabezado el driver para
//manejar el teclado telefónico MODIFICADO
#use standard_io(b)
#define KEYHIT_DELAY 200 //Tiempo de espera del teclado en milisegundos
#byte PORTB= 6
#byte PORTC= 7
#BYTE PORTA= 5
#BYTE PORTD= 8
long bits; //Variable almacena los bits
float tem; //Almacena la temperatura
INT DIR;
/*===========================================================================*/
/*======================= FUNCION TECLA =======================*/
/*===========================================================================*/
//Funcion encargada de esperar a que se presione una tecla
char tecla(void)
{
char c;
do{ //espera hasta que se presione una tecla
c=kbd_getc(); //Captura valor del teclado
}
while(c=='\0');
return(c);
}
/*===========================================================================*/
/*======================= FUNCION TECLA CON TIMER =======================*/
/*===========================================================================*/
// Pregunta por una Tecla por un tiempo, si no hay actividad, deja de preguntar
// y deja que el PIC continue con su trabajo
char tecla_time(void) {
char c='\0';
unsigned int16 timeout;
timeout=0;
c=kbd_getc(); //Captura valor del teclado
while(c=='\0' && (++timeout< (KEYHIT_DELAY*100)))
{
delay_us(10);
c=kbd_getc(); //Captura valor del teclado
}
return(c);
}
/*===========================================================================*/
/*======================= PROGRAMA PRINCIPAL =======================*/
/*===========================================================================*/
VOID MAIN()
{
CHAR K;
port_b_pullups (0xFF); //Utiliza las resistencias PULL UP internas del puerto B
set_tris_a(0b00000001); //Pongo el RA0 como entrada
SET_TRIS_B(0);
SET_TRIS_C(0); //Puerto C como Salida
setup_adc_ports(sAN0); //Pongo RA0 como analogo
setup_adc(adc_clock_internal); //Selecciono reloj interno para conversion
LCD_INIT(); //Inicializar el driver del lcd
KBD_INIT(); //Inicializar el driver del teclado
LCD_PUTC("\f"); //Limpia el LCD
WHILE(1)
{
DIR=9;
LCD_GOTOXY(1,2); //Ubica el cursor del LCD
LCD_PUTC("Teclas= ");
LCD_GOTOXY(1,2); //Ubica el cursor del LCD
while (DIR<17)
{
if(k!='\0'){
LCD_GOTOXY(DIR,2);
lcd_putc(k);
k='\0';
DIR++;
}
// ============================================================================= //
//A continuación se muestran diferentes formas para leer los valores
//del teclado matricial, descomenta la forma de almacenar el dato
//en la variable "k" y observa las diferencias de cada llamado
//k=tecla(); //Lee el valor del teclado y espera hasta que alguna tecla se pulse
k=tecla_time(); //Lee el valor del teclado pero solo espera un tiempo determinado
//k=kbd_getc(); //Función del ccs c para leer el valor del teclado (sin control)
// ============================================================================= //
if(DIR>16)
LCD_PUTC("\f");
//Lectura ADC
set_adc_channel(0); //Selecciono el canal 0 (RA0)
delay_ms(1); //llamo retardo de 1 ms
bits=read_adc(); //Guarde el dato del LM en tempe
tem=bits*0.4882; //Conversion de bits a temperatura
lcd_gotoxy(1,1); //Ubiquese en la posicion 2,2
printf(lcd_putc,"Temp= %f ",tem); //Muestra el valor numerico de la conversionconversion
}
}
}</pre>');
return(c);
}
/*===========================================================================*/
/*======================= FUNCION TECLA CON TIMER =======================*/
/*===========================================================================*/
// Pregunta por una Tecla por un tiempo, si no hay actividad, deja de preguntar
// y deja que el PIC continue con su trabajo
char tecla_time(void) {
char c='<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#INCLUDE <16F887.H>
#device adc=10
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
//#DEFINE USE_PORTB_LCD TRUE
#DEFINE USE_PORTB_KBD //Por defecto el teclado se conecta al puerto D,
//como el microcontrolador que se esta usando
//no tiene puerto D se conecta al puerto B.*/
#INCLUDE <LCD.C>
#INCLUDE <KBD4x4.C> //Incluir en el encabezado el driver para
//manejar el teclado telefónico MODIFICADO
#use standard_io(b)
#define KEYHIT_DELAY 200 //Tiempo de espera del teclado en milisegundos
#byte PORTB= 6
#byte PORTC= 7
#BYTE PORTA= 5
#BYTE PORTD= 8
long bits; //Variable almacena los bits
float tem; //Almacena la temperatura
INT DIR;
/*===========================================================================*/
/*======================= FUNCION TECLA =======================*/
/*===========================================================================*/
//Funcion encargada de esperar a que se presione una tecla
char tecla(void)
{
char c;
do{ //espera hasta que se presione una tecla
c=kbd_getc(); //Captura valor del teclado
}
while(c=='\0');
return(c);
}
/*===========================================================================*/
/*======================= FUNCION TECLA CON TIMER =======================*/
/*===========================================================================*/
// Pregunta por una Tecla por un tiempo, si no hay actividad, deja de preguntar
// y deja que el PIC continue con su trabajo
char tecla_time(void) {
char c='\0';
unsigned int16 timeout;
timeout=0;
c=kbd_getc(); //Captura valor del teclado
while(c=='\0' && (++timeout< (KEYHIT_DELAY*100)))
{
delay_us(10);
c=kbd_getc(); //Captura valor del teclado
}
return(c);
}
/*===========================================================================*/
/*======================= PROGRAMA PRINCIPAL =======================*/
/*===========================================================================*/
VOID MAIN()
{
CHAR K;
port_b_pullups (0xFF); //Utiliza las resistencias PULL UP internas del puerto B
set_tris_a(0b00000001); //Pongo el RA0 como entrada
SET_TRIS_B(0);
SET_TRIS_C(0); //Puerto C como Salida
setup_adc_ports(sAN0); //Pongo RA0 como analogo
setup_adc(adc_clock_internal); //Selecciono reloj interno para conversion
LCD_INIT(); //Inicializar el driver del lcd
KBD_INIT(); //Inicializar el driver del teclado
LCD_PUTC("\f"); //Limpia el LCD
WHILE(1)
{
DIR=9;
LCD_GOTOXY(1,2); //Ubica el cursor del LCD
LCD_PUTC("Teclas= ");
LCD_GOTOXY(1,2); //Ubica el cursor del LCD
while (DIR<17)
{
if(k!='\0'){
LCD_GOTOXY(DIR,2);
lcd_putc(k);
k='\0';
DIR++;
}
// ============================================================================= //
//A continuación se muestran diferentes formas para leer los valores
//del teclado matricial, descomenta la forma de almacenar el dato
//en la variable "k" y observa las diferencias de cada llamado
//k=tecla(); //Lee el valor del teclado y espera hasta que alguna tecla se pulse
k=tecla_time(); //Lee el valor del teclado pero solo espera un tiempo determinado
//k=kbd_getc(); //Función del ccs c para leer el valor del teclado (sin control)
// ============================================================================= //
if(DIR>16)
LCD_PUTC("\f");
//Lectura ADC
set_adc_channel(0); //Selecciono el canal 0 (RA0)
delay_ms(1); //llamo retardo de 1 ms
bits=read_adc(); //Guarde el dato del LM en tempe
tem=bits*0.4882; //Conversion de bits a temperatura
lcd_gotoxy(1,1); //Ubiquese en la posicion 2,2
printf(lcd_putc,"Temp= %f ",tem); //Muestra el valor numerico de la conversionconversion
}
}
}</pre>';
unsigned int16 timeout;
timeout=0;
c=kbd_getc(); //Captura valor del teclado
while(c=='<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#INCLUDE <16F887.H>
#device adc=10
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
//#DEFINE USE_PORTB_LCD TRUE
#DEFINE USE_PORTB_KBD //Por defecto el teclado se conecta al puerto D,
//como el microcontrolador que se esta usando
//no tiene puerto D se conecta al puerto B.*/
#INCLUDE <LCD.C>
#INCLUDE <KBD4x4.C> //Incluir en el encabezado el driver para
//manejar el teclado telefónico MODIFICADO
#use standard_io(b)
#define KEYHIT_DELAY 200 //Tiempo de espera del teclado en milisegundos
#byte PORTB= 6
#byte PORTC= 7
#BYTE PORTA= 5
#BYTE PORTD= 8
long bits; //Variable almacena los bits
float tem; //Almacena la temperatura
INT DIR;
/*===========================================================================*/
/*======================= FUNCION TECLA =======================*/
/*===========================================================================*/
//Funcion encargada de esperar a que se presione una tecla
char tecla(void)
{
char c;
do{ //espera hasta que se presione una tecla
c=kbd_getc(); //Captura valor del teclado
}
while(c=='\0');
return(c);
}
/*===========================================================================*/
/*======================= FUNCION TECLA CON TIMER =======================*/
/*===========================================================================*/
// Pregunta por una Tecla por un tiempo, si no hay actividad, deja de preguntar
// y deja que el PIC continue con su trabajo
char tecla_time(void) {
char c='\0';
unsigned int16 timeout;
timeout=0;
c=kbd_getc(); //Captura valor del teclado
while(c=='\0' && (++timeout< (KEYHIT_DELAY*100)))
{
delay_us(10);
c=kbd_getc(); //Captura valor del teclado
}
return(c);
}
/*===========================================================================*/
/*======================= PROGRAMA PRINCIPAL =======================*/
/*===========================================================================*/
VOID MAIN()
{
CHAR K;
port_b_pullups (0xFF); //Utiliza las resistencias PULL UP internas del puerto B
set_tris_a(0b00000001); //Pongo el RA0 como entrada
SET_TRIS_B(0);
SET_TRIS_C(0); //Puerto C como Salida
setup_adc_ports(sAN0); //Pongo RA0 como analogo
setup_adc(adc_clock_internal); //Selecciono reloj interno para conversion
LCD_INIT(); //Inicializar el driver del lcd
KBD_INIT(); //Inicializar el driver del teclado
LCD_PUTC("\f"); //Limpia el LCD
WHILE(1)
{
DIR=9;
LCD_GOTOXY(1,2); //Ubica el cursor del LCD
LCD_PUTC("Teclas= ");
LCD_GOTOXY(1,2); //Ubica el cursor del LCD
while (DIR<17)
{
if(k!='\0'){
LCD_GOTOXY(DIR,2);
lcd_putc(k);
k='\0';
DIR++;
}
// ============================================================================= //
//A continuación se muestran diferentes formas para leer los valores
//del teclado matricial, descomenta la forma de almacenar el dato
//en la variable "k" y observa las diferencias de cada llamado
//k=tecla(); //Lee el valor del teclado y espera hasta que alguna tecla se pulse
k=tecla_time(); //Lee el valor del teclado pero solo espera un tiempo determinado
//k=kbd_getc(); //Función del ccs c para leer el valor del teclado (sin control)
// ============================================================================= //
if(DIR>16)
LCD_PUTC("\f");
//Lectura ADC
set_adc_channel(0); //Selecciono el canal 0 (RA0)
delay_ms(1); //llamo retardo de 1 ms
bits=read_adc(); //Guarde el dato del LM en tempe
tem=bits*0.4882; //Conversion de bits a temperatura
lcd_gotoxy(1,1); //Ubiquese en la posicion 2,2
printf(lcd_putc,"Temp= %f ",tem); //Muestra el valor numerico de la conversionconversion
}
}
}</pre>' && (++timeout< (KEYHIT_DELAY*100)))
{
delay_us(10);
c=kbd_getc(); //Captura valor del teclado
}
return(c);
}
/*===========================================================================*/
/*======================= PROGRAMA PRINCIPAL =======================*/
/*===========================================================================*/
VOID MAIN()
{
CHAR K;
port_b_pullups (0xFF); //Utiliza las resistencias PULL UP internas del puerto B
set_tris_a(0b00000001); //Pongo el RA0 como entrada
SET_TRIS_B(0);
SET_TRIS_C(0); //Puerto C como Salida
setup_adc_ports(sAN0); //Pongo RA0 como analogo
setup_adc(adc_clock_internal); //Selecciono reloj interno para conversion
LCD_INIT(); //Inicializar el driver del lcd
KBD_INIT(); //Inicializar el driver del teclado
LCD_PUTC("\f"); //Limpia el LCD
WHILE(1)
{
DIR=9;
LCD_GOTOXY(1,2); //Ubica el cursor del LCD
LCD_PUTC("Teclas= ");
LCD_GOTOXY(1,2); //Ubica el cursor del LCD
while (DIR<17)
{
if(k!='<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#INCLUDE <16F887.H>
#device adc=10
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
//#DEFINE USE_PORTB_LCD TRUE
#DEFINE USE_PORTB_KBD //Por defecto el teclado se conecta al puerto D,
//como el microcontrolador que se esta usando
//no tiene puerto D se conecta al puerto B.*/
#INCLUDE <LCD.C>
#INCLUDE <KBD4x4.C> //Incluir en el encabezado el driver para
//manejar el teclado telefónico MODIFICADO
#use standard_io(b)
#define KEYHIT_DELAY 200 //Tiempo de espera del teclado en milisegundos
#byte PORTB= 6
#byte PORTC= 7
#BYTE PORTA= 5
#BYTE PORTD= 8
long bits; //Variable almacena los bits
float tem; //Almacena la temperatura
INT DIR;
/*===========================================================================*/
/*======================= FUNCION TECLA =======================*/
/*===========================================================================*/
//Funcion encargada de esperar a que se presione una tecla
char tecla(void)
{
char c;
do{ //espera hasta que se presione una tecla
c=kbd_getc(); //Captura valor del teclado
}
while(c=='\0');
return(c);
}
/*===========================================================================*/
/*======================= FUNCION TECLA CON TIMER =======================*/
/*===========================================================================*/
// Pregunta por una Tecla por un tiempo, si no hay actividad, deja de preguntar
// y deja que el PIC continue con su trabajo
char tecla_time(void) {
char c='\0';
unsigned int16 timeout;
timeout=0;
c=kbd_getc(); //Captura valor del teclado
while(c=='\0' && (++timeout< (KEYHIT_DELAY*100)))
{
delay_us(10);
c=kbd_getc(); //Captura valor del teclado
}
return(c);
}
/*===========================================================================*/
/*======================= PROGRAMA PRINCIPAL =======================*/
/*===========================================================================*/
VOID MAIN()
{
CHAR K;
port_b_pullups (0xFF); //Utiliza las resistencias PULL UP internas del puerto B
set_tris_a(0b00000001); //Pongo el RA0 como entrada
SET_TRIS_B(0);
SET_TRIS_C(0); //Puerto C como Salida
setup_adc_ports(sAN0); //Pongo RA0 como analogo
setup_adc(adc_clock_internal); //Selecciono reloj interno para conversion
LCD_INIT(); //Inicializar el driver del lcd
KBD_INIT(); //Inicializar el driver del teclado
LCD_PUTC("\f"); //Limpia el LCD
WHILE(1)
{
DIR=9;
LCD_GOTOXY(1,2); //Ubica el cursor del LCD
LCD_PUTC("Teclas= ");
LCD_GOTOXY(1,2); //Ubica el cursor del LCD
while (DIR<17)
{
if(k!='\0'){
LCD_GOTOXY(DIR,2);
lcd_putc(k);
k='\0';
DIR++;
}
// ============================================================================= //
//A continuación se muestran diferentes formas para leer los valores
//del teclado matricial, descomenta la forma de almacenar el dato
//en la variable "k" y observa las diferencias de cada llamado
//k=tecla(); //Lee el valor del teclado y espera hasta que alguna tecla se pulse
k=tecla_time(); //Lee el valor del teclado pero solo espera un tiempo determinado
//k=kbd_getc(); //Función del ccs c para leer el valor del teclado (sin control)
// ============================================================================= //
if(DIR>16)
LCD_PUTC("\f");
//Lectura ADC
set_adc_channel(0); //Selecciono el canal 0 (RA0)
delay_ms(1); //llamo retardo de 1 ms
bits=read_adc(); //Guarde el dato del LM en tempe
tem=bits*0.4882; //Conversion de bits a temperatura
lcd_gotoxy(1,1); //Ubiquese en la posicion 2,2
printf(lcd_putc,"Temp= %f ",tem); //Muestra el valor numerico de la conversionconversion
}
}
}</pre>'){
LCD_GOTOXY(DIR,2);
lcd_putc(k);
k='<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#INCLUDE <16F887.H>
#device adc=10
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
//#DEFINE USE_PORTB_LCD TRUE
#DEFINE USE_PORTB_KBD //Por defecto el teclado se conecta al puerto D,
//como el microcontrolador que se esta usando
//no tiene puerto D se conecta al puerto B.*/
#INCLUDE <LCD.C>
#INCLUDE <KBD4x4.C> //Incluir en el encabezado el driver para
//manejar el teclado telefónico MODIFICADO
#use standard_io(b)
#define KEYHIT_DELAY 200 //Tiempo de espera del teclado en milisegundos
#byte PORTB= 6
#byte PORTC= 7
#BYTE PORTA= 5
#BYTE PORTD= 8
long bits; //Variable almacena los bits
float tem; //Almacena la temperatura
INT DIR;
/*===========================================================================*/
/*======================= FUNCION TECLA =======================*/
/*===========================================================================*/
//Funcion encargada de esperar a que se presione una tecla
char tecla(void)
{
char c;
do{ //espera hasta que se presione una tecla
c=kbd_getc(); //Captura valor del teclado
}
while(c=='\0');
return(c);
}
/*===========================================================================*/
/*======================= FUNCION TECLA CON TIMER =======================*/
/*===========================================================================*/
// Pregunta por una Tecla por un tiempo, si no hay actividad, deja de preguntar
// y deja que el PIC continue con su trabajo
char tecla_time(void) {
char c='\0';
unsigned int16 timeout;
timeout=0;
c=kbd_getc(); //Captura valor del teclado
while(c=='\0' && (++timeout< (KEYHIT_DELAY*100)))
{
delay_us(10);
c=kbd_getc(); //Captura valor del teclado
}
return(c);
}
/*===========================================================================*/
/*======================= PROGRAMA PRINCIPAL =======================*/
/*===========================================================================*/
VOID MAIN()
{
CHAR K;
port_b_pullups (0xFF); //Utiliza las resistencias PULL UP internas del puerto B
set_tris_a(0b00000001); //Pongo el RA0 como entrada
SET_TRIS_B(0);
SET_TRIS_C(0); //Puerto C como Salida
setup_adc_ports(sAN0); //Pongo RA0 como analogo
setup_adc(adc_clock_internal); //Selecciono reloj interno para conversion
LCD_INIT(); //Inicializar el driver del lcd
KBD_INIT(); //Inicializar el driver del teclado
LCD_PUTC("\f"); //Limpia el LCD
WHILE(1)
{
DIR=9;
LCD_GOTOXY(1,2); //Ubica el cursor del LCD
LCD_PUTC("Teclas= ");
LCD_GOTOXY(1,2); //Ubica el cursor del LCD
while (DIR<17)
{
if(k!='\0'){
LCD_GOTOXY(DIR,2);
lcd_putc(k);
k='\0';
DIR++;
}
// ============================================================================= //
//A continuación se muestran diferentes formas para leer los valores
//del teclado matricial, descomenta la forma de almacenar el dato
//en la variable "k" y observa las diferencias de cada llamado
//k=tecla(); //Lee el valor del teclado y espera hasta que alguna tecla se pulse
k=tecla_time(); //Lee el valor del teclado pero solo espera un tiempo determinado
//k=kbd_getc(); //Función del ccs c para leer el valor del teclado (sin control)
// ============================================================================= //
if(DIR>16)
LCD_PUTC("\f");
//Lectura ADC
set_adc_channel(0); //Selecciono el canal 0 (RA0)
delay_ms(1); //llamo retardo de 1 ms
bits=read_adc(); //Guarde el dato del LM en tempe
tem=bits*0.4882; //Conversion de bits a temperatura
lcd_gotoxy(1,1); //Ubiquese en la posicion 2,2
printf(lcd_putc,"Temp= %f ",tem); //Muestra el valor numerico de la conversionconversion
}
}
}</pre>';
DIR++;
}
// ============================================================================= //
//A continuación se muestran diferentes formas para leer los valores
//del teclado matricial, descomenta la forma de almacenar el dato
//en la variable "k" y observa las diferencias de cada llamado
//k=tecla(); //Lee el valor del teclado y espera hasta que alguna tecla se pulse
k=tecla_time(); //Lee el valor del teclado pero solo espera un tiempo determinado
//k=kbd_getc(); //Función del ccs c para leer el valor del teclado (sin control)
// ============================================================================= //
if(DIR>16)
LCD_PUTC("\f");
//Lectura ADC
set_adc_channel(0); //Selecciono el canal 0 (RA0)
delay_ms(1); //llamo retardo de 1 ms
bits=read_adc(); //Guarde el dato del LM en tempe
tem=bits*0.4882; //Conversion de bits a temperatura
lcd_gotoxy(1,1); //Ubiquese en la posicion 2,2
printf(lcd_putc,"Temp= %f ",tem); //Muestra el valor numerico de la conversionconversion
}
}
}
Simulación
Teclado Matricial Arduino con libreria
Código en Arduino
#include <Keypad.h>
const byte filas = 4;
const byte columnas = 4;
byte pinesFilas[] = {9,8,7,6};
byte pinesColumnas[] = {5,4,3,2};
char teclas[4][4] = {{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}};
Keypad teclado1 = Keypad( makeKeymap(teclas), pinesFilas, pinesColumnas, filas, columnas);
void setup() {
Serial.begin(9600);
Serial.println("Teclado 4x4 con Biblioteca Keypad");
Serial.println();
}
void loop() {
//Verifica si alguna tecla fue presionada
char tecla_presionada = teclado1.getKey();
//Monitor Serial
if (tecla_presionada)
{
Serial.print("Tecla: ");
Serial.println(tecla_presionada);
}
}
Simulación
Teclado Matricial Arduino sin libreria
Código en Arduino
byte pinesFilas[] = {9,8,7,6};
byte pinesColumnas[] = {5,4,3,2};
char teclas[4][4] = {{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}};
void setup()
{
for (int nL = 0; nL <= 3; nL++) {
pinMode(pinesFilas[nL], OUTPUT);
digitalWrite(pinesFilas[nL], HIGH);
}
for (int nC = 0; nC <= 3; nC++) {
pinMode(pinesColumnas[nC], INPUT_PULLUP);
}
Serial.begin(9600);
Serial.println("Teclado 4x4");
Serial.println();
}
void loop()
{
//Barrido por las filas
for (int nL = 0; nL <= 3; nL++)
{
digitalWrite(pinesFilas[nL], LOW);
//Barrido en columnas buscando un LOW
for (int nC = 0; nC <= 3; nC++) {
if (digitalRead(pinesColumnas[nC]) == LOW)
{
Serial.print("Tecla: ");
Serial.println(teclas[nL][nC]);
while(digitalRead(pinesColumnas[nC]) == LOW){}
}
}
digitalWrite(pinesFilas[nL], HIGH);
}
delay(10);
}
Simulación