| ??? 03/03/10 07:06 Modified: 03/03/10 07:06 Read: times |
#173759 - Problem with strings in C |
Hi,
I have written code for reading time from DS1307 RTC, convert BCD to decimal (12:34:56 in BCD to 12:34:56 in dec) & then that decimal to an ASCII string & after that copy the individual strings ("12" "34" "56") to a str_buffer with proper formatting e.g. "12:34:56 PM". Finally I send this str_buffer to a graphical LCD. The way I am doing this is: static unsigned char xdata str_buffer[20]; //not sure if static reqd, its in main() ... strcpy(str_buffer,dec2ascii(read_hour())); //read_hour() returns 12 in dec (tested) strcat(str_buffer,":"); strcat(str_buffer,dec2ascii(read_min())); //dec2ascii() returns ptr to "34" strcat(str_buffer,":"); strcat(str_buffer,dec2ascii(read_sec())); LCD_sendstring(str_buffer); Now the problem I am facing is that as soon as LCD_sendstring(str_buffer) is called, everyting else disappears from LCD! even though the Keil debugger shows "12" being copied/concatenated to str_buffer on using strcpy/strcat(str_buffer,dec2ascii(12)); while the following code works: strcpy(str_buffer,"11")); strcat(str_buffer,":"); strcat(str_buffer,"22"); strcat(str_buffer,":"); strcat(str_buffer,"33"); LCD_sendstring(str_buffer);& prints 11:22:33 on LCD. On dubugging yet another test code: strcpy(str_buffer,dec2ascii(11)); strcat(str_buffer,":"); strcat(str_buffer,dec2ascii(22)); strcat(str_buffer,":"); strcat(str_buffer,dec2ascii(33)); LCD_sendstring(str_buffer);I found that "11:22:33" is passed to LCD_sendstring() but still disappearing on LCD! Here is my dec2ascii() (it's in another file containing DS1307 subroutines) /*------------------------------------------------------------------------
Converts 2 digit decimal to ACSII string... 26 to "26"
returns pointer to converted string i.e 2
--------------------------------------------------------------------------*/
unsigned char* dec2ascii (unsigned char dec)
{
code unsigned char asciitable[10]={'0','1','2','3','4','5','6','7','8','9'}; //look up table for ascii values
static unsigned char buffer[2]; //to hold the 2 ascii codes ... MUST be static
buffer[0]=asciitable[(dec-dec%10)/10]; //tens
buffer[1]=asciitable[dec%10]; //ones
return buffer;
}
my typical tested & working routines to read from RTC: unsigned char read_hour(void)
{ unsigned char temp;
temp = readbyte(HR_RTC);
if(temp & (1<<6)) //12 hr mode is selected if set
return(bcd2dec(temp & ~(1<<6) & ~(1<<5))); //strip the 6th & 5th bits: AM/PM & 12hr/24hr mode & convert the remaining
else
return(bcd2dec(temp));
}
unsigned char read_min(void)
{ return(bcd2dec(readbyte(MIN_RTC)));
}
unsigned char read_sec(void)
{ return(bcd2dec(readbyte(SEC_RTC)));
}
What could be wrong with my code? |



