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

📄 dds.c

📁 AT89S52的万年历程序源码
💻 C
字号:
#include<AT89X52.h>
//#include<lcd.h>
#include<1302.h>
#include<music_code.h>
#include<SoundPlay.h>
//#include<dds.h>
#include<lcd1.h>
uchar code time[]={'0','1','2','3','4','5','6','7','8','9'};
uchar code get_up[]="Time to Get up!";
uchar code str[]="Never frown,even when you are sad,because you never know who is falling in love with your smile! To the world you are one person,but to one person you may be the world ";
uchar code menu[5][8]={{"校时"},{"铃声"},{"电子书"},{"闹钟"},{"日历"}};  
uchar code daytab[7][3]= {"一","二","三","四","五","六","日"};   
void main()
{
	PSB=0;
    lcddelay(300);
      PSB=1;        
    RW=0; 
   lcdreset();                    //初始化LCD屏 
    //CGRAM();                        //调用自定义的CGRAM的代码      
    ceshi();                      //显示测试字样 
    lcddelay(2000);
    clrgdram();
	clrscreen();
    Disp_Img(BMP1);               //调入一幅图画 
    lcddelay(20000);
	clrscreen(); 
	init_ds1302();
	set_ds1302(time_add,initial_time);
	while(1)
	{
		read_ring();
		if(alarmsign)
		if(ring_time[0]==now_time[0]&&ring_time[1]==now_time[1]&&ring_time[2]==now_time[2])
		{
			timeup();
		}
		detect();
		write_com(0x80+0x3);		
		hzkdis(menu[key]);
		get_ds1302();
		now_week=getweek(now_time[5]/16*10+now_time[5]%16+2000,now_time[4]/16*10+now_time[4]%16,now_time[3]/16*10+now_time[3]%16);
		write_com(0x91);
        write_data(time[now_time[5]>>4]);
		write_data(time[now_time[5]&0x0f]);
		hzkdis("年"); 
		write_data(time[now_time[4]>>4]);
		write_data(time[now_time[4]&0x0f]);
		hzkdis("月"); 
		write_data(time[now_time[3]>>4]);
		write_data(time[now_time[3]&0x0f]);
		hzkdis("日");
		write_com(0x8a);
		write_data(time[now_time[2]>>4]);
		write_data(time[now_time[2]&0x0f]);
		write_data(':');
		write_data(time[now_time[1]>>4]);
		write_data(time[now_time[1]&0x0f]);
		write_data(':');
		write_data(time[now_time[0]>>4]);
		write_data(time[now_time[0]&0x0f]);
 	    write_com(0x98);
		if(alarmsign==1)
		hzkdis("AO ");
		else
		hzkdis("AC ");
        write_data(time[ring_time[2]>>4]);
		write_data(time[ring_time[2]&0x0f]);
		write_data(':');
		write_data(time[ring_time[1]>>4]);
		write_data(time[ring_time[1]&0x0f]);
		write_com(0x9d);
		hzkdis("星期"); 
        hzkdis(daytab[now_week-1]); 
		if(key==2)
		{
			book();
		}
		if(key==1)
		{
			music();

		}
		if(key==3)
		{		
			alamn();
	
		}
		if(key==0)
		{	
			time_set();
	
		}
		if(key==4)
		{
		    rili();
		}
	}
}
void detect()
{
	uchar temp;
	temp=P2;
	temp=temp&0x3f;
	if(temp!=0x3f)
	{
		switch(temp)
		{
			case 0x3e:
				while(temp!=0x3f)
			{
				temp=P2;
				temp=temp&0x3f;
			}
			key++;
			if(key==5)
			{
				key=0;
			}
			flag=1;
			clrscreen();
			break;
			case 0x3d:
				while(temp!=0x3f)
			{
				temp=P2;
				temp=temp&0x3f;
			}
            if(key==0)
			{
				key=5;
			}
			key--;
            flag=2;
			clrscreen();
			break;
			
			case 0x3b:
				while(temp!=0x3f)
			{
				temp=P2;
				temp=temp&0x3f;
			}
			flag=3;
			clrscreen();
			break;
			case 0x37:
				while(temp!=0x3f)
			{
				temp=P2;
				temp=temp&0x3f;
			}
			flag=4;
			clrscreen();
			break;
			
			case 0x2f:
				while(temp!=0x3f)
			{
				temp=P2;
				temp=temp&0x3f;
			}
			flag=5;
			clrscreen();
			break;
			case 0x1f:
				while(temp!=0x3f)
			{
				temp=P2;
				temp=temp&0x3f;
			}
			flag=6;
			clrscreen();
			break;
		}
	}

}
void page(uchar k)
{
	write_com(0x80);
	for(i=k*64;i<k*64+16&&str[i]!='\0';i++)
	{
		write_data(str[i]);
	}
	write_com(0x90);
	for(i=k*64+16;i<k*64+32&&str[i]!='\0';i++)
	{
		write_data(str[i]);
	}
    write_com(0x88);
	for(i=k*64+32;i<k*64+48&&str[i]!='\0';i++)
	{
		write_data(str[i]);
	}
	write_com(0x98);
	for(i=k*64+48;i<k*64+64&&str[i]!='\0';i++)
	{
		write_data(str[i]);
	}

}

