typedef struct /* Estructura para almacenar la fecha */
{ /* y hora del dispositivo. La */
uint8_t ano[4]; /* estructura está pensada para */
uint8_t mes[2];
uint8_t dia[2];
uint8_t hora[2];
uint8_t minuto[2];
uint8_t segundo[2];
} tiempo;
char* Alma_RTC(uint8_t numParam, uint8_t dato)/* Función para el almacenamiento*/
{ /* de los datos en las estructuras */
static uint8_t contDato = 0, temp = 1;/* correspondientes. */
char *exporta = 0;
if(temp != numParam) /* Se reinicia contDato si se cambia */
{ /* parámetro a llenar en la estructura*/
contDato = 0; /* para configurar el reloj del */
} /* sistema. */
switch(numParam) /* Llema el parámetro en función de la*/
{ /* función seleccionada. */
case 1:
{
if(contDato <= 3)
{
RTC.ano[contDato] = dato;
exporta = (char*) RTC.ano;
contDato++;
}
}
break;
case 2:
{
if(contDato <= 1)
{
RTC.mes[contDato] = dato;
exporta = (char*) RTC.mes;
contDato++;
}
}
break;
case 3:
{
if(contDato <= 1)
{
RTC.dia[contDato] = dato;
exporta = (char*) RTC.dia;
contDato++;
}
}
break;
case 4:
{
if(contDato <= 1)
{
RTC.hora[contDato] = dato;
exporta = (char*) RTC.hora;
contDato++;
}
}
break;
case 5:
{
if(contDato <= 1)
{
RTC.minuto[contDato] = dato;
exporta = (char*) RTC.minuto;
contDato++;
}
}
break;
case 6:
{
if(contDato <= 1)
{
RTC.segundo[contDato] = dato;
exporta = (char*) RTC.segundo;
contDato++;
}
}
break;
}
temp = numParam; /* Se asigna numParam a temp para
* comparar en la próxima entrada a la
* función. */
return exporta;
}
void Mensaje_Ent(char *mensaje) /* Función para imprimir el mensaje */
{ /* sin animaciones. */
while(*mensaje)
{
Envia_Com_RAM4b(*(mensaje++));
retardo_us(40);
}
}
valor = Alma_RTC(contParam,boton);
Mensaje_Ent((char*) valor);
I wrote "99" since the array is the dimension 2 but it prints 99,,
while(*mensaje)
Bueno.....
Respecto al codigo, lo considero una muy mala implementacion. Generalmente lo ingresado en el teclado es para luego ser trabajado, mejor tenerlo como enteros y luego lo paso a strings cuando lo voy a mostrar.
Hacerlo con una estructura y luego direccionarlo como si se tratara como un array usando un switch case gigante y una funcion que admite un INDICE, es otro indicio que eso NO debía ser una estructura, sino un array de punteros.
Y finalmente:CitarI wrote "99" since the array is the dimension 2 but it prints 99,,
Y si,, es obvio el problema, para mostrar los datos utiliza esto:Citarwhile(*mensaje)
Donde espera el caracter nulo al final de una string. Pero si vos tenes 2 lugares para guardar caracteres, y los ocupas a los dos con '9' entonces no te queda lugar para el caracter nulo, siempre deberias tener 1 mas para el caracter nulo... Ejemplo "1234" en realidad ocupa 5 lugares de memoria, uno para cada caracter y uno para el caracter nulo.
Pero eso esta limitado por esa estructura que maneja chars, lo cual lo vuelvo a decir, si hubieran sido ints, no hubiera existido problemas, ya que al final antes de enviar lo convertis a string en un array un poco mas grande y lo envias.
PD: Las imagenes son las mismas al final.
Referente al tema de la implementación si, es de novato, me encuentro aprendiendo a programar con este proyecto y aún no se hacer muchas cosas, de hecho tengo problemas con la forma de manejar los punteros ya que aún me cuesta entenderlos totalmente.
se que está la función getc de stdio.h pero en lo poco que he leído aún no he encontrado como usarla con un tecladito alfanumérico de matriz (de los que venden para prototipos), cualquier otro consejo en este sentido es bienvenido.
CitarReferente al tema de la implementación si, es de novato, me encuentro aprendiendo a programar con este proyecto y aún no se hacer muchas cosas, de hecho tengo problemas con la forma de manejar los punteros ya que aún me cuesta entenderlos totalmente.
Pensalo simple...
Un puntero es solamente una direccion de memoria. Asi que si lo tratas como una variable entonces estas cambiando a la direccion que apunta.
Para acceder a lo que esta apuntando solo le agregas el *. Y es todo lo que deberias saber sobre punteros...Citarse que está la función getc de stdio.h pero en lo poco que he leído aún no he encontrado como usarla con un tecladito alfanumérico de matriz (de los que venden para prototipos), cualquier otro consejo en este sentido es bienvenido.
Usualmente las funciones de las librerias standard de C por ahi no estan implementadas....
Asi que casi siempre es mejor generar uno mismo la funcion, o si el fabricante provee un API para el manejo de los modulos mejor.
pero Microchip al menos en estos PICs lo considero mas sensato hacerlo uno mismo.
La funcion que te comento que podes usar para pasar de un entero a un string es sprintf.
una variable temporal la cual es la que se imprime y cuando termine de llenarla entonces la paso al arreglo para almacenar
Gracias por la info pero estaba viendo lo siguiente, el usar arreglos de cadenas significa que lo que debo hacer primero es asignarle una cadena por defecto para que lo dimensione o me va a dar problemas luego, no recordaba que de esa manera había definido los textos de los menú proncipal o secundario lo cual es lo primero que se imprime al encender el sistema.