我初学C51,很多都不熟悉,望各位不吝赐教啊
我用DS12C887和STC89C52做一个时钟,做到一个C程序中好做一些,如果是分出模块来的话,把DS12C887做成独立的一个模块,然后再模块中读取时间,然后在主程序中获取模块里读取的时间值,程序是我自己想的,思路有不对的也请指正;我在DS12C887的模块中使用了一个函数
uchar ds_r_
tim(uchar *p)
{
uchar a[5];
a[0] = XBYTE[0x8000];
a[1] = XBYTE[0x8002];
a[2] = XBYTE[0x8004];
a[3] = XBYTE[0x8007];
a[4] = XBYTE[0x8008];
a[5] = XBYTE[0x8009];
p = a;
return *p;
}
我想把模块离得函数的返回指针P的值在主函数中赋值给主函数中定义的一个数组DS_TIM[5]的首地址指针值。
DS_TIM = &(uchar ds_r_tim(uchar *p))
这样DS_TIM[5]就能够读出时间值了。
这种想法对吗?如果错误的话,像这种模块中的一组数值,应该怎么传递到其他模块中呢?谢谢
在.H头文件里定义了一中新结构
//定义时间类型
typedef struct _SYSTEMTIME_
{
unchar Second;
unchar Minute;
unchar Hour;
unchar Week;
unchar Day;
unchar Month;
unchar Year;
unchar DateString[9];
unchar TimeString[9];
}SYSTEMTIME;
在主程序中定义了一个新结构的变量
SYSTEMTIME CurrentTime;
在主程序下面使用该变量调用模块中的函数进行时间数据读取
DS1302_GetTime(&CurrentTime);
该语句在模块DS1302.C中展开来看是这样的:
void DS1302_GetTime(SYSTEMTIME *Time); //声明函数 读出时间
//读出时间
void DS1302_GetTime(SYSTEMTIME *Time)
{
unchar ReadValue;
ReadValue = Read1302(DS1302_SECOND);
Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f);
ReadValue = Read1302(DS1302_MINUTE);
Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f);
ReadValue = Read1302(DS1302_HOUR);
Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f);
ReadValue = Read1302(DS1302_DAY);
Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f);
ReadValue = Read1302(DS1302_WEEK);
Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f);
ReadValue = Read1302(DS1302_MONTH);
Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f);
ReadValue = Read1302(DS1302_YEAR);
Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f);
}
看这个函数是完全懵的,什么也看不明白了
其中涉及的另外一个函数是Read1302()是这样的
//读取1302指定地址中的数据
unchar Read1302(unchar Address)
{
unchar Data;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1; //RST拉高,启动数据传送
DS1302_InputByte(Address|0x01);//读取指定地址数据指令
Data = DS1302_OutputByte();
DS1302_CLK = 1;
DS1302_RST = 0;
return (Data);
}
一周热门 更多>