TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: mikipic en 10 de Enero de 2013, 16:51:05
-
Buenas tardes que tal. Estoy trabajando con el PIC 16f877a y la libreria del teclado matricial de ccs. Quiero ingresar un numero por dicho teclado, para luego hacer otras cosas con ese numero ( multiplicar, dividir etc).
El problema es que con la libreria solo me permite ingresar datos de tipo char con "while kbhit()".
Lo que quiero hacer es ingresar un numero de 3 digitos y almancenarlo para luego procesarlo. por ejemplo
int i=0;
while(i<2)
{
k=kbd_getc();
if (k!=0)
{
data[i]=k;
lcd_putc("*");
delay_ms(400);
i++;
}
}
Entonces ya tendria almacenado en mi arreglo data[] de 3 caracteres. Por ejemplo si fuera :
data[0]= ' 4'
data[1]='5'
data[2]='6'
lo que quisiera es almacenar en una variable int NUMERO = 456 (como entero) para luego trabajarlo como un entero(multiplicarlo dividirlo sumarlo etc) ....
y tambien como seria si quiero ingresar un numero float como 4.56???
muchas gracias
-
Hice un intento usando la libreria stdlib.h y la funcion atoi pero aun no logro hacer la conversion.
este es el codigo, ojala puedan decirme lo que este mal y que deberia corregir.
/////////////////////////////////////////////
//
//
//
/////////////////////////////////////////////
#include <16f877a.h>
# DEVICE ADC=10
#fuses xt,nowdt
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)// RS232 Estándar
///////////////////////////////////////////////////////////////
//LIBRERIAS DEL COMPILADOR CCS PARA MANEJO DE PERIFÉRICOS EXTERNOS
///////////////////////////////////////////////////////////////
#include <lcd420_miki.c>
#define use_portb_kbd true
#include <kbd_lib_punto.c>
#include <stdlib.h>
///////////////////////////////////////////////////////////////
//ENTRADAS SALIDAS
///////////////////////////////////////////////////////////////
# USE FAST_IO(A)
# USE FAST_IO(B)
# USE FAST_IO(C)
main()
{
///////////////////////////////////////////////////////////////
//VARIABLES//
///////////////////////////////////////////////////////////////
char data[];
int i=0;
int uni;
int dec;
int cen;
int numero;
char k;
/////////////////////////////////
//INICIALIZANDO PERIFERICOS /////
/////////////////////////////////
lcd_init();
kbd_init();
port_b_pullups(true);
//////////////////////////////
////////////////////////////////////////////////////////////////////
//INGRESO EL UN NUMERO ENTERO DE 3 DIGITOS MEDIANTE EL TECLADO MATRICIAL
///////////////////////////////////////////////////////////////////
printf(lcd_putc,"ingrese el numero \n");
while(i<2)
{
k=kbd_getc();
if (k!=0)
{
data[i]=k;
lcd_putc("*");
delay_ms(200);
i++;
}
}
/////////////////////////////////////////////
cen = data[0];
dec = data[1];
uni = data[2];
////////////////////////////////////////////
cen=atoi(cen);
dec=atoi(dec);
uni=atoi(uni);
numero= cen*100+ dec*10 + uni*1;
printf(lcd_putc,"%d",numero);
}
-
para convertir un ascii a entero puedes usar la funcion atoi(), y para convertir a flotante usa la funcion atol()
para usarlas necesitas incluir la libreria stdlib
-
puedes convertir directamente sin necesidad de convertir las unidades, decenas y centenas por separado
numero=atoi(data)
también debes considerar que tu variable numero debe tener la capacidad suficiente para que tu numero quepa, es decir, si es un entero signado solo caben hasta 127, si es no signado hasta 255
o si necesitas numeros mayores, usa la funcion atol
-
Mas lo que te dice el amigo rivale, que es lo que te indica el LCD?
No veo porque no debería funcionar, pero sabiendo cual es la salida por el LCD quizás podemos encontrar el error.