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

📄 ds12c887.c

📁 DS12C887适时时钟
💻 C
字号:
#include<reg52.h>
#include"define.h"

extern void  delay(uint z);
//extern void write_com(uchar com);
//extern void write_date(uchar date);
extern void tempchange();
extern uint get_temp();
/*void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}*/
//写指令
void write_com(uchar com)
{
	rs=0;
	lcden=0;
	P0=com;
	delay(3);
	lcden=1;//高脉冲
	delay(3);
	lcden=0;	
}
//写数据
void write_date(uchar date)
{
	rs=1;
	lcden=0;
	P0=date;
	delay(3);
	lcden=1;
	delay(3);
	lcden=0;	
}
void di()
{
	beep=0;
	delay(100);
	beep=1;
}
void init()
{
	uchar num;
	EA=1;
	EX1=1;
	IT1=1;
	flag1=0;
//flag=0;
	s1num=0;
	week=1;
	dula=0;
	wela=0;
	lcden=0;
	rd=0;
//	write_ds(0x0A,0x20);
//	write_ds(0x0B,0x26);
//	read_ds(0x0c);
//	set_time();
	set_alarm(15,12,8);
	write_com(0x38);
	write_com(0x0c);//开显示,光标不显示,光标不闪烁
	write_com(0x06);
	write_com(0x01);
	write_com(0x80);
	for(num=0;num<15;num++)
		{
			write_date(table[num]);
			delay(1);
		}
	write_com(0x80+0x40);
	for(num=0;num<15;num++)
		{
			write_date(table1[num]);
			delay(1);
		}
}
//温度显示子函数
void wendu(uchar temp)
{
	uchar bai,shi,ge;
	bai=temp/100;
	shi=temp%100/10;
	ge=temp%10;
	write_com(0x80+0x40+11);
	write_date(0x30+bai);
	write_date(0x30+shi);
	write_date(0x2e);
	write_date(0x30+ge);
	write_date(0x63);
}
//时分秒刷新子函数
void write_sfm(uchar add,uchar date)
{
	uchar shi,ge;
	shi=date/10;
	ge=date%10;
	write_com(0x80+0x40+add);
	write_date(0x30+shi);
	write_date(0x30+ge);	
}
//年月日刷新子函数
void write_nyr(uchar add,uchar date)
{
	uchar shi,ge;
	shi=date/10;
	ge=date%10;
	write_com(0x80+add);
	write_date(0x30+shi);
	write_date(0x30+ge);
}
void write_week(uchar add,uchar date)
{
	switch(date)
		{
			case 1:
				{	
					write_com(0x80+add);
					write_date(0x4d);
					//delay(5);
					write_date(0x4f);
				//	delay(5);	
					write_date(0x4e);
				}
					break;
			case 2:
				{
					write_com(0x80+add);
					write_date(0x54);
				//	delay(5);
					write_date(0x55);
				//	delay(5);
					write_date(0x45);
				}
					break;
			case 3:
				{	write_com(0x80+add);
					write_date(0x57);
				//	delay(5);
					write_date(0x45);
				//	delay(5);
					write_date(0x44);}
					break;
			case 4:
				{	write_com(0x80+add);
					write_date(0x54);
				//	delay(5);
					write_date(0x48);
				//	delay(5);
					write_date(0x55);}
					break;
			case 5:
				{	write_com(0x80+add);
					write_date(0x46);
			//	delay(5);
					write_date(0x52);
			//		delay(5);
					write_date(0x49);}
					break;
			case 6:
				{	write_com(0x80+add);
					write_date(0x53);
				//	delay(5);
					write_date(0x41);
				//	delay(5);
					write_date(0x54);}
					break;
			case 7:
				{	write_com(0x80+add);
					write_date(0x53);
				//	delay(5);
					write_date(0x55);
				//	delay(5);
					write_date(0x4e);}
					break;
		}
}
void keyscan()
{	
	if(flag_ri==1)//按任意键取消报警
	{
		if((s1==0)||(s2==0)||(s3==0)||(s4==0))
		{
			delay(5);
			if((s1==0)||(s2==0)||(s3==0)||(s4==0))
			{
				while(!(s1&&s2&&s3&&s4));
				di();
				flag_ri=0;
			}
		}
	}
	if(s1==0)
	{
		delay(5);
		if(s1==0)
		{
			s1num++;
			flag=1;
			if(flag1==1)
				if(s1num==4)
					s1num=1;
			while(!s1);
			di();
			switch(s1num)
			{
				case 1: write_com(0x80+0x40+8);
						write_com(0x0f);//开显示,光标显示并闪烁
						break;
				case 2: write_com(0x80+0x40+5);
						break;
				case 3: write_com(0x80+0x40+2);
						break;
				case 4: write_com(0x80+13);
						break;
				case 5: write_com(0x80+10);
						break;
				case 6: write_com(0x80+7);
						break;
				case 7: write_com(0x80+4);
						break;
				case 8: s1num=0;
						write_com(0x0c);
						flag=0;
						write_ds(0,miao);
						write_ds(2,fen);
						write_ds(4,shi);
						write_ds(6,week);
						write_ds(7,day);
						write_ds(8,month);
						write_ds(9,year);
						break;
			}
		}
	}
	if(s1num!=0)
	{
		if(s2==0)
		{
			delay(5);
			if(s2==0)
			{
				while(!s2);
				di();
				switch(s1num)
				{
					case 1: miao++;
							if(miao==60)
								miao=0;
							write_sfm(8,miao);
							write_com(0x80+0x40+8);
							break;
					case 2: fen++;
							if(fen==60)
								fen=0;
							write_sfm(5,fen);
							write_com(0x80+0x40+5);
							break;
					case 3: shi++;
							if(shi==24)
								shi=0;
							write_sfm(2,shi);
							write_com(0x80+0x40+2);
							break;
					case 4: week++;
							if(week==8)
								week=1;
							write_week(13,week);
							write_com(0x80+13);
							break;
					case 5: day++;
							if(day==32)
								day=1;
							write_nyr(10,day);
							write_com(0x80+10);
							break;
					case 6: month++;
							if(month==13)
								month=1;
							write_nyr(7,month);
							write_com(0x80+7);
							break;
					case 7: year++;
							if(year==100)
								year=0;
							write_nyr(4,year);
							write_com(0x80+4);
							break;
				}
			}			
		}
		if(s3==0)
		{
			delay(5);
			if(s3==0)
			{
				while(!s3);
				di();
				switch(s1num)
				{
					case 1: miao--;
							if(miao==-1)
								miao=59;
							write_sfm(8,miao);
							write_com(0x80+0x40+8);
							break;
					case 2: fen--;
							if(fen==-1)
								fen=59;
							write_sfm(5,fen);
							write_com(0x80+0x40+5);
							break;
					case 3: shi--;
							if(shi==-1)
								shi=23;
							write_sfm(2,shi);
							write_com(0x80+0x40+2);
							break;
					case 4: week--;
							if(week==0)
								week=7;
							write_week(13,week);
							write_com(0x80+13);
							break;
					case 5: day--;
							if(day==0)
								day=31;
							write_nyr(10,day);
							write_com(0x80+10);
							break;
					case 6: month--;
							if(month==0)
								month=12;
							write_nyr(7,month);
							write_com(0x80+7);
							break;
					case 7: year--;
							if(year==-1)
								year=99;
							write_nyr(4,year);
							write_com(0x80+4);
							break;
				}
			}
		}
	}
	if(s4==0)
	{
		delay(5);
		if(s4==0)
		{
			flag1=~flag1;
			while(!s4);
			di();
			if(flag1==0)
			{
				flag=0;//当按键第二次按下时取消查看闹钟,此时flag为1,应置0
				write_com(0x80+0x40);
				write_date(' ');
				write_date(' ');
				write_com(0x0c);
				write_ds(1,miao);
				write_ds(3,fen);
				write_ds(5,shi);
			}
			else
			{
				read_alarm();
				write_com(0x80+0x40);
				write_date('R');
				write_date('i');
				write_com(0x80+0x40+4);
				write_sfm(2,ashi);
				write_sfm(5,afen);
				write_sfm(8,amiao);
				miao=amiao;
				fen=afen;
				shi=ashi;
			}
		}
	}
}
void write_ds(uchar add,uchar date)
{
	dscs=0;
	dsas=1;
	dsds=1;
	dsrw=1;
	P0=add;
	dsas=0;
	dsrw=0;
	P0=date;
	dsrw=1;
	dsas=1;
	dscs=1;
}
uchar read_ds(uchar add)
{
	uchar ds_date;
	dscs=0;
	dsas=1;
	dsds=1;
	dsrw=1;
	P0=add;
	dsas=0;
	dsds=0;
	P0=0xff;
	ds_date=P0;
	dsds=1;
	dsas=1;
	dscs=1;
	return ds_date;
}
/*void set_time()
{
	write_ds(0,0);
	write_ds(1,0);
	write_ds(2,0);
	write_ds(3,0);
	write_ds(4,0);
	write_ds(5,0);
	write_ds(6,0);
	write_ds(7,0);
	write_ds(8,0);
	write_ds(9,0);
}*/
void set_alarm(uchar amiao,uchar afen,uchar ashi)
{
	write_ds(1,amiao);
	write_ds(3,afen);
	write_ds(5,ashi);
}
void read_alarm()
{
	amiao=read_ds(1);
	afen=read_ds(3);
	ashi=read_ds(5);
}
void main()
{	
	uchar i;
	init();
	while(1)
	{	
		keyscan();
		if(flag_ri==1)
		{
			di();
			delay(100);
			di();
			delay(500);
		}
		if(flag==0&&flag1==0)
		{
			keyscan();
			year=read_ds(9);
			month=read_ds(8);
			day=read_ds(7);
			week=read_ds(6);
			shi=read_ds(4);
			fen=read_ds(2);
			miao=read_ds(0);
			write_sfm(8,miao);
			write_sfm(5,fen);
			write_sfm(2,shi);
			write_week(13,week);
			write_nyr(10,day);
			write_nyr(7,month);
			write_nyr(4,year);
			tempchange();
			for(i=0;i<5;i++)
			{
				wendu(get_temp());
			}
		}	
	}
}
void exter() interrupt 2
{
	uchar c;
	flag_ri=1;
	c=read_ds(0x0c);
}

⌨️ 快捷键说明

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