hola amigos tengo un problema, estoy usando un teclado matricial para poder ingresar una temperatura limite, esta misma debe visualizarse en una lcd conforme se vaya escribiendo, bien para el teclado uso un solo pin como analogico a este mismo le ha puesto resistencias de valores distintos para poder tener un valor numerico y hacer las condiciones. Bien el primer problema consiste en que cuando presiono un boton q para manera me verificacion dibuja un 1 en la lcd este se muestra en la lcd pero cuando presion otro boton este utlimo lo chanca y se visualiza el ultimo presionado solo he hecho al prueba con dos botones, me imagino que asi como \n que es cambio de linea debe haber un comando para seguir escribiendo apartir del ultimo caracter o no se, el otro problema que tengo que si logro solucionar este primer problema y llego a ingresar un temperatura digamos como ejemplo 150 como hago para que este valor se guarde en una variable porq si vemos bien cuando presione bien lo presiono lo guardaria en una variable pero a este igual lo chancaria el numero siguiente una posible solucion seria un buffer y luego concatenarlo? y si es asi como se haria eso adjunto tanto el programa como la simulcion en proteus ojala me ayuden.gracias amigos.
#include <16f873a.h>
#device adc=10 //10 bits de resolucion
#FUSES xt,NOWDT,NOPROTECT,NOLVP,NOPUT,BROWNOUT //funcionamiento
#use delay (clock=4000000)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)//libreria par el manejo del puerto serie a 9600 baudios
#include "lcd.c"
/////////////////////////////////////
////////// FUNCIONES ///////////////
///////////////////////////////////
void inicializacion(void);
void com_ser(void);
void teclado(void);
//////////////////////////////////
//// Inicializacion Pines ///////
////////////////////////////////
#bit porta_2=0x05.2
#bit portc_0=0x07.0
#bit portc_4=0x07.4
#byte porta=0x05
#byte portb=0x06
#byte portc=0x07
#byte adcon1=0x009f
///////////////////////////////
//////// Variables ///////////
/////////////////////////////
float valor,temp=0;
long set;
////////////////////////////
////////ejecucion//////////
//////////////////////////
void inicializacion()
{
set_tris_a(0b00001011); // AN0, AN1 y AN3 son entradas
set_tris_c(0b10010000);
adcon1=(0b00000100); //conf del adcon1
setup_adc(ADC_CLOCK_INTERNAL);
lcd_init();
porta=0x00; //todos los puertos inicializan en 0
portb=0x00;
portc=0x00;
}
void main()
{
inicializacion(); //funcion de inicializacion
porta_2=1; //led de encendido
lcd_gotoxy(4,1);lcd_putc("Bienvenidos \n\r");
delay_ms(2000);
for(;
{
set_adc_channel(0); //se habilita el canal analog 0
valor=read_adc(); //se toma la lectura del canal 0
temp=500*valor/1024; //ecuacion para temperatura
printf(lcd_putc,"\fTemp=%0.1fºC", temp);
delay_ms(100);
com_ser(); //llamado para la comunicacion serie
if(portc_4==1) //interruptor para ingresar el set point x teclado
teclado(); //funcion para uso del teclado
delay_ms(1000);
}
}
void teclado()
{
inicializacion();
while(true)
{
lcd_gotoxy(1,1);
lcd_putc(" ");
delay_ms(10);
lcd_putc("set point y +\r\n");
set_adc_channel(1); //lectura desde
set=read_adc(); //el teclado
if((set>613)&(set<625))
{
lcd_putc(' ');delay_ms(400); //con fines de Prueba ON/c dibujara 1
}
if((set>423)&(set<431))
{
lcd_putc('0');delay_ms(400);
}
}
}
void com_ser()
{
portc_0=1;
set_adc_channel(0);
valor=read_adc();
temp=500*valor/1024;
printf("Temperatura=%01.2fºC\r\n",temp);
delay_ms(300);
portc_0=0;
}