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

📄 main.c

📁 一个用1602显示的多功能电子钟,内有实时时钟功能和温度显示功能!
💻 C
字号:
#include <reg52.h>
#include"ds18b20.h"
#include"DS1302.h"
#include"TG12864P.h"
#include"beep.h"
#include"key.h"
#include"led.h"
#include"keyboard.h"
#include"delay.h"		 
unsigned char(* bmp[4])[256]={  &bmp0,&bmp1,&bmp2,&bmp3}; //图片指针  
 /******************************************************************
                               操作系统主框架
																			  
系统全局变量声明区:
                    menu       系统菜单指针
					fun        系统功能函数指针
*************************************************************************/
unsigned char menu=0;
unsigned char fun1=0,fun2=0,
clock_flag=0;							 //闹钟开关的标志位
 unsigned char test=0;                   //tsst
unsigned char * print[]={0,0,0,0,0,0,0}	 ;

extern unsigned char hour_sound,		 //闹钟 时
                     minute_sound,		 //闹钟 秒
                     zhengshu;

 /******************************************************************
                  系统初始话函数 
				  包括全部模块的初始化函数
 *******************************************************************/
 void init_system()
 {
   Reset_18B20();
   LcmInit();
   init_1302();
   init_keyboard();
   init_1302();
   Time0_Init();
 }
/******************************************************************
                      接着是主函数与各个模块的联动函数
*******************************************************************/




/*****************************************************************
                      12864与键盘联动函数
					  在12864上显示键盘输入的字符
					  按下esc 或者win 建就
					  要求操作者选择是否保存输入的
					  文本。
                      然后
					  返回主界面

*****************************************************************/
void screen()
{
	uchar t=0,
		temp=0,
		pos=0,	 //记录输入光标位置	,输入一个字母或数字,光标加一
		cap=0,																		    
		flag=0;
	PutStr(0,2,"请选择");//按下推出建: esc 或win 后
	PutStr(1,0,"1 输入文本");
	PutStr(2,0,"2 打开文本");
	while(1)
	{
		led_display(test);	
		temp=sp2key_scan();
		if(temp!=255)
		{  
			test=temp;    
			LcmClearTXT();
			t=temp;
			temp=key_table[t];
			if(temp=='1')flag=1;
			if(temp=='2')flag=2;
			led_display(t); //数码管显示
			if(!flag)
			{		 
				PutStr(1,1,"输入错误!");
				delayms(700);
				LcmClearTXT();
				PutStr(0,2,"请选择");//按下推出建: esc 或win 后
				PutStr(1,0,"1 输入文本");
				PutStr(2,0,"2 打开文本");
			}
			if(flag)
			{
				if(flag==1) break;						
				else
				{	       //读取24c256中的文本
					while(1)
					{
						temp=sp2key_scan();
						if(temp!=255)	//按下任意建推出
						{
							break;
							flag=3;
						}
						if(flag==3)break;	 
					}   
				}  
			}
		}  
	} 
	LcmClearTXT();
	while(1)
	{	    
		temp=sp2key_scan();
		if(temp!=255)
		{
			t=temp;
			if(t<48) //输入为字母或其他符号	                                         
			{  	
				if(pos==64)
				{ 
					pos=0;
					LcmClearTXT();  
				} 
				if(t==47)	//删除
				{
					if(pos)
					{						
						Lcm_clear_char(pos);
						if((pos%2))pos-=1;
						if(pos)pos--;
					}   
				} 
				else														
				{   	
					temp=key_table[t];
					if(t>9&&t<36)temp-=cap*32;//根据cap 令显示为大写或小写	 
					input(temp,pos);
					pos++;								 
				}  
			}
			if(t==48)//换行
			{																  
				if(pos<48)
				{
					pos+=16;
					Location_xy_12864(pos/16,(pos%16)/2);
				}
				else
				{
					LcmClearTXT();
					pos=0;
				}  
			}
			if(t==49)cap=!cap;//cap:大小写转换
			if(t==51||t==52) //按下推出建: esc 或win 后
			break;
		}			 
		led_display(t);    
	} 
	LcmClearTXT();
	PutStr(0,2,"save ?");	
	PutStr(1,0,"y save");    
	PutStr(2,0,"n no"); 	 
	while(1)
	{
		temp=sp2key_scan();
		if(temp!=255)
		{
			LcmClearTXT();
			t=temp;
			temp=key_table[t];
			if(temp=='y'||temp=='Y')
			{
				LcmClearTXT();
				PutStr(1,2,"saving....");
				delayms(500); 
				PutStr(2,2,"please wait..");
				//write_24c256(unsigned char *Data,unsigned char length,unsigned int add)
				delayms(1000);
				LcmClearTXT();
				return;
			}
			if(temp=='n'||temp=='N')return;		 
			led_display(t); 			//数码管显示
			LcmClearTXT();
			PutStr(1,1,"输入错误!");
			delayms(800);
			LcmClearTXT();
			PutStr(0,0,"save");		//按下推出建: esc 或win 后
			PutStr(1,0,"y save");    
			PutStr(2,0,"n no"); 
		}	 
	}   
}  

