51单片机初学(二)液晶屏时钟,并保存数据

可能有未知的BUG

有些东西要看着才能写下来,那些时序什么的记不住啊

代码有郭天祥的影子=-= 毕竟是他教的

/*
Nonikka
2014-5-24
*/

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P2^0;
sbit scl=P2^1;
sbit lcden=P2^7;
sbit lcdrs=P2^6;
sbit lcdrw=P2^5;
sbit fmq=P3^0;

uchar count,shi,fen,miao,s1num,r;
uchar code table[]="Time:";
uchar code table1[]="00:00:00";
sbit s1=P1^0;
sbit s2=P1^1;
sbit s3=P1^2;
sbit rd=P1^7;

void delay()
{ ; ; }

void delayms(uint z)
{	uint x,y;
	for(x=z;x>0;x--)
	{
		for(y=110;y>0;y--);
	}
}
//*********************************************  I2C总线
void start()
{
	sda=1;
	delay();
	scl=1;
	delay();
	sda=0;
	delay();
}
void stop()
{
	sda=0;
	delay();
	scl=1;
	delay();
	sda=1;
	delay();
}
void respons()
{
	uchar i;
	scl=1;
	delay();
	while((sda==1)&&(i<250))i++;
	scl=0;
	delay();
}
void initi2c()
{
	sda=1;
	scl=1;
}
void write_byte(uchar date)
{
	uchar temp,i;
	temp=date;
	scl=0;
	delay();
	for(i=0;i<8;i++)
	{
		temp=temp<<1;
		sda=CY;
		delay();
		scl=1;
		delay();
		scl=0;
		delay();
	}
	sda=1;
	delay();
}
uchar read_byte()
{
	uchar i,j,k;
	scl=0;
	delay();
	sda=1;
	delay();
	for(i=0;i<8;i++)
	{
		scl=1;
		delay();
		j=sda;
		k=(k<<1)|j;
		scl=0;
		delay();
	}
	return k;	 
}

void send(uchar add,uchar date)
{
	start();
	write_byte(0xa0); //写器件地址
	respons();
	write_byte(add);//器件内部存储器地址
	respons();
	write_byte(date);
	respons();
	stop();
}

char get(uchar add)
{
	start();
	write_byte(0xa0); //写器件地址
	respons();
	write_byte(add);
	respons();
	start();
	write_byte(0xa1);  //读
	respons();
	r=read_byte();
	return r;
}
//**********************************************

void xiang()	 //蜂鸣器
{	
	int i;
	for(i=25;i>0;i--)
	{
		fmq=1;
		delayms(2);
		fmq=0;
		delayms(2);
	}	
}

void write_com(uchar com)
{
	lcden=0;
	lcdrs=0;
	lcdrw=0;
	P0=com;
	delayms(3);
	lcden=1;
	delayms(3);
	lcden=0;	
}

void write_date(uchar date)
{
	lcdrs=1;
	lcden=0;
	P0=date;
	delayms(3);
	lcden=1;
	delayms(3);
	lcden=0;	
}

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 init()
{	uchar num;
	lcden=0;
	write_com(0x38);
	write_com(0x0c);
	write_com(0x06);
	write_com(0x01);
	write_com(0x80);
	delayms(2);
	for(num=0;num<5;num++)
	{
		write_date(table[num]);
		delayms(3);
	}
	write_com(0x80+0x40);
	for(num=0;num<8;num++)
	{
		write_date(table1[num]);
		delayms(3);
	}
	TMOD=0x01;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	EA=1;						 //中断定时器等
	ET0=1;
	TR0=1;
}

