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

📄 system.c

📁 51单片机时钟 和18B20 温度的 LED显示
💻 C
📖 第 1 页 / 共 2 页
字号:
                        else 
                        	nday = ++nday;
	                    break;
	            }
	                    break;
			case 0x0004:                                         //如果是KEY3按下,那么光标所对应的值进行减操作
	        	switch(j)
	            	{
	                	case 0:
	                    	if(year<=2001)
	                        	year = 2100;
	                        else
	                        	year = --year;
							break;
                        case 2:
							if(gmonth==1)
                        		gmonth = 12;
                        	else
                        		gmonth = --gmonth;
							break;
                        case 4:
							if(gday==1)
                            	gday = 31;
                            else
                            	gday = --gday;
							break;
                        case 6:
							if(hour==0)
                            	hour = 23;
                            else
                            	hour = --hour;
							 break;
                        case 8:
							if(min==0)
                             	min = 59;
                            else
                            	min = --min;	
                            break;
                        case 10:
							if(sec==0)
								sec = 60;
                            else
                            	sec = --sec;
							break;
                        case 12:
                        	if(nmonth==1)
                            	nmonth = 12;
                            else
                            	nmonth = --nmonth;
							break;
                         case 14:
                         	if(nday==1)
                            	nday = 30;
                            else
                            	nday = --nday;
                            break; 
	            	}
                    break;
	          
		}
	}
}

//===============================================================//
//语法格式:void naoclockshow1(shownhour,shownmin,keynow)
//实现功能:显示闹钟调整界面
//参数    :shownhour,shownmin,keynow,闹钟的小时,分钟,当前光标
//返回值  :无
//==============================================================//
void naoclockshow1(shownhour,shownmin,keynow)                   //显示闹钟调整界面
{
	int clockhourshi=0;
    int clockhourge=0;
    int clockminshi=0;
    int clockminge=0;
    clockhourshi=shownhour/10;
    clockhourge=shownhour%10;
    clockminshi=shownmin/10;
    clockminge=shownmin%10;
    switch(keynow)
    {
    	case 0:
    		if(Flash)						//正常显示
 			{
 				uart_operate(0x00);
 				uart_operate(0x00);
 				uart_operate(LED[clockhourshi]);
				uart_operate(LED[clockhourge]);		//显示时
				uart_operate(LED[clockminshi]);
				uart_operate(LED[clockminge]);		//显示分
				uart_operate(0x00);
				uart_operate(0x00);			
 				Flash=0;
 			}
 			else if(DispEnb)				//每0.5s年不显示
 			{
 				uart_operate(0x00);
 				uart_operate(0x00);
 				uart_operate(0x00);
				uart_operate(0x00);			//不显示时
				uart_operate(LED[clockminshi]);
				uart_operate(LED[clockminge]);		//显示分
				uart_operate(0x00);
				uart_operate(0x00);
				DispEnb=0;
 			}
 			break;
    	case 2:
    		if(Flash)						//正常显示
 			{
 				uart_operate(0x00);
 				uart_operate(0x00);
 				uart_operate(LED[clockhourshi]);
				uart_operate(LED[clockhourge]);		//显示时
				uart_operate(LED[clockminshi]);
				uart_operate(LED[clockminge]);		//显示分
				uart_operate(0x00);
				uart_operate(0x00);			
 				Flash=0;
 			}
 			else if(DispEnb)				//每0.5s年不显示
 			{
 				uart_operate(0x00);
 				uart_operate(0x00);
 				uart_operate(LED[clockhourshi]);
				uart_operate(LED[clockhourge]);		//显示时
				uart_operate(0x00);
				uart_operate(0x00);			//不显示分
				uart_operate(0x00);
				uart_operate(0x00);
				DispEnb=0;
 			}
    }
}
//===============================================================//
//语法格式:naoclockshow2(shownhour,shownmin)
//实现功能:显示闹钟调整界面
//参数    :无
//返回值  :无
//==============================================================//
void naoclockshow2(shownhour,shownmin)                          //显示闹钟调整界面
{
	int clockhourshi=0;
    int clockhourge=0;
    int clockminshi=0;
    int clockminge=0;
    clockhourshi=shownhour/10;
    clockhourge=shownhour%10;
    clockminshi=shownmin/10;
    clockminge=shownmin%10;
 	uart_operate(0x00);
 	uart_operate(0x00);
 	uart_operate(LED[clockhourshi]);
	uart_operate(LED[clockhourge]);		//显示时
	uart_operate(LED[clockminshi]);
	uart_operate(LED[clockminge]);		//显示分
	uart_operate(0x00);
	uart_operate(0x00);
}
//==============================================================//
//语法格式: void setclock()
//实现功能:设置闹钟时间
//参数    :无
//返回值  :无
//=============================================================//
void setclock()                                                //设置闹钟子函数
{ 
	int k = 0;
	keyflag4 = 1;
	while(keyflag4==1)
	{   
	    keyscan();                                             //键盘扫描
	    if(keyvalue==0)        
	    	 naoclockshow1(nhour,nmin,k);                      //无键按下显示闪烁的界面  
	    else 
	    naoclockshow2(nhour,nmin);                             //有键按下显示不闪烁的界面
	    *P_Watchdog_Clear = 0x0001;
	    switch(keyvalue)
	  	{
	  		case 0x0001:                                       	//如果键1按下则退出循环                                       
				if(k==0x0002)									
			    {
			    	keyflag4 = 0;
			      	ClearDisplay();                      // 退出循环,清屏
			    }
			    else											//或者指向下一个要调整的单元
			    {
			        k = k+2;
			    }
            	break;
			case 0x0002:                                       //键2按下则进行加调整          
	  			switch(k)
	  	    	{	
	  	    		case 0:  
	  	        		if(nhour==23)
	  	          			nhour = 0;
	  	          		else
	  	          			nhour = ++nhour;                   //闹钟小时加1
						break;
	  	        	case 2: 
						if(nmin==59)
	  	          			nmin = 0;
	  	          		else
	  	          			nmin = ++nmin;                     //闹钟分加1
						break;
	  	    	}
	  	    break;
			case 0x0004:                                       //键3按下则进行减
				switch(k)
	  	    	{	
	  	    		case 0:
						if(nhour==0)
	  	          			nhour = 23;
	  	          		else
	  	          			nhour = --nhour;                   //闹钟小时减1
					break;
					case 2: 
	  	        		if(nmin==0)
	  	          			nmin = 59;  
	  	          		else
	  	          			nmin = --nmin;                      //闹钟分减1
	  	          	break;
	  	    	}
	  	    break;  	  
		}
	}
}






