* 调用: v_RTInputByte()
* 输入: pReDa: 寄存器数据地址 * 返回值: 无
***********************************************************************/ void v_BurstW1302R(Uchar *pReDa) {
Uchar i;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/ T_RST = 0; T_CLK = 0; T_RST = 1;
v_RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */ for (i=31;i>0;i--) /*31Byte 寄存器数据 */ {
v_RTInputByte(*pReDa); /* 写1Byte数据*/ pReDa++; }
T_CLK = 1; T_RST =0;
}
/******************************************************************** * * 名称: uc_BurstR1302R
* 说明: 先写地址,后读命令/数据(寄存器多字节方式) * 功能: 读取DS1302寄存器数据
* 调用: v_RTInputByte() , uc_RTOutputByte() * 输入: pReDa: 寄存器数据地址 * 返回值: 无
***********************************************************************/ void v_BurstR1302R(Uchar *pReDa) {
Uchar i; T_RST = 0; T_CLK = 0; T_RST = 1;
v_RTInputByte(0xff); /* 0xbf:时钟多字节读命令 */ for (i=31; i>0; i--) /*31Byte 寄存器数据 */ {
*pReDa = uc_RTOutputByte(); /* 读1Byte数据 */ pReDa++; }
T_CLK = 1;
T_RST =0; }
/******************************************************************** *
10
* 名称: v_Set1302
* 说明:
* 功能: 设置初始时间 * 调用: v_W1302()
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B * 返回值: 无
***********************************************************************/ void v_Set1302(Uchar *pSecDa) { Uchar i;
Uchar ucAddr = 0x80;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/ for(i =7;i>0;i--)
{
v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */ pSecDa++; ucAddr +=2; }
v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/ }
/******************************************************************** * * 名称: v_Get1302 * 说明:
* 功能: 读取DS1302当前时间
* 调用: uc_R1302()
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B * 返回值: 无
***********************************************************************/ void v_Get1302(Uchar ucCurtime[]) {
Uchar i;
Uchar ucAddr = 0x81; for (i=0;i<7;i++) {
ucCurtime[i] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */ ucAddr += 2; } }
/********************************************************************** *时子程序(在YB-51-B实验板配套的各功能演示程序中都是调用的本延时子程序)
11
*作者:郑州远博科技 王兴民
*0371-66949037 0371-67256036 13949105551
***********************************************************************/ //#include
void Delayus(Uchar j) //延时时间为 j*10+8 us (根据生成的汇编代码计算) {
while(j) { _nop_(); _nop_(); _nop_(); _nop_();
j--; } }
void Delayms(Uint n) { //延时时间大约n*1 ms while(n) { Delayus(100); //延时为1008us n--; }
}
/************************************************************************* *YB-51-B DS1302的时钟演示程序
*来源: 郑州远博科技 王兴民371-66949037 0371-67256036 13949105551
***************************************************************************/ //#include
data Uchar yjdispbuff[32]; //液晶屏显示缓冲区 data Uchar clockdata2[7]; //时钟数据缓冲区 data Uchar *clockdatain; data Uchar *clockdataout; data Uchar cmddata;
data Uchar indata,outdata;
data Uchar houtdatal,houtdatah,moutdatal,moutdatah,soutdatal,soutdatah; //时、分、秒
data Uchar noutdatal,noutdatah,youtdatal,youtdatah,routdatal,routdatah; //年、月、日
data Uchar woutdatal, woutdatah; //星期 void main() { Uchar j;
for(j=0;j<32;j++) { yjdispbuff[j]=32; }
12
Delayms(100);
Lcdreset(); cmddata=0x8e; indata=0x00;
v_W1302(cmddata, indata); //init cmddata=0x80; indata=0x00;
v_W1302(cmddata, indata);//秒 cmddata=0x82; indata=0x30;
v_W1302(cmddata, indata);//分 cmddata=0x84;
indata=0x08;
v_W1302(cmddata, indata);//小时 cmddata=0x86; indata=0x18;
v_W1302(cmddata, indata);//日 cmddata=0x88; indata=0x01;
v_W1302(cmddata, indata);//月 cmddata=0x8A;
indata=0x01;
v_W1302(cmddata, indata);//星期 cmddata=0x8C; indata=0x10;
v_W1302(cmddata, indata);//年 while(1) {
clockdataout=&clockdata2; v_BurstR1302T(clockdataout); soutdatal=clockdata2[0]&0x0f; soutdatah=(clockdata2[0]>>4)&0x07; moutdatal=clockdata2[1]&0x0f; moutdatah=(clockdata2[1]>>4)&0x07; houtdatal=clockdata2[2]&0x0f; houtdatah=(clockdata2[2]>>4)&0x07; routdatal=clockdata2[3]&0x0f; routdatah=(clockdata2[3]>>4)&0x07; youtdatal=clockdata2[4]&0x0f;
youtdatah=(clockdata2[4]>>4)&0x07; woutdatal=clockdata2[5]&0x0f;
woutdatah=(clockdata2[5]>>4)&0x07;
noutdatal=clockdata2[6]&0x0f;
noutdatah=(clockdata2[6]>>4)&0x07;
yjdispbuff[0]=50; //50代表数字‘2’的ASC码,液晶屏是按照ASC
13
码来显示字符的
yjdispbuff[1]=48; //48代表数字‘0’的ASC码 yjdispbuff[2]=noutdatah+48; //48表示对应数字的实际值和相对应的ASC码的偏移量
yjdispbuff[3]=noutdatal+48; yjdispbuff[5]=youtdatah+48; yjdispbuff[6]=youtdatal+48; yjdispbuff[8]=routdatah+48; yjdispbuff[9]=routdatal+48; yjdispbuff[13]=woutdatal+48; yjdispbuff[17]=houtdatah+48; yjdispbuff[18]=houtdatal+48; yjdispbuff[20]=moutdatah+48; yjdispbuff[21]=moutdatal+48; yjdispbuff[23]=soutdatah+48; yjdispbuff[24]=soutdatal+48;
yjdispbuff[4]=45; //‘-’的ASC码 yjdispbuff[7]=45;
yjdispbuff[10]=32; //空格的ASC码 yjdispbuff[11]=32; yjdispbuff[12]=32; yjdispbuff[14]=32; yjdispbuff[15]=32; yjdispbuff[16]=32; yjdispbuff[19]=45; yjdispbuff[22]=45; for(j=0;j<32;j++)
{
Disponechar(0,j+2,yjdispbuff[j]); } }
}
14