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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于51单片机的液晶显示屏控制系统设计 1 概述 1.1系统背景 液晶显示器件在中国已有十余年的发展历史。十余年来,液晶显示器件从实验室走 向大规模生产集团,形成了独立的产业部门。现在,液晶显示几乎已经应用于生产,生 活的各个领域,人们几乎时时处处都要与这一神奇而又普通的面孔打交道。 液晶显示是集单片机技术、微电子技术、信息处理于一体的新型显示方式。由于液晶 显示器具有低压低功耗,显示信息量大易于彩色化,无电磁辐射,长寿命,无污染等特 点。LCD是目前显示产业中发展速度最快,市场应用最广的显示器件,成为众多显示媒体 中的佼佼者,在越来越多的领域中发挥作用,是目前显示器件中一个理想的选择。 LCD在监控系统中的应用:目前大多数监控系统自带的显示系统为LED数码管显示,这 样显示效果比较单一,只能显示监控系统的测量值。而LCD液晶显示器不仅可以显示数值 、汉字等,并且可以显示文本和图形。利用LCD和键盘实现人机交互,使监控系统独立工 作成为可能。通过监控系统对现场的单回路控制器进行参数设置,对各个单回路控制器 的工作进行监控。 LCD在时钟中的应用:在日常生活中我们会经常看到时间的显示,这些显示大都是采 用液晶显示器来显示的,而对其中的汉字无法用显示来解决。我们利用LCD液晶模块制成 的小屏幕实现了时间的显示,显示格式为"时时:分分:秒秒"。另外,可以增加闹钟功 能,时间到了则产生音乐声;还可以增加万年历显示"年月日"等多项功能。 LCD在大屏幕显示中的应用:大屏幕显示的应用范围极广,随着社会发展,公众生活 的加强,人们对能够面向广大公众传递信息的显示装置越来越感到必需。使用液晶投影 显示大屏幕,不仅有投影仪,指挥用大屏幕,还有液晶投影彩色电视。它可以用一个体 积很小的系统装置,实现100英寸以上的非常漂亮的大屏幕电视显示。它与传统的显示媒 体相比,具有分辨率极高,透过性好,显示内容丰富,彩色易于控制等优点。 随着计算机技术及电子通信技术的发展,LCD显示屏作为一种新的传媒工具,现已经 应用到商业、军事、车站、宾馆、体育、新闻、金融、证券、广告以及交通运输等许多 行业,大到几十平方米的大屏幕,小到家庭影院用的图文显示屏,以及政府部门应用的 电子黑板,证券、银行等部门用的信息数字混合屏。LCD显示屏带来广泛的社会效益和经 济效益,具有良好的发展前景。 1.2 系统概述 本实验系统分为单片机最小系统板和液晶显示屏两部分。单片机最小系统负责接收个人 计算机所编辑的文本及内容,通过RS232串行接口通信完成单片机与PC机之间的数据传送 ,而个人计算机(即PC机),主要完成显示内容的编辑、字符码的查找、字符数据的发 送等工作。基于Windows操作系统下的文本编辑软件有很多种,例如:记事本、Micorso ft Word、写字板等,我们可以采用任何一种编辑软件将要显示的内容(包括汉字、中英文 字母、标点符号等)编辑成一个文本文件,然后通过已经编写好的应用程序在特定的字 库中依次搜索到文本文件中的内容,并且取出该字符的字模数据,此项工作称为字模数 据的提取;字模数据文件的生成也就是将取出的字模按顺序存放到一个十六进制文件中 ;字符数据建立好之后将其存放在PC机的硬盘上,等到需要的时候通过串行通信软件将 字符数据文件发送给液晶显示系统模块。 LCD显示屏包括主控制模块和LCD液晶显示模块。主控制模块负责接收单片机发送过来 的字模数据文件,并且协调各个LCD液晶显示模块工作,主控制器模块的核心是T6963C控 制器,为了存储字模数据还在主控制器模块中扩展了一片8K存储器芯片6264;LCD液晶显 示模块由两片行驱动器T6A40和三片列驱动器T6A39进行驱动,该模块一边接收主控制模 块的数据,一边将数据送LCD液晶显示屏显示,为了方便系统的扩展,各模块之间采用串 行口接收数据,并且接到系统串行总线上。 本系统主要是实现单片机与液晶显示模块之间的接口技术,可以采用间接控制方式完 成。将液晶显示模块接口与单片机系统板中的某个并行I/O接口连接,计算机通过对该I/ O接口的操作间接的实现对模块的控制。 2 系统设计方案 此LCD液晶显示控制系统设计的关键是要实现LCD的显示控制。应该先从显示方式的确 定入手,接下来设计相应显示方式的电路,要实现显示内容的实时更新,就必须考虑字 模数据的存储及通信电路的设计。 2.1字模数据的存储 由于89C51单片机内部程序存储器(ROM)只有4K空间,本设计采用16×16点阵显示一个 汉字,每一行需要两个字节数据,一个汉字占16×2=32字节,汉字一共有6000多个,不 可能将庞大的汉字字库存入在单片机内部,即使将预先要显示的内容存入ROM中,也不便 于实时控制,所以只有考虑扩展外部数据存储器。 利用Window

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值