/**************************************************************************
              系统菜单选择函数
***************************************************************************/
void menu_select()
{
  unsigned char key=0,temp1=0,temp2=0; 
  temp1=getch();
  temp2=sp2key_scan();
  if(temp1!=255)  
  {
     switch (temp1)		        //清除选中状态
	 {
	  case 12: PutBMP2(menu*4+1,0,5, 32,bmp[menu],1);menu++;break;
	  case 13: fun1=menu+1;break;                              //进入功能函数
	  case 14:PutBMP2(menu*4+1,0,5, 32,bmp[menu],1);menu--;break;
	  case 15:PutBMP2(menu*4+1,0,5, 32,bmp[menu],1);menu+=2;break; 
	 }
	 menu=menu%4;
	 PutBMP2(menu*4+1,0,5, 32,bmp[menu],0);	//将选中的功能函数反白
  	 beeping(12,20);
  }
  if(temp2!=255)
  {	    
         switch(temp2)
         {
          case 8:                            
          case 2:PutBMP2(menu*4+1,0,5, 32,bmp[menu],1);menu+=2;break;  
          case 6:PutBMP2(menu*4+1,0,5, 32,bmp[menu],1);menu++;break;  
          case 4:PutBMP2(menu*4+1,0,5, 32,bmp[menu],1);menu--;break;                               
          case 48: fun1=menu+1;break;                    
         }	  
		 menu=menu%4;
		 PutBMP2(menu*4+1,0,5, 32,bmp[menu],0);//将选中的功能函数反白 
	  	 test=temp2;
	  	 beeping(12,20);
  }	 
  led_display(test); 
}
 /*****************************************************************
                    从键盘中获取二位数      
 ******************************************************************/
unsigned char get_num()
{          
	unsigned char q=0,temp=0,key2=0;  
	Location_xy_12864(2,2);
	while(1)
	{
		key2=sp2key_scan(); 
		if(key2<10)
		{
			q++;
			if(q==1)temp+=key2*10;
			if(q==2)temp+=key2; 
			input(key_table[key2],q);
			beeping(12,20);
			delayms(100);
			if(q==2)break;
		}	 
	}
	return temp;
}
 /*************************************************************
                   时钟服务函数 
				   包括:修改时间
				          定闹钟
						  开闹钟
						  关闹钟
 *************************************************************/
void clockser()
{
	unsigned  char key2=255,i=0,q=0,print[7];
	LcmClearTXT();
	PutStr(0,2,"service:");
	PutStr(1,0,"1.adjust timer");
	PutStr(2,0,"2.set ring");	   
	while(1)
	{
		
		key2=sp2key_scan();
		if(key2!=255)
		{
			
			if(key_table[key2]=='1')
			{	
				LcmClearTXT(); 
				PutStr(0,0,"hour");
				do
					{  
						print[2]=get_num();
					}while(print[2]>24);
				LcmClearBMP();
				LcmClearTXT();	   
				PutStr(0,0,"min");
				do
					{  
						print[1]=get_num();
					}while(print[1]>60);
				LcmClearBMP();
				LcmClearTXT();  
				PutStr(0,0,"month");
				do
					{ 
						print[4]=get_num();
					}while(print[4]>12);
				LcmClearBMP();
				LcmClearTXT(); 
				PutStr(0,0,"day");
				do
					{  
						print[3]=get_num();
					}while(print[3]>24);
				LcmClearBMP();
				LcmClearTXT(); 
				PutStr(0,0,"year");
				do
					{  
						print[6]=get_num();
					}while(print[7]>99);
				LcmClearBMP();
				LcmClearTXT(); 
				v_BurstW1302T(print);
				LcmClearBMP();
				return; 
			}
			if(key2==2)
			{
				LcmClearTXT();
				PutStr(0,0,"1.adjust ring");
				PutStr(1,0,"2.open ring");
				PutStr(2,0,"3.close ring");
				while(1)
				{
					key2=sp2key_scan();
					if(key2!=255)
					{
						if(key_table[key2]=='1')
						{
							LcmClearTXT();
							PutStr(0,0,"hour:");
							do
								{   
									print[2]=get_num();
								}while(print[2]>24);
							LcmClearTXT(); 
							PutStr(0,0,"min:");
							do
								{	 
									print[1]=get_num();
								}while(print[1]>60);
							hour_sound=print[2];
							minute_sound=print[1];
							clock_flag=1;
							LcmClearTXT();
							LcmClearBMP();
							return;
						}
						if(key_table[key2]=='2')
						{
							clock_flag=1;
							LcmClearTXT();
							PutStr(1,0,"ring opened");
							delayms(1600);
							LcmClearBMP();
							LcmClearTXT();
							return;
						}
						if(key_table[key2]=='3')
						{
							clock_flag=0;
							LcmClearTXT();
							PutStr(1,0,"ring closed");
							delayms(1500);
							LcmClearBMP();
							LcmClearTXT();
							return;
						}  
					}
				}
			}
		}   
	}	 
}
 /**************************************************************
                    ring  闹钟检测
 *****************************************************************/