void book()
{			
	
    	flag=0;
		detect();
		if(flag==5)
		{
			flag=0;
			page(sum);
			while(flag!=6)
			{
				detect();
				if(flag==1)
				{
					flag=0;
					if(sum<3)
					{
						sum++;
					}
				}
				if(flag==2)
				{
					flag=0;
                    if(sum>0)
					{
					sum--;
					}
				
				}
				page(sum);
			}
		sum=0;
		key=2;
		}
}

void alamn()
{
			flag=0;
			detect();
			if(flag==5)
			{
				flag=0;
				while(flag!=6)
				{					
					write_com(0x90+0x02);
					write_data(time[move[0]]);
					write_data(time[move[1]]);
					write_data(':');
					write_data(time[move[2]]);
					write_data(time[move[3]]);
                    write_com(0x8a);
                    if(alarmsign==1)
                    hzkdis("闹钟开");
                    else
                    hzkdis("闹钟关");
					detect();
					if(flag==1)
					{
						flag=0;
						move[1]=move[1]+1;
						
						if(move[1]==10)
							{
								move[1]=0;
								move[0]=move[0]+1;
							}
						
						if(move[0]==2)
						{
							if(move[1]==4)
							{
								move[1]=0;
								move[0]=0;
							}
						}
						ringgo[2]=move[0]<<4|move[1];
					}
					if(flag==2)
					{
						flag=0;
						move[3]=move[3]+1;
						if(move[3]==10)
						{
							move[3]=0;
							move[2]=move[2]+1;
							if(move[2]==6)
							{
								move[2]=0;
							}
						}
						ringgo[1]=move[2]<<4|move[3];
					}
					if(flag==3)
					{
					    flag=0;
						alarmsign=~alarmsign;
					}
					if(flag==5)
					{
						set_ds1302(alamn_add,ringgo);//只要设定时和分,秒自动为零     
						flag=6;
					}
					
				}
				key=3;
			}
}

