用LCD1602实现简单的数字时钟

摘要:随着科技的发展,单片机的应用正在不断深入,涉及到日常生活的方方面面。本设计是基于单片机89C51为控制核心,以液晶为显示的数字时钟。本数字时钟设计的原理相对简单,所以硬件电路也相对简单,难点和重点主要放在C语言的编程上,使用到定时器的子程序、延时程序、时分秒的控制程序、液晶模块和单片机模块的初始化程序、液晶显示的程序等,各个函数交叉调用,配合主程序的运行。


 数字时钟的概述与功能的简介
本设计用到单片机的P0端做数据端,把数据发送到LCD的数据接收端,然后通过利用程序进行对液晶的控制,实现数字的显示。在本设计中,设计了四个功能按键,分别是启动/停止时钟,时、分、秒的加一功能,以此对时间的调整。硬件电路相对简单,所以软件的开销相对增大,特别是对液晶模块的程序设计,也正是设计本数字时钟的目的,希望通过此设计提高自己的软件编程与调试能力。由于个人能力也有限,在短时间内不能编写出用液晶显示年月日的程序,因为代码量确实增大不少。

(电路图的链接端与程序不完全一直)
仿真结果:

#include
#define uchar unsigned char
#define uint unsigned int
uchar hour,min,sec,count,hour1,hour2,
sec1,sec2,min1,min2,keystopc,temp;
sbit keystop=P0^0;
sbit keyh=P0^1;
sbit keym=P0^2;
sbit keys=P0^3;
sbit lcden=P1^0;
sbit lcdrw=P1^1;
sbit lcdrs=P1^2;
uchar code table[]={
'0','1','2','3','4','5','6','7','8','9',':'};

void init()						//定时器初始化
{
	count=0;
	hour=23;
	min=59;
	sec=50;
	TMOD=0x01;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	TR0=1;
	ET0=1;
	EA=1;
}

void delay(uint z)                //延时程序
{
	uint x,y;
	for(x=z;x>0;x--)
	 for(y=110;y>0;y--);
}

/**************************************************************
             LCD1602显示函数
*************************************************************/
void write_com(uchar com)
{
	lcdrs=0;
	P2=com;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;
}

void write_data(uchar date)
{
	lcdrs=1;
	P2=date;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;
}
void init_1602()				//初始化1602
{
	lcden=0;
	lcdrw=0;
	write_com(0x38);
	write_com(0x0c);
	write_com(0x06);
	write_com(0x01);
	write_com(0x80);
}

 void write_Char(unsigned char x,unsigned char y,unsigned char date) 
 {     
 if (y == 0) 
 	{     
 	write_com(0x80 + x);     
 	}    
 else 
 	{     
 	write_com(0xC0 + x);     
 	}        
 write_data(date);  
 } 

void display(uchar hour1,uchar hour2,uchar min1,uchar min2,uchar sec1,uchar sec2)	 //显示程序
{	
	//write_com_nextl(0x80+0x40+0x03);
	write_Char(1,0,table[hour1]);
	write_Char(2,0,table[hour2]);
	write_Char(3,0,table[0x0a]);
	write_Char(4,0,table[min1]);
	write_Char(5,0,table[min2]);
	write_Char(6,0,table[0x0a]);
	write_Char(7,0,table[sec1]);
	write_Char(8,0,table[sec2]);

}

/**************************************************************
             计时器/定时器0
*************************************************************/
void count0() interrupt 1
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	count++;
	if(count==20)
		{
			count=0;
			sec++;
			if(sec==60)
			{
				sec=0;
				min++;
				if(min==60)
				{
					min=0;
					hour++;
					if(hour==24)
					{
				  		hour=0;
					}
				}
			}

		}
}

/**************************************************************
             主函数
*************************************************************/

void main()
{
	init();
	init_1602();
	while(1)
	{	
		if(keystop==0)                             //检测是否停止键按下
		{
			delay(10);
			if(keystop==0)
			{
				if(keystopc!=1)   keystopc++;      //按停止键的次数	
				else              keystopc=0;
				while(keystop==0);                 //松手检测
				delay(5);
				while(keystop==0); 
			}
			switch(keystopc)
			{
				case 1:TR0=0;break;                // 按键一次就停止计数
				case 0:TR0=1;break;
				default:break;
			}

		}

		if(keyh==0)                 //实现小时加一
		{
			delay(5);
			if(keyh==0)
			{	
				if(hour!=23)	hour++;
				else    		hour=0;
			}
			while(!keyh);          
			delay(5);
			while(!keyh);
		}

		if(keym==0)              //实现分钟加一
		{
			delay(5);
			if(keym==0)
			{	
				if(min!=59)
				{
					min++;
				}
				else 
				{
					min=0;
				}
			}
			while(!keym);		//松手检测
			delay(5);
			while(!keym);
		}

		if(keys==0)             //实现秒加一
		{
			delay(5);
			if(keys==0)
			{	
				if(sec!=59)
				{
					sec++;
				}
				else 
				{
					sec=0;
				}
			}
			while(!keys);
			delay(5);
			while(!keys);
		}

		hour1=hour/10;
		hour2=hour%10;
		min1=min/10;
		min2=min%10;
		sec1=sec/10;
		sec2=sec%10;
   	display(hour1,hour2,min1,min2,sec1,sec2);  //一直显示时钟

	}
}



你可能感兴趣的:(电子设计)