用LCD1602實現簡單的數字時鐘

摘要:隨着科技的發展,單片機的應用正在不斷深入,涉及到日常生活的方方面面。本設計是基於單片機89C51爲控制核心,以液晶爲顯示的數字時鐘。本數字時鐘設計的原理相對簡單,所以硬件電路也相對簡單,難點和重點主要放在C語言的編程上,使用到定時器的子程序、延時程序、時分秒的控制程序、液晶模塊和單片機模塊的初始化程序、液晶顯示的程序等,各個函數交叉調用,配合主程序的運行。


 數字時鐘的概述與功能的簡介
本設計用到單片機的P0端做數據端,把數據發送到LCD的數據接收端,然後通過利用程序進行對液晶的控制,實現數字的顯示。在本設計中,設計了四個功能按鍵,分別是啓動/停止時鐘,時、分、秒的加一功能,以此對時間的調整。硬件電路相對簡單,所以軟件的開銷相對增大,特別是對液晶模塊的程序設計,也正是設計本數字時鐘的目的,希望通過此設計提高自己的軟件編程與調試能力。由於個人能力也有限,在短時間內不能編寫出用液晶顯示年月日的程序,因爲代碼量確實增大不少。

(電路圖的鏈接端與程序不完全一直)
仿真結果:

#include<reg51.h>
#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);  //一直顯示時鐘

	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章