jueves, 9 de noviembre de 2023

 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 










 Mensaje en el LCD Código  en Arduino  #INCLUDE <16F887.H> #USE DELAY(CLOCK=4000000) #INCLUDE <LCD.C> #FUSES XT,NOPROTECT,NOWDT,...