ds1302.c

来自「本人做的一款LED控制程序」· C语言 代码 · 共 239 行

C
239
字号
 /*----------------------------------------------
DS1302读写一体化C51源程序 
何代仁 2005-6-20
------------------------------------------------*/

sbit SCLK = P1^5;
sbit IO   = P1^6;
sbit RSTB = P1^7; 
/******************函数原型说明******************/
void clkwritebyte();       //时钟字节写入函数
void ramwritebyte();       //RAM字节写入函数
Uchar rbyte_3w();		   //字节读入函数
void reset_3w();		   //复位函数
void wbyte_3w(Uchar);      //字节写入函数
void initialize_DS1302();  //DS1302初始化函数
void disp_clk_regs(Uchar); //显示时钟寄存器内容函数
void burstramrd();         //多字节突发方式读取RAM函数
void burstramwr();         //多字节突发方式写入RAM函数
/****************复位函数*************************/
void reset_3w() {
	SCLK = 0;
	RSTB = 0;
	RSTB = 1;
}
/*****************字节写入函数********************/
void wbyte_3w(Uchar W_Byte) {
	Uchar i;
	for(i = 0;i < 8; ++i) {
		IO = 0;
		if(W_Byte & 0x01) IO = 1; 		
		SCLK = 0;		
		SCLK = 1; 		
		W_Byte  >>= 1;	
	}
}
/*****************字节读取函数********************/
Uchar rbyte_3w() {
	Uchar i;
	Uchar R_Byte;
	Uchar TmpByte;

	R_Byte = 0;
	 IO = 1;
	 for(i=0; i<8; ++i) {  	 
	 	SCLK = 1; 		
		SCLK = 0;	
		TmpByte = (Uchar)IO;
		TmpByte <<= 7;
		R_Byte >>= 1;
		R_Byte |= TmpByte;
	 }
	 return (R_Byte);
}
/*****************时钟字节写入函数********************/
/*
void clkwritebyte() {
	Uchar ClkAdd;
	Uchar ClkData;

	printf("\nWrite Clock ADDRESS:");
	scanf("%bu", &ClkAdd);		// 输入时钟地址
	printf("\nWrite Clock DATA:");
	scanf("%bx", &ClkData);		// 输入时钟数据
	ClkAdd = ((ClkAdd * 2) | 0x80); //时钟数据写入命令
	reset_3w();
	wbyte_3w(ClkAdd);
	wbyte_3w(ClkData);
	reset_3w();
}

/*****************RAM字节写入函数********************/
/*
void ramwritebyte() {
	Uchar ramadd;
	Uchar ramdata;

	printf("\nWrite Ram ADDRESS (HEX):");
	scanf("%bx", &ramadd);     //输入RAM地址
	printf("\nWrite Ram DATA (HEX):");
	scanf("%bx", &ramdata);	   //输入RAM数据
	ramadd = ((ramadd * 2) | 0xc0); //RAM数据写入命令
	reset_3w();
	wbyte_3w(ramadd);
	wbyte_3w(ramdata);
	reset_3w();
} */
/*****************显示时钟寄存器内容函数********************/
/*
void disp_clk_regs(Uchar loop) {
	Uchar lsec = 99, sec, min, hrs, dte, mon, day, yr;
	do  {		   					//读取并显示时钟寄存器内容
		reset_3w();
	wbyte_3w(0xbf);					//以多字节突发方式读取时钟数据
	sec = rbyte_3w();				//秒
	min = rbyte_3w();				//分
	hrs = rbyte_3w();				//小时
	dte = rbyte_3w();				//日期
	mon = rbyte_3w();				//月份
	day = rbyte_3w();				//星期
	yr  = rbyte_3w();				//年
	reset_3w();	
	} 
	
}
  */
/******************多字节突发方式读取RAM函数******************/
/*void burstramrd() {
	Uchar rmary[31];
	Uchar i;

	reset_3w();
	wbyte_3w(0xff);
	for (i=0; i<31; ++i) {
		rmary[i] = rbyte_3w();
	}
	reset_3w();

	
} */