void keyscan()
{
	rd=0;
	if(s1==0)
	{
		delayms(5);
		if(s1==0)
		{	
			s1num++;
			while(!s1);		             //松手检测
			xiang();
			if(s1num==1)
			{
				TR0=0;	                 //计时器停止
				write_com(0x80+0x40+7);
				write_com(0x0f);
			}
			if(s1num==2)	 
			{
				write_com(0x80+0x40+4);
			}
			if(s1num==3)	 
			{
				write_com(0x80+0x40+1);
			}
			if(s1num==4)	 
			{
				s1num=0;
				write_com(0x0c);
				TR0=1;
			}		
		}
			
	}
	if(s1num!=0)
		{
			if(s2==0);
			{
				delayms(5);
				if(s2==0)
				{
					if(s1num==1)
					{
						while(!s2);				  //和下面的时间减不一样
						xiang();
						miao++;					
						if(miao==60)
						{
							miao=0;
						}
						write_com(0x80+0x40+6);				//每次都要写入数据,定指针
						write_sfm(6,miao);
						write_com(0x80+0x40+7);
						send(1,miao);
					}
					if(s1num==2)
					{
						while(!s2);
						xiang();
						fen++;
						if(fen==60)
						{
							fen=0;
						}
						write_com(0x80+0x40+3);
						write_sfm(3,fen);
						write_com(0x80+0x40+4);
						send(2,fen);	
					}
					if(s1num==3)
					{
						while(!s2);
						xiang();
						shi++;
						if(shi>=24)
						{
							shi=0;
						}
						write_com(0x80+0x40+0);
						write_sfm(0,shi);
						write_com(0x80+0x40+1);	
						send(3,shi);
					}	
				}
			}
//**************************************************************减
		if(s3==0);		                                     //时间减
			{
				delayms(5);
				if(s3==0)
				{
					if(s1num==1)
					{
						while(!s3);
						xiang();
						if(miao==0)
						{
							miao=60;
						} 
						miao--;
						write_com(0x80+0x40+6);
						write_sfm(6,miao);
						write_com(0x80+0x40+7);
						send(1,miao);
					}
					if(s1num==2)
					{
						while(!s3);
						xiang();
						if(fen==0)
						{
							fen=60;
						}  
						fen--;
						write_com(0x80+0x40+3);
						write_sfm(3,fen);
						write_com(0x80+0x40+4);
						send(2,fen);	
					}
					if(s1num==3)
					{
						while(!s3);	
						xiang();
						if(shi==0)
						{
							shi=24;
						} 
						shi--;
						write_com(0x80+0x40+0);
						write_sfm(0,shi);
						write_com(0x80+0x40+1);	
						send(3,shi);
					}	
				}
			}
		}	
}



void main()
{
	init();
	initi2c();									//i2c初始化放前面
	miao=get(1);								//读取断电前数据
	delayms(10);
	fen=get(2);
	delayms(10);
	shi=get(3);	
	write_sfm(0,shi);
	write_sfm(3,fen);
	write_sfm(6,miao);
							    
	while(1)
	{
		keyscan();
		if(count==20)                           //即一秒
		{
			count=0;
			miao++;
			if(miao==60)
			{
			miao=0;
			fen++;
			if(fen==60)
				{
				fen=0;
				shi++;
				if(shi>=24)
					{
						shi=0;
					}
					write_sfm(0,shi);			  //此处逻辑关系要注意
				}
				write_sfm(3,fen);
			}
			write_sfm(6,miao);
			send(1,miao);				          //每秒发送数据
			delayms(10);
			send(2,fen);
			delayms(10);
			send(3,shi);
		}
	}	
}

void timer0() interrupt 1
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	count++;
}


这个是效果图