//==============================================================//
//语法格式:void showsecond() 
//实现功能:显示秒表功能界面
//参数    :无
//返回值  :无
//=============================================================//
void showsecond()                                              //秒表显示界面
{
   // if(DispEnb)
   // {
    	BCD(mmsec,&mTime[4]);
    	BCD(mbsec,&mTime[2]);
    	BCD(mbmin,&mTime[0]);
       	uart_operate(mTime[0]);
		uart_operate(mTime[1]);	 //显示分
		uart_operate(0x02);
		uart_operate(mTime[2]);
		uart_operate(mTime[3]);	//显示秒
		uart_operate(0x02);
		uart_operate(mTime[4]);
		uart_operate(mTime[5]);	 //显示毫秒
	//	DispEnb=0;
    //}     
}
//==============================================================//
//语法格式  void setsecond()
//实现功能:设置秒表的功能
//参数    :无
//返回值  :无
//=============================================================//	
void setsecond()                                               //设置秒表子函数
{
	int intflag = 0;
	keyflag5 = 1;
	ClearDisplay();                                       //清屏进入秒表界面
	while(keyflag5==1)
	{
		showsecond();
		keyscan();                                            //按键扫描
		switch(keyvalue)
		{
			case 1:
				keyflag5 = 0;
			    ClearDisplay();                          //退出秒表界面,清屏。
			break;
			case 2:
				switch(intflag)
			    {
			    	case 1:	
			    		intflag = 0; 
			    		*P_INT_Ctrl=*P_INT_Ctrl_New & 0xffef;
			    	break;                                   //关闭1KHZ中断
			       	case 0:
			       		intflag = 1;
			       		*P_INT_Ctrl_New=*P_INT_Ctrl_New | 0x0010;
			        break;                                   //打开1KHZ中断
			    }
			break;
	        case 4:                                          //如果此时秒表处于暂停状态则清零                 
	        	if(intflag==0)
	            {
	            	mbmin = 0;
	                mbsec = 0;
	                mmsec = 0;
	             }
	             else
	              	*P_Watchdog_Clear = 0x0001;
			break;
		}
	}
}
//===============================================================//
//语法格式: void miaobiao() 
//实现功能:秒表运行修正
//参数    :无
//返回值  :无
//==============================================================//	
void miaobiao()                                                 //秒表运行修正子函数,由1kHZ中断实现
{
	if(mbnum==10)
	{
		mbnum = 0;
		mmsec = ++mmsec;
	}
	if(mapcounter1==300)                                       //显示SUNPLUS旋转界面
	{
		mapcounter1=0;
		mapcounter2=mapcounter2++;
		if(mapcounter2==40)
			mapcounter2=0;
	}
	if(mmsec==102)
	{
		mmsec = 0;
		mbsec = ++mbsec;
	}
	if(mbsec==60)
	{
		mbsec = 0;
		mbmin = ++mbmin;
	}
	if(mbmin==99)
	{
		mbmin = 0;
	}

}







