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

📄 8051-ds12887--.c

📁 8051 与1602液晶
💻 C
字号:
#include<reg52.h>
#include <SoundPlay.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^0;
sbit rw=P1^1;
sbit e=P1^2;
sbit dscs=P1^3;
sbit dsas=P1^4;
sbit dsrw=P1^5;
sbit dsds=P1^6;
sbit dsirq=P3^2;
sbit k1=P3^5;
sbit k2=P3^6;
sbit k3=P3^7;  
sbit buzzer=P1^7;  
uchar flag=0,flag1;
char k1num=0;
char nian,yue,ri,zhou;
char i;
char shi,fen,miao;                                                                                                                                                                                                                          
uchar code table[]="   20--------        ";//年月日中间有"-",开始全写空格就ok
uchar code table1[]="      :  :   ";
uchar code table2[7][3]={"MON","TUE","WEN","THU","FRI","SAT","SUN"};
void delay(uchar z)
{
	uchar i,j;
	for(i=0;i<z;i++)
		for(j=120;j>0;j--);
}

void write_com_1602(uchar com)
{
	
	
	rs=0;
	e=0;         
	P2=com;
	delay(1);	
	e=1;
	delay(1);
	e=0;
	
}
void write_date_1602(uchar date)
{	
	
	rs=1;
	e=0;
	P2=date;
	delay(1);
		
	e=1;
	delay(1);
	e=0;
}


void write_sfm(uchar shi,uchar fen,uchar miao)
{
	uchar shis,shig,fens,feng,miaos,miaog;//个位和十位
	shis=shi/10;
	shig=shi%10;
	fens=fen/10;
	feng=fen%10;
	miaos=miao/10;
	miaog=miao%10;
	write_com_1602(0x80+0x40+4);
	write_date_1602(shis+0x30);
	
	write_date_1602(shig+0x30);
	write_com_1602(0x80+0x40+7);
	write_date_1602(fens+0x30);

	write_date_1602(feng+0x30);
	write_com_1602(0x80+0x40+10);
	write_date_1602(miaos+0x30);

	write_date_1602(miaog+0x30);
}
void write_nyrz(uchar nian,uchar yue,uchar ri,uchar zhou)//写年月日周**注意年时int型
{	//年的范围2000-2099!!nian 00-99设成uchar ok
	int i;

	write_com_1602(0x80+4);
	write_date_1602(nian/10+0x30);
	//write_com_1602(0x80+5);
	write_date_1602(nian%10+0x30);
	write_com_1602(0x80+7);//
	write_date_1602(yue/10+0x30);
	//write_com_1602(0x80+8);
	write_date_1602(yue%10+0x30);
	write_com_1602(0x80+10);//
	write_date_1602(ri/10+0x30);
	//write_com_1602(0x80+11);
	write_date_1602(ri%10+0x30);
	write_com_1602(0x80+13);
	for(i=0;i<3;i++)
	write_date_1602(table2[zhou-1][i]);//写完一个字母后指针自己加一
}
void write_ds12887(uchar add,uchar date)
{

	dscs=0;
	dsas=0;
	dsds=1;
	dsrw=1;
	dsas=1;
	P0=add;
	dsas=0;
	dsrw=0;
	P0=0xff;
	
	P0=date;
	dsrw=1;
	dsas=1;
	dscs=1;
}
uchar read_ds12887(uchar add)
{
	uchar dat;
	dsas=0;
	dsds=1;
	dsrw=1;
	dsas=1;
	dscs=0;
	P0=add;
	dsas=0;
	dsds=0;
	P0=0xff;
	dat=P0;
	dsds=1;
	dsas=1;
	dscs=1;
	return dat;
	
	
}
void init()
{	uchar i;
	rw=0;
	buzzer=0;
	EA=1;
	EX0=1;
	flag1=0;
	write_com_1602(0x38);
	write_com_1602(0x0c);//0x0e	光标不闪烁
	write_com_1602(0x01);
	write_com_1602(0x80);
	write_ds12887(0x0a,0x20);//一开始问题出在这里,特特特特别注意,,可能第一次用的时候要设置
	write_ds12887(0x0b,0x86);//write_ds(0x0B,0x26);read_ds(0x0c);
	write_ds12887(0x0b,0x06);
	write_ds12887(0x0b,0x26);//闹钟中断使能
	read_ds12887(0x0c);//清除闹钟中断标志位

	for(i=0;table[i];i++)
		{
			write_date_1602(table[i]);
			
		}
	write_com_1602(0x80+0x40);
	for(i=0;table1[i];i++)
		{
			write_date_1602(table1[i]);
			
		}

}
//设置时间年月日周时分秒
void settime_12887(uchar nian,uchar yue,uchar ri,uchar zhou,uchar shi,uchar fen,uchar miao)
{
	write_ds12887(0x00,miao);
	write_ds12887(0x02,fen);
	write_ds12887(0x04,shi);
	write_ds12887(0x06,zhou);
	write_ds12887(0x07,ri);
	write_ds12887(0x08,yue);
	write_ds12887(0x09,nian);
}
void set_alarm(uchar shi,uchar fen,uchar miao)
{
	write_ds12887(0x01,miao);
	write_ds12887(0x03,fen);
	write_ds12887(0x05,shi);
}
void alarm()
{
	buzzer=1;
	delay(200);
	buzzer=0;
	delay(1000);
	buzzer=1;
	delay(200);
	buzzer=0;
	
		
}
void xianshi_all()//显示年月日周时分秒
{
	write_com_1602(0x0c);//指针不闪烁不显示
	nian=read_ds12887(9);
	yue=read_ds12887(8);
	ri=read_ds12887(7);
	zhou=read_ds12887(6);
	write_nyrz(nian,yue,ri,zhou);//显示年月日周		
	shi=read_ds12887(4);
	fen=read_ds12887(2);
	miao=read_ds12887(0);	
	write_sfm(shi,fen,miao);//显示时分秒
	
}