∑((((o△o)))

怎么是反过来的!!!



好了学渣赶紧去复习线代=-=



有个BUG是因为一些代码写在主函数,其实应该写在interrupt 1里,不然会导致挑完时间可能就不动了。


改完是这样,可能还是有错。

/*
Nonikka
2014-5-24
*/

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P2^0;
sbit scl=P2^1;
sbit lcden=P2^7;
sbit lcdrs=P2^6;
sbit lcdrw=P2^5;
sbit fmq=P3^0;

uchar count,shi,fen,miao,s1num,r;
uchar code table[]="Time:";
uchar code table1[]="00:00:00";
sbit s1=P1^0;
sbit s2=P1^1;
sbit s3=P1^2;
sbit rd=P1^7;

void delay()
{ ; ; }

void delayms(uint z)
{	uint x,y;
	for(x=z;x>0;x--)
	{
		for(y=110;y>0;y--);
	}
}
//*********************************************  I2C总线
void start()
{
	sda=1;
	delay();
	scl=1;
	delay();
	sda=0;
	delay();
}
void stop()
{
	sda=0;
	delay();
	scl=1;
	delay();
	sda=1;
	delay();
}
void respons()
{
	uchar i;
	scl=1;
	delay();
	while((sda==1)&&(i<250))i++;
	scl=0;
	delay();
}
void initi2c()
{
	sda=1;
	scl=1;
}
void write_byte(uchar date)
{
	uchar temp,i;
	temp=date;
	scl=0;
	delay();
	for(i=0;i<8;i++)
	{
		temp=temp<<1;
		sda=CY;
		delay();
		scl=1;
		delay();
		scl=0;
		delay();
	}
	sda=1;
	delay();
}
uchar read_byte()
{
	uchar i,j,k;
	scl=0;
	delay();
	sda=1;
	delay();
	for(i=0;i<8;i++)
	{
		scl=1;
		delay();
		j=sda;
		k=(k<<1)|j;
		scl=0;
		delay();
	}
	return k;	 
}

void send(uchar add,uchar date)
{
	start();
	write_byte(0xa0); //写器件地址
	respons();
	write_byte(add);//器件内部存储器地址
	respons();
	write_byte(date);
	respons();
	stop();
}

char get(uchar add)
{
	start();
	write_byte(0xa0); //写器件地址
	respons();
	write_byte(add);
	respons();
	start();
	write_byte(0xa1);  //读
	respons();
	r=read_byte();
	return r;
}
//**********************************************

void xiang()	 //蜂鸣器
{	
	int i;
	for(i=25;i>0;i--)
	{
		fmq=1;
		delayms(2);
		fmq=0;
		delayms(2);
	}	
}

void write_com(uchar com)
{
	lcden=0;
	lcdrs=0;
	lcdrw=0;
	P0=com;
	delayms(3);
	lcden=1;
	delayms(3);
	lcden=0;	
}

void write_date(uchar date)
{
	lcdrs=1;
	lcden=0;
	P0=date;
	delayms(3);
	lcden=1;
	delayms(3);
	lcden=0;	
}

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 init()
{	uchar num;
	lcden=0;
	write_com(0x38);
	write_com(0x0c);
	write_com(0x06);
	write_com(0x01);
	write_com(0x80);
	delayms(2);
	for(num=0;num<5;num++)
	{
		write_date(table[num]);
		delayms(3);
	}
	write_com(0x80+0x40);
	for(num=0;num<8;num++)
	{
		write_date(table1[num]);
		delayms(3);
	}
	TMOD=0x01;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	EA=1;						 //中断定时器等
	ET0=1;
	TR0=1;
}

void keyscan()
{
	rd=0;
	if(s1==0)
	{
		delayms(5);
		if(s1==0)
		{	
			s1num++;
			while(!s1);		             //松手检测
			xiang();
			if(s1num==1)
			{
				TR0=0;	                 //计时器停止
				write_com(0x80+0x40+7);
				write_com(0x0f);
			}
			if(s1num==2)	 
			{
				write_com(0x80+0x40+4);
			}
			if(s1num==3)	 
			{
				write_com(0x80+0x40+1);
			}
			if(s1num==4)	 
			{
				s1num=0;
				write_com(0x0c);
				TR0=1;
			}		
		}
			
	}
	if(s1num!=0)
		{
			if(s2==0);
			{
				delayms(5);
				if(s2==0)
				{
					if(s1num==1)
					{
						while(!s2);				  //和下面的时间减不一样
						xiang();
						miao++;					
						if(miao==60)
						{
							miao=0;
						}
						write_com(0x80+0x40+6);				//每次都要写入数据,定指针
						write_sfm(6,miao);
						write_com(0x80+0x40+7);
						send(1,miao);
					}
					if(s1num==2)
					{
						while(!s2);
						xiang();
						fen++;
						if(fen==60)
						{
							fen=0;
						}
						write_com(0x80+0x40+3);
						write_sfm(3,fen);
						write_com(0x80+0x40+4);
						send(2,fen);	
					}
					if(s1num==3)
					{
						while(!s2);
						xiang();
						shi++;
						if(shi>=24)
						{
							shi=0;
						}
						write_com(0x80+0x40+0);
						write_sfm(0,shi);
						write_com(0x80+0x40+1);	
						send(3,shi);
					}	
				}
			}
//**************************************************************减
		if(s3==0);		                                     //时间减
			{
				delayms(5);
				if(s3==0)
				{
					if(s1num==1)
					{
						while(!s3);
						xiang();
						if(miao==0)
						{
							miao=60;
						} 
						miao--;
						write_com(0x80+0x40+6);
						write_sfm(6,miao);
						write_com(0x80+0x40+7);
						send(1,miao);
					}
					if(s1num==2)
					{
						while(!s3);
						xiang();
						if(fen==0)
						{
							fen=60;
						}  
						fen--;
						write_com(0x80+0x40+3);
						write_sfm(3,fen);
						write_com(0x80+0x40+4);
						send(2,fen);	
					}
					if(s1num==3)
					{
						while(!s3);	
						xiang();
						if(shi==0)
						{
							shi=24;
						} 
						shi--;
						write_com(0x80+0x40+0);
						write_sfm(0,shi);
						write_com(0x80+0x40+1);	
						send(3,shi);
					}	
				}
			}
		}	
}



void main()
{
	init();
	initi2c();									//i2c初始化放前面
	miao=get(1);								//读取断电前数据
	delayms(10);
	fen=get(2);
	delayms(10);
	shi=get(3);	
	write_sfm(0,shi);
	write_sfm(3,fen);
	write_sfm(6,miao);						    
	while(1)
	{
		keyscan();	
	}	
}

void timer0() interrupt 1
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	count++;
	
		if(count==20)                           //即一秒
		{
			count=0;
			miao++;
			if(miao==60)
			{
			miao=0;
			fen++;
			if(fen==60)
				{
				fen=0;
				shi++;
				if(shi>=24)
					{
						shi=0;
					}
					write_sfm(0,shi);			  //此处逻辑关系要注意
				}
				write_sfm(3,fen);
			}
			write_sfm(6,miao);
			send(1,miao);				          //每秒发送数据
			delayms(10);
			send(2,fen);
			delayms(10);
			send(3,shi);
		}
}

编辑器有warning *** WARNING L15: MULTIPLE CALL TO SEGMENT


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值