void ring()
{
	if(clock_flag)
	{
		if(reach_time())
		{
			 Play_Song();
			 clock_flag=0;
		} 
	} 
}
  /********************************************************************
                     温度报警函数
  **********************************************************************/
void warning()
{  	
	Read_18B20() ;
	if(zhengshu>temp_h||zhengshu<temp_l)
	{  
		while(1)
		{
			beep=!beep;
			delayms(500);
			if(getch()!=255)break; 
		}
		play_respond();
	}	  
}
  /**********************************************************
                  温度服务函数
				  查看温度
				  设置温度上限
				  设置温度下限
				  激活温度报警功能
  *********************************************************/
  void temp_serve()
  {
     unsigned char key2=255;
     LcmClearTXT();
	 PutStr(0,2,"service:");
	 PutStr(1,0,"1.open warner");
	 PutStr(2,0,"2.close warner");
	 PutStr(3,0,"3.set temperate");
	 while(1)
	 {
	  
	   key2=sp2key_scan();
	   	if(key2!=255)
	    {
		   if(key2==1)
		   {		LcmClearTXT();
		   	        PutStr(1,0,"warner opened");
					delayms(1600);
					LcmClearTXT();
					return;
		   
		   }
		   if(key2==2)
		   {
		   	        PutStr(1,0,"warner closed");
					delayms(1600);
					LcmClearTXT();
					return;
		   }
		   if(key2==3)
           {
		         LcmClearTXT(); 
			     PutStr(0,0,"the highesst");
				 temp_h=get_num();
				 LcmClearTXT();
				 PutStr(0,0,"the highesst:");
				 put_num(2,3,temp_h);
				 delayms(1500);
				 LcmClearTXT();
					
					
				 PutStr(0,0,"the lowest");
				 temp_h=get_num();
				 LcmClearTXT();
				 PutStr(0,0,"the lowest");
				 put_num(2,3,temp_l);
				 delayms(1500);
				 LcmClearTXT();	 
		   	     return;    
		   } 
	     }
	 }		    
  }
void main()
{
	unsigned char i=0,
					key1=255,
					key2=255,
					temp[2]={1,2};	   

	unsigned int dela=0;
	init_system();
	delayms(100);
	PutStr(1,2,"loading..."); 	
	delayms(10000);		 
	LcmClearTXT();  
	for(i=0;i<4;i++)PutBMP2(1+i*4,0,5, 32,bmp[i],1);
	while(1)
	{   	
		menu_select();
		ring();		  //闹钟
		warning();		 //温度报警
		if(!fun2)			  
		{	  
			LcmClearBMP();
			LcmClearTXT();
			for(i=0;i<4;i++)PutBMP2(1+i*4,0,5, 32,bmp[i],1);	             
			fun2=255;   
		}  
		switch(fun1)
		{
			case 1:	LcmClearBMP(); fun2=fun1;fun1=0;break;
			case 2:	
			{
				LcmClearBMP();
				v_BurstR1302T(print);
				showtime(print);
				dela=0;
				fun2=fun1;
				fun1=0;
				break;
			}
			case 3:	
				LcmClearBMP();
				PutBMP2(1+2*4,0,5, 32,bmp[2],1);
				PutStr(1,2,"playing");
				fun2=3;
				fun1=0;
				break;
			case 4:  
				LcmClearBMP();
				fun2=4;fun1=0;
				put_num(1,1,zhengshu);
				PutStr	(1,4,"C");
				break;  
		}  
		switch(fun2)
		{
			case 1:				//文本输入 功能
			{
				key1=getch();
				key2=sp2key_scan();
				screen();
				fun2=0;
				break;
			}
			case 2:	 
				key1=getch();
				key2=sp2key_scan();	
				dela++;
				if(dela>20)
				{
					v_BurstR1302T(print);
					showtime(print);
					dela=0;	  
				}
				ring();		 
				if(key2!=255)
				{
					if(key2==48)
					{
						clockser();
						LcmClearBMP(); 
					}	 
					if(key2==51||key2==52)
					fun2=0; 
				}
				break;
			case 3:	
			{   
				Play_Song();
				fun2=0;
				break;
			}
			case 4: 
				dela++;
				if(dela>40)
				{ 
					Read_18B20();	 
					put_num(1,1,zhengshu);
					PutStr	(1,4,"C");
					dela=0;
				}
				key2=sp2key_scan();
				if(key2!=255)
				{
					if(key2==48)temp_serve();
					if(key2==51||key2==52)
					fun2=0;	 
				}
				break;			
		}	
	}
}

⌨️ 快捷键说明

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