void time_set()
{
			unsigned char setsign=0;
            flag=0;
			detect();
			if(flag==5)
			{
				flag=0;
				while(flag!=6)
				{					
					
				    write_com(0x90);
					write_data(time[set[0]/10]);
					write_data(time[set[0]%10]);
					hzkdis("年"); 
					write_data(time[set[1]/10]);
					write_data(time[set[1]%10]);
					hzkdis("月"); 
					write_data(time[set[2]/10]);
					write_data(time[set[2]%10]);
					hzkdis("日");  
				    write_com(0x88);
					write_data(time[set[3]/10]);
					write_data(time[set[3]%10]);
					write_data(':');
					write_data(time[set[4]/10]);
					write_data(time[set[4]%10]);
                    write_data(':');
					write_data(time[set[5]/10]);
					write_data(time[set[5]%10]);
					detect();
					if(flag==1)
					{
						flag=0;
						set[setsign]=set[setsign]+1;
					}
					else if(flag==2)
					{
						flag=0;
						if(set[setsign]>0)
                        set[setsign]=set[setsign]-1;
					}
                    else if(flag==3)
                    {
                         flag=0;
                         setsign++;
                         if(setsign==6)
                         setsign=0;
                    }
                    else if(flag==4)
                    {
                         flag=0;
                         set[setsign]+=10;
                    }
                    else if(flag==5)
				    {
				    	for(setsign=0;setsign<6;setsign++)
					    	timego[5-setsign]=set[setsign]/10*16+set[setsign]%10;
					    set_ds1302(time_add,timego);
                        write_data_ds1302(0x8e,0x00);
                        write_data_ds1302(0x86,timego[3]);
                        write_data_ds1302(0x88,timego[4]);
                        write_data_ds1302(0x8c,timego[5]);
                        write_data_ds1302(0x8e,0x80);  
				    	flag=6;
			    	}
                    if(setsign==0)
                    {
                        if(set[setsign]>=100)
                        set[setsign]=0;
                    }
                    else if(setsign==1)
                    {
                        if(set[setsign]>12||set[setsign]<1)
                        set[setsign]=1;
                    }
                    else if(setsign==2)
                    {
                         if(set[0]%400==0||(set[0]%4==0&&set[0]%100!=0))
                         monthtab[1]=29;
                         if(set[setsign]>=monthtab[set[1]-1]||set[setsign]<1)
                         set[setsign]=1;
                    }
					else if(setsign==3)
					{
					    if(set[setsign]>=24)
						set[setsign]=0;
					}
                    else
                    {
                         if(set[setsign]>=60)
                         set[setsign]=0;
                    }
					
				}
				key=0;	
			}
}

void timeup()
{	
	clrscreen();
	write_com(0x90);
	hzkdis(get_up);
	InitialSound();
	switch(ring_song)
	{
		case 0:Play(tale,0,3,300);break;
		case 1:Play(Love,0,3,340);break;
	}
	clrscreen();
}

void music()
{
    flag=0;
    detect();
	if(flag==5)
	{
		flag=0;
        clrscreen();								
		while(flag!=6)
		{
			detect();
			if(key==2)
			key=0;
			if(key==5)
			key=0;
			write_com(0x90);
            hzkdis(song[key]);
			//for(i=0;song[key][i]!='\0';i++)
			//{						
			//	write_date(song[key][i]);
	    	//	}
			if(flag==5)
			{
				InitialSound();
				switch(key)
				{
	        		case 0:Play(tale,0,3,300);break;
					case 1:Play(Love,0,3,340);break;
				}
				ring_song=key;
				while(!esc);
			}                             
		}
        clrscreen();
		//write_order(0x01);
		key=1;	
	}
}