//===============================================================//
//语法格式: void set_ring() 
//实现功能:按键选择闹钟的时间设置或者是铃声设置
//参数    :无
//返回值  :无
//==============================================================//
void set_ring()
{
	int i = 0;
	keyflag6 = 1;
	ClearDisplay();
    while(keyflag6==1)
	{
//---------------------------------------
	if(DispEnb)
	{
		uart_operate(0x00);
		uart_operate(0x00);	
		uart_operate(0x00);
		uart_operate(0x00);	
		uart_operate(0x00);
		uart_operate(LED[2]);		//2
		uart_operate(0x02);			//-
		uart_operate(LED[i+1]);		//1
		DispEnb=0;
	}
//---------------------------------------
		keyscan();
		switch(keyvalue)
		{
			case 1:
				switch(i)
			    {
			    	case 0:
                		setclock();                     		//调用闹钟时间设置界面
					break;
			      	case 1:                         			//调用铃声选择
			      		ring_choice();
					break;
			      	case 2:
			      		keyflag6=0;
			      	 	ClearDisplay();
			      	 break;
				}
			    break;
			case 2:                         					//光标下移
			    if(i==2)
			    	i = 0;
			    else
			    	i = ++i;
				break; 
			case 4:                                             //光标上移
			    if(i==0)
			    	i = 2;
			    else
			   		i = --i;
			break;
		}
			      
	}
}
//===============================================================//
//语法格式: ring_choice() 
//实现功能:铃声选择
//参数    :无
//返回值  :无
//==============================================================//
void ring_choice()
{
	int i = 0;
	keyflag7 = 1;
	ClearDisplay();
    while(keyflag7==1)
	{
		/*showringmap(); */
//--------------------------------------
		if(DispEnb)
		{
			uart_operate(0x00);
			uart_operate(0x00);	
			uart_operate(0x00);
			uart_operate(LED[2]);		//2
			uart_operate(0x02);			//-
			uart_operate(LED[2]);		//2
			uart_operate(0x02);			//-
			uart_operate(LED[i+1]);		//1或2--代表铃声1或铃声2
			DispEnb=0;
		}
//----------------------------------------
		keyscan();
		switch(keyvalue)
		{
			case 1:
			      { 
			      	keyflag7 = 0;
			      	ClearDisplay();                        //退出循环清屏
			      	if(i==0)
						ringflag = 0;                           //选中铃声1
			      	else 
			      	    ringflag = 1;                           //选中铃声2
			      }
			      break;
			case 2:
			     {
			     switch(i)                                      //切换光标的位置
			             {	
			        	 	case 0: 
								i = 1;
							break;
			            	case 1:
								i = 0;
			               	break;
			             }
			             }
			             break;
			case 4:
				if(i==0)
					PlayRespond(17);
				else
				    PlayRespond(18);	 
		  		break;
		}
	}
}
//==========================================================
//调用:void uart_operate(unsigned int uart_data)
//功能:串口模拟
//参数:要传输的数据
//==========================================================
void uart_operate(unsigned int uart_data)
{
  unsigned int i=8;
  do
   {
     serial_clk=0;   //串行时钟线置0
	 if(uart_data&0x01)
	  {
	    serial_data=1;   //当前位数据为1,数据线置1
	  }
	 else
	  {
	    serial_data=0;   //否则数据线置0
	  }
	 serial_clk=1;   //串行时钟线置1
	 uart_data=uart_data>>1;
   }
  while(--i!=0);
  serial_clk=0;   //发送完毕时钟线关闭
}


//=====================================================
//功能:BCD码转换
//参数:c要转换的数据、*p存放转换后的数据的十位
//====================================================
void BCD(unsigned int c,unsigned int *p )	//c为要转换的数据 *p为存放转换后数据的十位
{ 
		unsigned int i,j;
		j=0;
		(*p)=LED[i];
 	while(c>=10) 
 	{
 		c-=10;
    	j+=1;
 	}
 		i=c;
 		*p=LED[j];
 		*(p+1)=LED[i];
 }
 
void ClearDisplay()
{
	uart_operate(0x00);					//对所有的数码管清屏
	uart_operate(0x00);
	uart_operate(0x00);
	uart_operate(0x00);
	uart_operate(0x00);
	uart_operate(0x00);
	uart_operate(0x00);
	uart_operate(0x00);
}
//=======================================================================//
//system.c end
//=========================================================================//
			         

      

⌨️ 快捷键说明

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