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

📄 main.c

📁 C语言单片机编程的代码及教程文献
💻 C
📖 第 1 页 / 共 2 页
字号:

#include"include.h"

 //函数声明
 void Up_date();
 void Up_disp();
 void To_almarray();
 extern void Song_delay();
 void Play();

 //定义新旧日期/时间变量
 struct date new_date,old_date;
 struct time new_time,old_time,alm_time;

  //定义软件延时计数变量
   uchar secount=0;

  //定义闹钟开关变量
  bit on=0;
  bit K1=1;

  //定义扬声器引脚
  sbit speaker=P1^0; 
code uchar menu3[16]="--Made by Zheng@";
code uchar menu4[16]="Kunlong &Lorise@";
 code uchar dispweek[7][4]={"Mon@","Tus@","Wes@","Thu@","Fir@","Sat@","Sun@"};
 code uchar menu1[16]="1.Time 2.Alarm @";
 code uchar menu2[16]="3.manufacturer@";
 code uchar alarm_menu[]="Alarm time@";
 code uchar onoff[2][4]={"OFF@","ON @"};

 //定义时间、日期显示数组
 struct disptime disp_time,disp_almtime;
 struct dispdate disp_date;

//--------------------------------------------------------------------------
/******************定义音乐表***************************************/
uint code musictab[]={64103,64260,64400,64524,
64580,64684,64777,64820,64898,64968,65030,
65058,65110,65157,65178,65217,65252,65282};

/***************************音乐谱***************************************/
uchar code songtab[]={0x92,0xa2,0xc6,0xa2,0xc4,0xa2,0x92,0xa2,0xa2,0xa2,
0x92,0xa4,0x92,0xa2,0xc6,0xa2,0xc4,0xa2,0x92,0xa2,
0x92,0x92,0x72,0x64,0x62,0x72,0x56,0x32,0x54,0x22,
0xa2,0xa2,0x92,0x92,0x72,0x74,0x62,0x72,0x56,0x32,
0x72,0x92,0x92,0x72,0x9c,0x92,0xa2,0xc6,0xa2,0xc4,
0xa2,0x92,0xa2,0xa2,0xa2,0x92,0xa4,0x92,0xa2,0xc6,
0xa2,0xc4,0xa2,0x92,0xa2,0x92,0x92,0x72,0x64,0x62,
0x72,0x56,0x32,0x54,0x22,0xa2,0xa2,0x92,0x92,0x72,
0x74,0x62,0x72,0x66,0xa2,0x92,0x72,0x72,0x62,0x52,
0x56,0x02,0x92,0x92,0xa2,0xd2,0xc2,0xc2,0xa2,0xc4,
0xa2,0x92,0x22,0xa2,0xa2,0x92,0xa4,0x92,0xa2,0xd2,
0xc2,0xc2,0xa2,0xc4,0xa2,0x92,0xa2,0x92,0x72,0x72,
0x64,0x62,0x72,0x56,0x32,0x62,0xa2,0xa2,0x92,0x92,
0x72,0x74,0x62,0x72,0x66,0x52,0x64,0xa2,0x92,0x94,
0x04,0x72,0x62,0x62,0x74,0x5e,0x04,0x04,0x04,0x04,
0x74,0x74,0x74,0x72,0x32,0x3e,0x74,0x74,0x74,0x72,
0x92,0x3e,0x66,0x72,0x64,0x74,0x96,0x72,0x68,0x64,
0x62,0x72,0x94,0xa4,0x9e,0x00};
/******************定义音乐相关变量***************************************/
uchar time1,time2,tvar,play_point=0;
uchar hcount,lcount;


/***************计时中断程序*******************/
void time() interrupt 1
 {
    TH0=0x3c;
    TL0=0xd3;
    secount++;
    if(secount==20)
      {
	     secount=0;
         new_time.second++;
         if(new_time.second>=60)
	       {
		      new_time.second=0;
	          new_time.minute++;
	          if(new_time.minute>=60)
	            {
				   new_time.minute=0;
		           new_time.hour++;
		           if(new_time.hour>=24)
		            {
					   new_time.hour=0;
					   Up_date();
					}
		        }
	        }
       }
  	if(on&&Get_keynum()==15)
	   K1=0;
 }



/******************音乐中断程序****************************/
void time_int() interrupt 3
 {
   speaker=~speaker;
   TH1=hcount;
   TL1=lcount;
 }