void keyscan()
{
	
	if(k1==0)
	{
		delay(5);
		if(k1==0)
		{
			while(k1==0);
			k1num++;
			flag1=1;
			write_ds12887(0x0a,0x80);//ds12887停止
			if(k1num==1)
			{	write_com_1602(0x0f);//显示光标,闪烁
				write_com_1602(0x80+0x40+11);	
				
				//settime_12887(1,4,5,7,22,55,37);
			}
			
			if(k1num==2)
			{	write_com_1602(0x80+0x40+8);
				
			}
			
			if(k1num==3)
			{	write_com_1602(0x80+0x40+5);
				
			}
			if(k1num==4)
			{	write_com_1602(0x80+15);
				
			}
			if(k1num==5)
			{	write_com_1602(0x80+11);
				
			}
			if(k1num==6)
			{	write_com_1602(0x80+8);
				
			}
			if(k1num==7)
			{	write_com_1602(0x80+5);
				
			}
			if(k1num==8)
			{	k1num=0;
				flag1=0;
				write_ds12887(0x0a,0x20);//ds12887开启	
				write_com_1602(0x0c);//指针停止闪烁
				settime_12887(nian,yue,ri,zhou,shi,fen,miao);
			}
			
		}
	}
	if(k1num!=0)
	{
		if(k2==0)
			{
				delay(5);
				if(k2==0)
				{
					while(k2==0);
					if(k1num==1)
					{
						miao++;
						if(miao==60)
							miao=0;
					
						
						write_com_1602(0x80+0x40+10);//在液晶上面显示秒
						write_date_1602(miao/10+0x30);
						write_date_1602(miao%10+0x30);
						//xianshi_all();	
						write_com_1602(0x80+0x40+11);//把闪烁的指针调回来。否则在write_sfm()写完后指针跑后面去了
						//settime_12887(5,4,5,7,22,55,37);
						}
					if(k1num==2)
					{
						fen++;
						if(fen==60)
							fen=0;
					
						write_com_1602(0x80+0x40+7);//在液晶上面显示分
						write_date_1602(fen/10+0x30);
						write_date_1602(fen%10+0x30);
						//xianshi_all();
						write_com_1602(0x80+0x40+8);
					}
					if(k1num==3)
					{
						shi++;
						if(shi==24)
							shi=0;
					
						write_com_1602(0x80+0x40+4);//在液晶上面显示shi
						write_date_1602(shi/10+0x30);
						write_date_1602(shi%10+0x30);
						//xianshi_all();
						write_com_1602(0x80+0x40+5);
					}
					if(k1num==4)
					{
						zhou++;
						if(zhou==8)
							zhou=1;
					
						write_com_1602(0x80+13);//在液晶上面显示shi
						for(i=0;i<3;i++)
						write_date_1602(table2[zhou-1][i]);
						//xianshi_all();
						write_com_1602(0x80+15);
					}
					if(k1num==5)
					{
						ri++;
						if(ri==32)
							ri=1;
					
						write_com_1602(0x80+10);//在液晶上面显示shi
						write_date_1602(ri/10+0x30);
						write_date_1602(ri%10+0x30);
						//xianshi_all();
						write_com_1602(0x80+11);
					}
					if(k1num==6)
					{
						yue++;
						if(yue==13)
							yue=0;
					
						write_com_1602(0x80+7);//在液晶上面显示shi
						write_date_1602(yue/10+0x30);
						write_date_1602(yue%10+0x30);
						//xianshi_all();
						write_com_1602(0x80+8);
					}
					if(k1num==7)
					{
						nian++;
						if(nian==100)
							nian=0;
					
						write_com_1602(0x80+4);//在液晶上面显示shi
						write_date_1602(nian/10+0x30);
						write_date_1602(nian%10+0x30);
						//xianshi_all();
						write_com_1602(0x80+5);
					}
				}
			}
	}	

if(k1num!=0)
	{
		if(k3==0)
			{
				delay(5);
				if(k3==0)
				{
					while(k3==0);
					if(k1num==1)
					{
						miao--;
						if(miao==-1)
							miao=59;
					
						write_com_1602(0x80+0x40+10);//在液晶上面显示秒
						write_date_1602(miao/10+0x30);
						write_date_1602(miao%10+0x30);
					
						//xianshi_all();
						write_com_1602(0x80+0x40+11);//把闪烁的指针调回来。否则在write_sfm()写完后指针跑后面去了
					}
					if(k1num==2)
					{
						fen--;
						if(fen==-1)
							fen=59;
						
						write_com_1602(0x80+0x40+7);//在液晶上面显示分
						write_date_1602(fen/10+0x30);
						write_date_1602(fen%10+0x30);
						//xianshi_all();
						write_com_1602(0x80+0x40+8);
					}
					if(k1num==3)
					{
						shi--;
						if(shi==-1)
							shi=23;
							
					
						write_com_1602(0x80+0x40+4);//在液晶上面显示shi
						write_date_1602(shi/10+0x30);
						write_date_1602(shi%10+0x30);
						//xianshi_all();
						write_com_1602(0x80+0x40+5);
					}
					if(k1num==4)
					{
						zhou--;
						if(zhou==0)
							zhou=7;
					
						write_com_1602(0x80+13);//在液晶上面显示
						for(i=0;i<3;i++)
						write_date_1602(table2[zhou-1][i]);
						//xianshi_all();
						write_com_1602(0x80+15);
					}
					if(k1num==5)
					{
						ri--;
						if(ri==-1)
							ri=31;
					
						write_com_1602(0x80+10);//在液晶上面显示
						write_date_1602(ri/10+0x30);
						write_date_1602(ri%10+0x30);
						//xianshi_all();
						write_com_1602(0x80+11);
					}
					if(k1num==6)
					{
						yue--;
						if(yue==-1)
							yue=12;
					
						write_com_1602(0x80+7);//在液晶上面显示
						write_date_1602(yue/10+0x30);
						write_date_1602(yue%10+0x30);
						//xianshi_all();
						write_com_1602(0x80+8);
					}
					if(k1num==7)
					{
						nian--;
						if(nian==-1)
							nian=99;
					
						write_com_1602(0x80+4);//在液晶上面显示i
						write_date_1602(nian/10+0x30);
						write_date_1602(nian%10+0x30);
						//xianshi_all();
						write_com_1602(0x80+5);
					}

				}
			}
	}


}
void main()
{	
	init();
	//set_alarm(19,13,20);
	//settime_12887(9,4,7,2,12,18,37);
	while(1)
	{
		
		keyscan();
		if(flag==1)
			{
				alarm();
				
			}
		if(flag1==0)
			xianshi_all();
	}	
	
	
	
}void int0() interrupt 0
{
	uchar a;
	a=read_ds12887(0x0c);//清除闹钟中断标志位
	flag=1;
}

⌨️ 快捷键说明

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