//星期 
//(百年%4*5天+年+年/4+月星期表+日+2天)%7        
unsigned char getweek(unsigned year,unsigned char month,unsigned char day)
{
    unsigned week;
    unsigned char moontab1[]={3,6,0,3,5,1,3,6,2,4,0,2},moontab2[]={4,0,0,3,5,1,3,6,2,4,0,2};
    if((0==year%400)||(0==year%4&&0!=year%100))
    week=((year/100)%4*5+year%100+(year%100)/4+moontab1[month-1]+day+2)%7;
    else
    week=((year/100)%4*5+year%100+(year%100)/4+moontab2[month-1]+day+2)%7;
    return week;
}
void pagerili(unsigned char k)
{
    unsigned char fline=(k-1)*21+7-rili_week+1;
    unsigned char j;
    unsigned char line[]={0x91,0x89,0x99};
    if(k==0)
    {
        write_com(0x90);
        write_data(time[rili_set[0]/10]);
        write_data(time[rili_set[0]%10]);
        write_data(time[rili_set[1]/10]);
        write_data(time[rili_set[1]%10]);
        hzkdis("年"); 
        write_data(time[rili_set[2]/10]);
        write_data(time[rili_set[2]%10]);
        hzkdis("月");
        return; 
    }   
    write_com(0x80);
    hzkdis("周一二三四五六日");    
    for(j=0;j<3;j++)
    {
        write_com(line[j]);
       /* if(j==0&&k==1)
        {
	        for(i=1;i<=8-rili_week;i++)
    	    {
		        write_com(0x90+rili_week);
	            write_data(' ');
                write_data(time[i]);
			}
			continue;
	    }*/
        for(i=1;i<=7&&(fline+j*7+i-7)<=rili_monthday;i++)
        {
            if((fline+i+j*7)<17)
            write_data(' ');
            else
            write_data(time[(fline+i+j*7-7)/10]);
            if((fline+i+j*7)<8)
            write_data(' ');
			else
            write_data(time[(fline+i+j*7-7)%10]);
        }
		
    }
}

void rilidis()
{
    rili_year=rili_set[0]*100+rili_set[1];
    rili_month=rili_set[2];
    rili_week=getweek(rili_year,rili_month,1);
    if(rili_month==4||rili_month==6||rili_month==9||rili_month==11)
	rili_monthday=30;
    else if(rili_month==2)
    {
        if(rili_year%400==0||(rili_year%4==0&&rili_year%100!=0))
	rili_monthday=29;
	else
	rili_monthday=28;
    }
    else rili_monthday=31;
    pagerili(0);
    flag=0;
    while(flag!=6)
    {
	detect();
        if(flag==1)
        {
            flag=0;
            if(sum<3)
            sum++;
        }
        if(flag==2)
        {
            flag=0;
            if(sum>0)
            sum--;
        } 
		pagerili(sum);   
    }
}

void rili() 
{
    unsigned char rili_setsign=0;
    flag=0;
    detect();
    if(flag==5)
    {
	flag=0;
	while(flag!=6)
	{					
	    write_com(0x80);
	    write_data(time[rili_set[0]/10]);
	    write_data(time[rili_set[0]%10]);
        write_data(time[rili_set[1]/10]);
	    write_data(time[rili_set[1]%10]);
	    hzkdis("年"); 
	    write_data(time[rili_set[2]/10]);
	    write_data(time[rili_set[2]%10]);
	    hzkdis("月"); 
	    detect();
	    if(flag==1)
	    {
		    flag=0;
		    rili_set[rili_setsign]+=1;
	    }
	    else if(flag==2)
	    {
	    	flag=0;
	    	if(rili_set[rili_setsign]>0)
                rili_set[rili_setsign]-=1;
	    }
        else if(flag==3)
        {
            flag=0;
            rili_setsign++;
            if(rili_setsign==3)
            rili_setsign=0;
        }
        else if(flag==4)
        {
            flag=0;
            rili_set[rili_setsign]+=10;
        }
        else if(flag==5)
	    {
	    	rilidis();
            flag=6;
	    }
        if(rili_setsign==0||rili_setsign==1)
        {
            if(rili_set[rili_setsign]>=100)
            rili_set[rili_setsign]=0;
        }
        else if(rili_setsign==2)
        {
            if(rili_set[rili_setsign]>12||rili_set[rili_setsign]<1)
            rili_set[rili_setsign]=1;
        }				
	}
	rili_set[0]=rili_set[1]=0;
	rili_set[2]=1;
	sum=0;
	key=4;
	clrscreen();
    }
}


⌨️ 快捷键说明

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