//初始化函数
void Init()
 {
   //初始化时间变量
   new_time.second=old_time.second=0;
   new_time.minute=old_time.minute=0;
   new_time.hour=old_time.hour=0;

   //初始化闹钟时间变量
   alm_time.second=30;
   alm_time.minute=50;
   alm_time.hour=7;

   //初始化日期变量
   new_date.year=old_date.year=2007;
   new_date.month=old_date.month=5;
   new_date.day=old_date.day=10;
   new_date.week=old_date.week=3;

   //初始化时间显示数组
   disp_time.hour[2]='@';
   disp_time.minute[2]='@';
   disp_time.second[2]='@';

   //初始化闹钟时间显示数组
   disp_almtime.hour[2]='@';
   disp_almtime.minute[2]='@';
   disp_almtime.second[2]='@';

   //初始化日期显示数组
   disp_date.year[4]='@';
   disp_date.month[2]='@';
   disp_date.day[2]='@';

   To_almarray();
   Init_LCD();

   TMOD=0x11;
   TH0=0x3c;
   TL0=0xd3;
   IE=0x8a;
   speaker=1;
   TR0=1;


 }

void Disp_menu1()
{
   Dis_string(1,1,menu3);
   Dis_string(2,1,menu4); 
}


void Disp_menu()
{
   Dis_string(1,1,menu1);
   Dis_string(2,1,menu2); 
}
void Dis_date(struct dispdate date1)
 {
   Dis_string(1,2,date1.year);
   Dis_string(1,6,"/@");
   Dis_string(1,7,date1.month);
   Dis_string(1,9,"/@");
   Dis_string(1,10,date1.day);
 }


void Dis_time(struct disptime time1)
 {
   Dis_string(2,3,time1.hour);
   Dis_string(2,5,":@");
   Dis_string(2,6,time1.minute);
   Dis_string(2,8,":@");
   Dis_string(2,9,time1.second);
 }


//显示所有数据
void Disp_all()
 {
   Dis_date(disp_date);
   Dis_string(1,14,dispweek[new_date.week-1]);
   Dis_time(disp_time);
 }


void To_almvalue()
 {
   alm_time.hour=(disp_almtime.hour[0]-'0')*10+(disp_almtime.hour[1]-'0');
   alm_time.minute=(disp_almtime.minute[0]-'0')*10+(disp_almtime.minute[1]-'0');
   alm_time.second=(disp_almtime.second[0]-'0')*10+(disp_almtime.second[1]-'0');   
 }



//把显示数组的值转换为十进制数值
void To_value()
 {
   new_date.year=(disp_date.year[0]-'0')*1000+(disp_date.year[1]-'0')*100
                      +(disp_date.year[2]-'0')*10+(disp_date.year[3]-'0');
   new_date.month=(disp_date.month[0]-'0')*10+(disp_date.month[1]-'0');
   new_date.day=(disp_date.day[0]-'0')*10+(disp_date.day[1]-'0');

   new_time.hour=(disp_time.hour[0]-'0')*10+(disp_time.hour[1]-'0');
   new_time.minute=(disp_time.minute[0]-'0')*10+(disp_time.minute[1]-'0');
   new_time.second=(disp_time.second[0]-'0')*10+(disp_time.second[1]-'0');
 }



void To_almarray()
 {
	disp_almtime.hour[0]=alm_time.hour/10+'0';
	disp_almtime.hour[1]=alm_time.hour%10+'0';
	disp_almtime.minute[0]=alm_time.minute/10+'0';
	disp_almtime.minute[1]=alm_time.minute%10+'0';
	disp_almtime.second[0]=alm_time.second/10+'0';
	disp_almtime.second[1]=alm_time.second%10+'0';   
 }

//
void To_array()
 {
    disp_date.year[0]=old_date.year/1000+'0';
	disp_date.year[1]=(old_date.year/100)%10+'0';
	disp_date.year[2]=(old_date.year/10)%10+'0';
	disp_date.year[3]=old_date.year%10+'0';
	disp_date.month[0]=old_date.month/10+'0';
	disp_date.month[1]=old_date.month%10+'0';
	disp_date.day[0]=old_date.day/10+'0';
	disp_date.day[1]=old_date.day%10+'0';

	disp_time.hour[0]=old_time.hour/10+'0';
	disp_time.hour[1]=old_time.hour%10+'0';
	disp_time.minute[0]=old_time.minute/10+'0';
	disp_time.minute[1]=old_time.minute%10+'0';
	disp_time.second[0]=old_time.second/10+'0';
	disp_time.second[1]=old_time.second%10+'0';
 }