/******************多字节突发方式写入RAM函数******************/
/*
void burstramwr() {
	Uchar ramdata;
	Uchar i;
	
	reset_3w();
	wbyte_3w(0xfe);  //以多字节突发方式写入RAM
	for (i=0; i<31 ;++i) {
		wbyte_3w(ramdata);
	}
	reset_3w();
}

/***********************DS1302初始化函数**********************/
Uchar BCD2HEX(Uchar d) {
	Uchar d1;
	
	d1 = d >> 4 & 0x0f;
	d1 = d1 * 10 ;
	d = d1 + (d & 0x0f);
	return(d);
}

Uchar HEX2BCD (Uchar d) {
	Uchar d1,d2;
	
	d1 = d / 10 << 4;
	d2 = d % 10;
	d = d1 | d2;
	return (d) ;
}
void initialize_DS1302() {
	Uchar  yr, mn, date, dy, hr, min, sec,menu;
	
	reset_3w();
	wbyte_3w(0xbf);							//以多字节突发方式读取时钟数据
	sec = BCD2HEX(rbyte_3w());				//秒
	min = BCD2HEX(rbyte_3w());				//分
	hr =  BCD2HEX(rbyte_3w());				//小时
	date = BCD2HEX(rbyte_3w());				//日期
	mn =  BCD2HEX(rbyte_3w());				//月份
	dy =  BCD2HEX(rbyte_3w());				//星期
	yr  = BCD2HEX(rbyte_3w());				//年
	reset_3w();	
	  while(1) {
		if(key_e==1){key_e=0; menu++; if(menu>=7)menu=0;Discmd=1;}
		if(menu==0)yr=Getkey(yr,99);
		if(menu==1)mn=Getkey(mn,12);
		if(menu==2)date=Getkey(date,31);
		if(menu==3)dy=Getkey(dy,7);
		if(menu==4)hr=Getkey(hr,24);
		if(menu==5)min=Getkey(min,59);
		if(menu==6)sec=Getkey(sec,59); 				
		if(key_c == 1){key_c = 0; goto oc;}
		if(Discmd == 1){
			Uchar a,b;

			Discmd = 0;
			ePutstr(0,0,"20  -  -   W    ");
			ePutstr(0,1,"  :  :          ");
			a = yr/10;
			b = yr%10;
			DispOneChar(2,0,a+0x30);
			DispOneChar(3,0,b+0x30);			
			a = mn/10;
			b = mn%10;
			DispOneChar(5,0,a+0x30);
			DispOneChar(6,0,b+0x30);
			a = date/10;
			b = date%10;
			DispOneChar(8,0,a+0x30);
			DispOneChar(9,0,b+0x30);		
			b = dy%10;			
			DispOneChar(13,0,b+0x30);
			a = hr/10;
			b = hr%10;
			DispOneChar(0,1,a+0x30);
			DispOneChar(1,1,b+0x30);
			a = min/10;
			b = min%10;
			DispOneChar(3,1,a+0x30);
			DispOneChar(4,1,b+0x30);
			a = sec/10;
			b = sec%10;
			DispOneChar(6,1,a+0x30);
			DispOneChar(7,1,b+0x30);
			if(menu==0)Coruscant(3,0);
			if(menu==1)Coruscant(6,0);
			if(menu==2)Coruscant(9,0);
			if(menu==3)Coruscant(13,0);
			if(menu==4)Coruscant(1,1);
			if(menu==5)Coruscant(4,1);
			if(menu==6)Coruscant(7,1);
		}	
   }
oc:	ePutstr(0,0,"Save OK    ");
	Menu2 = 0;			 	
	reset_3w();
	wbyte_3w(0x8e);	//写保护控制寄存器
	wbyte_3w(0);    //允许写入
	reset_3w();
	wbyte_3w(0x90); //涡流充电控制寄存器
	wbyte_3w(0xab); //允许充电,双二极管,8K电阻
	reset_3w();
	wbyte_3w(0xbe);	//多字节突发方式写入时钟数据(8个字节)
    wbyte_3w(HEX2BCD(sec));
	wbyte_3w(HEX2BCD(min));
	wbyte_3w(HEX2BCD(hr));
	wbyte_3w(HEX2BCD(date));
	wbyte_3w(HEX2BCD(mn));
	wbyte_3w(HEX2BCD(dy));
	wbyte_3w(HEX2BCD(yr));
	wbyte_3w(0);	//以多字节突发方式写入时钟数据时
					//必须对写保护控制寄存器写入0值
	reset_3w();

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?