This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

A question about C data structure (source code)

Source code:

union Time
{
unsigned char year,month,day;
unsigned char hour,minute,second;
};

xdata struct structure2
{
unsigned int FileNum_InDay;
union Time Current;
} GPS;

......

void GetCurrentTime(unsigned char *ptr1)
{
/*
Caculated out:

GPS.Current.hour
GPS.Current.minute
GPS.Current.second
*/
unsigned char xdata H_Temp;
unsigned char xdata M_Temp;
unsigned char xdata S_Temp;
float xdata temp1,temp2;

temp1 = DataConver64(ptr1);
temp2 = temp1 / 3600;
H_Temp = temp2;
temp1 = temp2 - H_Temp;
temp2 = temp1 * 60;
M_Temp = temp2;
temp1 = temp2 - M_Temp;
S_Temp = temp1 * 60;


GPS.Current.hour = H_Temp; //a //******* Something Wrong********//
GPS.Current.minute = M_Temp; //b
GPS.Current.second = S_Temp; //c





}

......


void Main(void)
{
unsigned char i,m,hour;
unsigned int xdata POWER1=0,POWER2=0,POWER3= 0;
float xdata Tim = 0;
unsigned char p[8] = { 0x00, 0x00, 0x00, 0x00, 0xFE, 0x74, 0x22, 0x41 };
unsigned char l[4] = { 0x85,0xac,0x41,0x42};


WDTCN = 0x07; // Watchdog Timer Control Register
WDTCN = 0xDE; // Disable WDT
WDTCN = 0xAD;

Tim = DataConver32(l);
Tim = DataConver64(p);
GetCurrentTime(p);
hour = GPS.Current.hour;
//d
......


The data structure is defined in public.
When the program step to flag 'a' in subroutine,all value is right. To 'b',GPS.Current.hour equal to 0xA7.But ,when step to 'c',the value of GPS.Current.hour change to GPS.Current.minute ,which equal to 0x3b.So,step to 'd' ,the result is that 'hour == 0x3b'.Lately,I found that three variable ( GPS.Current.hour / minute / second ) all be stored at the same location(0x0435) in the assembler. How can I transfer this data_struct to another subroutine?
If a mcu is mutiplex Serial UART, how can I use the macro ' printf ' ?
Thanks for help.

0