/***********************日期更新函数************************/
void Up_date()
 {
    new_date.week++;
    if(new_date.week==8) 
	   new_date.week=1;
    new_date.day++;
    if(new_date.day>=29)
      {
	     switch(new_date.month)
           {
		     case 2:
	           {
			      if(new_date.year%4==0&&new_date.year%100!=0||new_date.year%400==0)
				    { 
	                 if(new_date.day==30) 
		               {
					      new_date.day=0;
		                  new_date.month++;
		               }
		           else 
				      {
					     new_date.day=0;
						 new_date.month++;
					  }
					 }
		         break;
	           }
	          case 1:case 3:case 5:case 7:case 8:case 10:case 12:
	             {
				   if(new_date.day==32)
		             {
					    new_date.day=0;
						new_date.month++;
					 }
		           break;
		         }
	         case 4:case 6:case 9:case 11:
	           {
			     if(new_date.day==31)
		           {
				      new_date.day=0;
					  new_date.month++;
				   }
		         break;
		       }
	       }
	    if(new_date.month==13) 
	      {
	         new_date.month=0;
		     new_date.year++;
	      }
	    if(new_date.year==6000) 
	       new_date.year=0;
      }
  }



void Up_alarm()
 {
   uchar keynum=0xff,pos=0;
   Wrcom(0x01);                  //清屏
   Dis_string(1,3,alarm_menu);       //闹钟提示菜单
   Dis_time(disp_almtime);
   Dis_string(2,12,onoff[on]);

   Dis_cursor(2,3);          //光标闪烁
   keynum=Get_keynum();      //获取键值 
   while(keynum!=12)
     {
	    if(keynum==11)
		  {
		    if(pos<9)
			  {
			    if(pos==1||pos==4||pos==7)
				   pos+=2;
				else 
			      pos++;
			  }
		  else 
			pos=0;
		  Dis_cursor(2,3+pos);

		  }
		else if(keynum==10)
		  {
			  
			if(pos>0) 
			  {
			    if(pos==9||pos==6||pos==3)
				   pos-=2;
				else 
				   pos--;
			  }	
			else
			  pos=0;
		  }
		else if(keynum<=9)
		  {
		    switch(pos)
			  {
			     case 0:
			       {
				     if(keynum>2)
				        break;
				     disp_almtime.hour[0]=keynum+'0';
				     Disdata(keynum+'0');
				     pos++;
				     break;
				   }
				  case 1:
			       {
				      if(keynum>3&&disp_almtime.hour[0]==2+'0')
				          break;
				      disp_almtime.hour[1]=keynum+'0'; 
				      Disdata(keynum+'0');
				      pos+=2;
				      break;
				    }
			      case 3:
			        {
				       if(keynum>5)
				          break;
				       disp_almtime.minute[0]=keynum+'0';
				       Disdata(keynum+'0');
				       pos++;
				       break;
				    }
			      case 4:
			        {
				       disp_almtime.minute[1]=keynum+'0';
				       Disdata(keynum+'0');
				       pos+=2;
				       break;				  
				     }
			      case 6:
			        {
				       if(keynum>5)
				          break;
				       disp_almtime.second[0]=keynum+'0';
				       Disdata(keynum+'0');
				       pos++;
				       break;
				    }
			      case 7:
			        {
				       disp_almtime.second[1]=keynum+'0';
				       Disdata(keynum+'0');
				       pos+=2;
				       break;				  
				     }
			      case 9:
			        {
					   on=~on;
				       Dis_string(2,12,onoff[on]);
				       break;				  
				     }
								   
			   }
		  }
		else 
		  Dis_cursor(2,3+pos);
	    keynum=Get_keynum();      //获取键值
	 }
   Wrcom(0x01);        //清屏
   Wrcom(0x0c);        //开显示,关光标及闪烁
   To_almvalue();
 }


/*********************修改变量和显示函数************************/
void Up_value()
 { 
   uchar keynum=0xff,pos=0;

   Wrcom(0x01);                  //清屏
   Disp_all();
   Dis_cursor(1,2);          //光标闪烁
   keynum=Get_keynum();      //获取键值
   while(keynum!=12)
   {      
      if(keynum==11)
        {
	      if(pos<14)
	        {
			  if(pos==3||pos==6||pos==9)
			     pos+=2;
			  else if(pos==12||pos==13||pos==14)
			     pos=15;
			  else 
		        pos++;
	          Dis_cursor(1,2+pos);
		    }
	      else if(pos<22)
	        {
			   if(pos==16||pos==19)
			      pos+=2;
			   else
	             pos++;
			   Dis_cursor(2,pos-12);
		    }
          else 
	        {
	           pos=0;
		   	   Dis_cursor(1,2);
            }
	    }
      else if(keynum==10)
	    {
		   if(pos<=0)
		     {
		       pos=0;
			   Dis_cursor(1,2);
			 }
		   else if(pos<16)
		     {

⌨️ 快捷键说明

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