⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtc._c

📁 12864菜单
💻 _C
📖 第 1 页 / 共 2 页
字号:
功    能: 1. 在1602液晶上显示当前时间 2.可以设置时间(M1-M9为数字0-9,M13为设置模式和显示模式选择,M14为当前设置位选择)
参    数: 无
返回值  : 无
/********************************************/
void shizhong(void)
{
 uchar i,RD_TFLAG=1,set_num=0,n=0;//i为键盘译码值
 	   						  //RD_TFLAG为是否设置时间的标志,为1是显示状态,不设置,为0时进入设置状态
							  //set_num是设置哪一位的标志,如为0的时候设置的是秒
 uchar setadd,setdat,shift;	  //setadd指定将当前数值送入DS1302的哪个寄存器
 	   						  //setdat是当前设置的数值,即被送入DS1302指定寄存器的数
							  //shift来实现十位和各位的设置相互独立(因为十位和个位是在一个寄存器里的)
 uchar dis_x,dis_y;			  //存储1602液晶当前光标的位置
 uchar settime[7]={0x15,0x58,0x13,0x01,0x01,0x06,0x07};//设置的秒,分,时,日,月,星期,年
 uchar gettime[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};//保存当前时间的数组
 Board_init();	   			//初始化开发板 

 LCD12864_initial();
 LCD12864_clear();
 DS1302_portinit();			//初始化DS1302的三根数据线
 DS1302_init();				//启动振荡器,DS1302开始工作  
 while(!n)					//以下程序完成显示和设置时间
 {
  if(RD_TFLAG)				//如果是设置模式则不更新时间显示
  {
   DS1302_getT(gettime);	//获得当前时间
   Disp_time(gettime);		//显示当前时间
  }
  if(Mkey_press())	  		//是否有按键按下
  {
   i=Mkey_scan();	  		//扫描并反回翻译后的键码 
   switch(i)
   {
   	case 0x0:				//将当前设置位设置成0
		if(RD_TFLAG==0)		//检测是否是设置模式(为0就是设置模式)
		{
		 setdat=DS1302_readD(setadd|RD);		//读出当前时间				   
		 setdat=setdat>>shift|setdat<<shift;	//根据shift值来设置DS1302寄存器的十位还是个位(shift为0设置的是个位,为4设置的是十位)
		 setdat&=0xF0;							//保留高位不变(设置十位则个位不变,设置个位则十位不变,因为上条语句已经根据shift的值把需要设置的位移动到低位了)
		 setdat|=0;								//按下的是0键,所以把当前设置位设置成0
		 setdat=setdat>>shift|setdat<<shift;	//把十位和个位还原成正确值
		 DS1302_writeD(C_WP|WR,UPROTECT);		//解除写保护
		 DS1302_writeD(setadd|WR,setdat);		//写入设置值
		 DS1302_writeD(C_WP|WR,PROTECT);		//写保护
		 LCD12864_gotoXY(dis_x,dis_y);			//将当前设置位在1602液晶上对应的位置显示更新
		 LCD12864_sendstr("0");					//向1602写入0字符并显示
		 LCD12864_gotoXY(dis_x,dis_y);			//将光标保持在当前设置位上
		}
		break;		 
	case 0x1:	//过程和0键相同,只是将当前设置位设置成1并更新显示
	    if(RD_TFLAG==0)
		{
		 setdat=DS1302_readD(setadd|RD);
		 setdat=setdat>>shift|setdat<<shift;
		 setdat&=0xF0;
		 setdat|=1;
		 setdat=setdat>>shift|setdat<<shift;
		 DS1302_writeD(C_WP|WR,UPROTECT);
		 DS1302_writeD(setadd|WR,setdat);
		 DS1302_writeD(C_WP|WR,PROTECT);
		 LCD12864_gotoXY(dis_x,dis_y);
		 LCD12864_sendstr("1");
		 LCD12864_gotoXY(dis_x,dis_y);
		}		 
		break;
	case 0x2: 	 //过程和0键相同,只是将当前设置位设置成2并更新显示
		if(RD_TFLAG==0)
		{
		 setdat=DS1302_readD(setadd|RD);
		 setdat=setdat>>shift|setdat<<shift;
		 setdat&=0xF0;
		 setdat|=2;
		 setdat=setdat>>shift|setdat<<shift;
		 DS1302_writeD(C_WP|WR,UPROTECT);
		 DS1302_writeD(setadd|WR,setdat);
		 DS1302_writeD(C_WP|WR,PROTECT);
		 LCD12864_gotoXY(dis_x,dis_y);
		 LCD12864_sendstr("2");
		 LCD12864_gotoXY(dis_x,dis_y);
		}		 
		break;
	case 0x3:   //过程和0键相同,只是将当前设置位设置成3并更新显示
		if(RD_TFLAG==0)
		{
		 setdat=DS1302_readD(setadd|RD);
		 setdat=setdat>>shift|setdat<<shift;
		 setdat&=0xF0;
		 setdat|=3;
		 setdat=setdat>>shift|setdat<<shift;
		 DS1302_writeD(C_WP|WR,UPROTECT);
		 DS1302_writeD(setadd|WR,setdat);
		 DS1302_writeD(C_WP|WR,PROTECT);
		 LCD12864_gotoXY(dis_x,dis_y);
		 LCD12864_sendstr("3");
		 LCD12864_gotoXY(dis_x,dis_y);
		}		 
		break;
	case 0x4:   //过程和0键相同,只是将当前设置位设置成4并更新显示
		if(RD_TFLAG==0)
		{
		 setdat=DS1302_readD(setadd|RD);
		 setdat=setdat>>shift|setdat<<shift;
		 setdat&=0xF0;
		 setdat|=4;
		 setdat=setdat>>shift|setdat<<shift;
		 DS1302_writeD(C_WP|WR,UPROTECT);
		 DS1302_writeD(setadd|WR,setdat);
		 DS1302_writeD(C_WP|WR,PROTECT);
		 LCD12864_gotoXY(dis_x,dis_y);
		 LCD12864_sendstr("4");
		 LCD12864_gotoXY(dis_x,dis_y);
		}		 
		break;
	case 0x5:    //过程和0键相同,只是将当前设置位设置成5并更新显示
		if(RD_TFLAG==0)
		{
		 setdat=DS1302_readD(setadd|RD);
		 setdat=setdat>>shift|setdat<<shift;
		 setdat&=0xF0;
		 setdat|=5;
		 setdat=setdat>>shift|setdat<<shift;
		 DS1302_writeD(C_WP|WR,UPROTECT);
		 DS1302_writeD(setadd|WR,setdat);
		 DS1302_writeD(C_WP|WR,PROTECT);
		 LCD12864_gotoXY(dis_x,dis_y);
		 LCD12864_sendstr("5");
		 LCD12864_gotoXY(dis_x,dis_y);
		}		 
		break;
	case 0x6:    //过程和0键相同,只是将当前设置位设置成6并更新显示
		if(RD_TFLAG==0)
		{
		 setdat=DS1302_readD(setadd|RD);
		 setdat=setdat>>shift|setdat<<shift;
		 setdat&=0xF0;
		 setdat|=6;
		 setdat=setdat>>shift|setdat<<shift;
		 DS1302_writeD(C_WP|WR,UPROTECT);
		 DS1302_writeD(setadd|WR,setdat);
		 DS1302_writeD(C_WP|WR,PROTECT);
		 LCD12864_gotoXY(dis_x,dis_y);
		 LCD12864_sendstr("6");
		 LCD12864_gotoXY(dis_x,dis_y);
		}		 
		break;
	case 0x7:    //过程和0键相同,只是将当前设置位设置成7并更新显示
		if(RD_TFLAG==0)
		{
		 setdat=DS1302_readD(setadd|RD);
		 setdat=setdat>>shift|setdat<<shift;
		 setdat&=0xF0;
		 setdat|=7;
		 setdat=setdat>>shift|setdat<<shift;
		 DS1302_writeD(C_WP|WR,UPROTECT);
		 DS1302_writeD(setadd|WR,setdat);
		 DS1302_writeD(C_WP|WR,PROTECT);
		 LCD12864_gotoXY(dis_x,dis_y);
		 LCD12864_sendstr("7");
		 LCD12864_gotoXY(dis_x,dis_y);
		}		 
		break;
	case 0x8:    //过程和0键相同,只是将当前设置位设置成8并更新显示
		if(RD_TFLAG==0)
		{
		 setdat=DS1302_readD(setadd|RD);
		 setdat=setdat>>shift|setdat<<shift;
		 setdat&=0xF0;
		 setdat|=8;
		 setdat=setdat>>shift|setdat<<shift;
		 DS1302_writeD(C_WP|WR,UPROTECT);
		 DS1302_writeD(setadd|WR,setdat);
		 DS1302_writeD(C_WP|WR,PROTECT);
		 LCD12864_gotoXY(dis_x,dis_y);
		 LCD12864_sendstr("8");
		 LCD12864_gotoXY(dis_x,dis_y);
		}		 
		break;
	case 0x9:    //过程和0键相同,只是将当前设置位设置成9并更新显示
		if(RD_TFLAG==0)
		{
		 setdat=DS1302_readD(setadd|RD);
		 setdat=setdat>>shift|setdat<<shift;
		 setdat&=0xF0;
		 setdat|=9;
		 setdat=setdat>>shift|setdat<<shift;
		 DS1302_writeD(C_WP|WR,UPROTECT);
		 DS1302_writeD(setadd|WR,setdat);
		 DS1302_writeD(C_WP|WR,PROTECT);
		 LCD12864_gotoXY(dis_x,dis_y);
		 LCD12864_sendstr("9");
		 LCD12864_gotoXY(dis_x,dis_y);
		}		 
		break;
	case 0xC: 	 					 //模式选择按键,更换设置模式和显示模式(每按一下,交替设置和显示模式)
		 RD_TFLAG^=0x01;			 //改变模式标志,RD_TFLAG为0是设置模式,RD_TFLAG为1是显示模式
		 if(RD_TFLAG==0)			 //如果进入设置模式,做以下工作
		 
		 {		  
		  setdat=DS1302_readD(C_SEC|RD);			//读出秒寄存器的内容
		  DS1302_writeD(C_WP|WR,UPROTECT);			//解除写保护
		  DS1302_writeD(C_SEC|WR,CLK_HALT|setdat);	//进入设置模式就停止振荡器,但不改变秒寄存器的内容	
		  DS1302_writeD(C_WP|WR,PROTECT);			//写保护
		//  while(LCD12864_readBF());					//更新1602
 		  LCD12864_sendbyte(iCmd, 0XFE);		//启动光标闪烁功能
		  LCD12864_gotoXY(3,7);	 					//光标定位在秒个位(进入设置模式默认设置秒个位)
		// LCD12864_sendstr("   ");
		  setadd=C_SEC;								//将设置地址指向秒寄存器
		  shift=0;									//设置秒个位
		  dis_x=3;									//1602第2行
		  dis_y=7;									//1602第11列
		 }
		 else
		 {	 										//显示模式应做以下工作
		  setdat=DS1302_readD(C_SEC|RD);			//读出秒寄存器的内容 		  
		  DS1302_writeD(C_WP|WR,UPROTECT);			//解除写保护
		  DS1302_writeD(C_SEC|WR,0x7F&setdat);		//进入显示模式就启动振荡器,但不改变秒寄存器的内容	
		  DS1302_writeD(C_WP|WR,PROTECT);			//写保护
		  LCD12864_sendbyte(iCmd, 0X0C);			//将光标闪烁关闭
		  
		  set_num=0;			 					//将当前设置位改为默认的秒寄存器
		 }
		 break;
	case 0xD:  							//当前设置位选择按键(按动此键,将循环改变设置位为:秒-分-时-星期-日-月-年,先个位后十位)			
		 if(RD_TFLAG==0)				//设置模式此键生效,显示模式此键不响应
		 {
		   set_num+=1;					//当前设置位加1
		   if(set_num==13)				//当前设置位为年十位的时候,再按此键将当前设置位改为秒个位
		   {
		   set_num=0;
		   }
		   switch(set_num)				//根据set_num来判断当前设置位,并做相应工作
		   {
		   	case 0:						//设置秒个位
		  	   LCD12864_gotoXY(2,6);	//更新1602的光标位置
			   setadd=C_SEC;			//设置地址指向秒寄存器
			   shift=0;					//设置个位标志
			   dis_x=2;					//1602第2行
			   dis_y=6;				    //1602第11列
			   break;
		  	case 1:	 					//设置秒十位
		  	   LCD12864_gotoXY(2,10);	//更新1602的光标位置
			   setadd=C_SEC;			//设置地址指向秒寄存器
			   shift=4;					//设置十位标志
			   dis_x=2;					//1602第2行
			   dis_y=10;				//1602第10列
			   break;
		    case 2:
		  	   LCD12864_gotoXY(2,8);
			   setadd=C_MIN;	   		//设置地址指向分寄存器
			   shift=0;					//设置个位标志
			   dis_x=2;
			   dis_y=8;
			   break;
		    case 3:
		  	   LCD12864_gotoXY(2,7);
			   setadd=C_MIN;	   		//设置地址指向分寄存器
			   shift=4;					//设置十位标志
			   dis_x=2;
			   dis_y=7;
			   break;
		    case 4:
		  	   LCD12864_gotoXY(2,5);
			   setadd=C_HR;		   		//设置地址指向小时寄存器
			   shift=0;					//设置个位标志
			   dis_x=2;
			   dis_y=5;
			   break;
		    case 5:
		  	   LCD12864_gotoXY(2,4);
			   setadd=C_HR;		   		//设置地址指向小时寄存器
			   shift=4;					//设置十位标志
			   dis_x=2;
			   dis_y=4;
			   break;
		    case 6:
		  	   LCD12864_gotoXY(1,13);
			   setadd=C_WK;				//设置地址指向星期寄存器
			   shift=0;					//设置个位标志
			   dis_x=1;
			   dis_y=13;
			   break; 
			case 7:
		  	   LCD12864_gotoXY(1,11);
			   setadd=C_DAY;			//设置地址指向日寄存器
			   shift=0;					//设置个位标志
			   dis_x=1;
			   dis_y=11;
			   break; 
			case 8:
		  	   LCD12864_gotoXY(1,10);
			   setadd=C_DAY;			//设置地址指向日寄存器
			   shift=4;					//设置十位标志
			   dis_x=1;
			   dis_y=10;
			   break; 
			case 9:
		  	   LCD12864_gotoXY(1,8);
			   setadd=C_MTH;	   		//设置地址指向月寄存器
			   shift=0;					//设置个位标志
			   dis_x=1;
			   dis_y=8;
			   break; 
			case 10:
		  	   LCD12864_gotoXY(1,7);
			   setadd=C_MTH;	   		//设置地址指向月寄存器
			   shift=4;					//设置十位标志
			   dis_x=1;
			   dis_y=7;
			   break;   
			case 11:
		  	   LCD12864_gotoXY(1,5);
			   setadd=C_YR;		   		//设置地址指向年寄存器
			   shift=0;					//设置个位标志
			   dis_x=1;
			   dis_y=5;
			   break; 
			case 12:
		  	   LCD12864_gotoXY(1,4);
			   setadd=C_YR;		   		//设置地址指向年寄存器
			   shift=4;					//设置十位标志
			   dis_x=1;
			   dis_y=4;
			   break; 
		   }
		 break;
		 }
	case 0xf://取消
		menu_0();	
		n=1;
	   	break;
	default:		 
		 break;		
   }
  }
 }
}

⌨️ 快捷键说明

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