C51单片机LCD1602时钟项目简易教程

一,实验现象

实验项目现象如下:

5fb544c151cb4d69840ffb775d645ee7.jpg

7121f31445904f0aba9cff8db1bfa230.jpg 

 

这个项目需要用到51单片机板上的功能如下:

1.独立按键

2.LCD1602

3.定时器中断

功能介绍

1.独立按键实现三个功能,选择键,增大键,减小键。

2.lcd1602显示时间

3.定时器中断确定时间

代码如下:

#include<reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;

sbit K1 = P3^1; //功能键
sbit K2 = P3^0;	//增大
sbit K3 = P3^2;	//减小
//lcd管脚定义
sbit RS = P2^6;
sbit EN = P2^7;
sbit RW=P2^5;

#define LCD1602_DATAPORT P0	

u16 sum,KEY,i;
int hour,minute,second;

u8 code xin[]="2022-07-24";
u8 code xg[]="Clock";

//延迟函数
void delay_ms(u16 ms)
{
    u16 i,j;
	for(i=ms;i>0;i--)
	    for(j=110;j>0;j--);
}
void delay_10us(u16 i)
{
    while(i--);
}

//液晶显示器1602A

//写命令
void write_com(u8 com)
{
    EN = 0;
	RS = 0;
	RW=0;
	LCD1602_DATAPORT = com;
	delay_ms(1);
	EN = 1;
	delay_ms(1);
	EN = 0;
}
//写数据
void write_dat(u8 dat)
{
    EN = 0;
	RS = 1;
	RW=0;
	LCD1602_DATAPORT = dat;
	delay_ms(1);
	EN = 1;
	delay_ms(1);
	EN = 0;
}
//写时分秒函数
void write_sfm(u8 add,u8 dat)
{
    u8 a,b;
	a=dat/10;
	b=dat%10;

	write_com(0x80+0x40+add);
	write_dat(0x30+a);
	write_dat(0x30+b);
}
//初始化
void init(void)
{
    sum=0;
	KEY=0;
    hour=0;
	minute=0;
	second=0;
	//对lcd1602初始化
	write_com(0x38);
	write_com(0x0c);
	write_com(0x06);
	write_com(0x01);

    //颜文字
	write_com(0x80+1);
	write_dat(0x6f);
	write_com(0x80+2);
	write_dat(0x5f);
	write_com(0x80+3);
	write_dat(0x6f);
	//日期
	write_com(0x80+5);
	for(i=0;i<10;i++)
	{
	     write_dat(xin[i]);
	}
	//冒号
	write_com(0x80+0x40+2);
	write_dat(':');
	write_com(0x80+0x40+5);
	write_dat(':');
    //英文字母
	write_com(0x80+0x40+9);
	for(i=0;i<5;i++)
	{
			write_dat(xg[i]);
	}
    //对定时器0初始化
	TMOD |= 0xF0;		//设置定时器模式
	TL0 = 0x00;		//设置定时初始值
	TH0 = 0x4C;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	EA = 1;
	ET0 = 1;
}
//定义按键
void keycon()
{
   if(K1==0)
   {
       delay_ms(10);
	   if(K1==0)
	   {
		    KEY++;
			while(!K1);
			//等待释放按键
			if(KEY==1)
			{
				TR0 = 0;
				write_com(0x80+0x40+6);//移动到秒
				write_com(0x0f);
			}
			if(KEY==2)
			{
				write_com(0x80+0x40+3);//移动到分
				write_com(0x0f);
			}
			if(KEY==3)
			{
				write_com(0x80+0x40);//移动到小时
				write_com(0x0f);
			}
			if(KEY==4)
			{			
				KEY = 0;
				write_com(0x0c);
				TR0 = 1;
			}
	   }
   }
   if(KEY!=0)
   {
        if(K2==0)
		{
		     delay_ms(10);
			 if(K2==0)
			 {
			      while(!K2);
				  if(KEY==1)
				  {
				      second++;
					  if(second==60)
					       second=0;
					  write_sfm(6,second);
					  write_com(0x80+0x40+6);					  
				  }
				  if(KEY==2)
				  {
				      minute++;
					  if(minute==60)					  
					       minute=0;
					  write_sfm(3,minute);
					  write_com(0x80+0x40+3);					  
				  }
				  if(KEY==3)
				  {
				      hour++;
					  if(hour==24)
					       hour=0;
					  write_sfm(0,hour);
				      write_com(0x80+0x40);					  
				  }
			 }
		}
		if(K3==0)
		{
		     delay_ms(10);
		     if(K3==0)
			 {
			     while(!K3);
				 if(KEY==1)
				  {
				      second--;
					  if(second==-1)
					       second=59;
					  write_sfm(6,second);
				      write_com(0x80+0x40+6);					  
				  }
				  if(KEY==2)
				  {
				      minute--;
					  if(minute==-1)
			               minute=59;
					  write_sfm(3,minute);
				      write_com(0x80+0x40+3);					  
				  }
				  if(KEY==3)
				  {
				      hour--;
					  if(hour==-1)					  
					       hour=23;
				      write_sfm(0,hour);
					  write_com(0x80+0x40);					  
				  }
			 }
		}
   }
}
void main()
{
     init();
	 while(1)
	 {
		 keycon();

	 }

}
void init0() interrupt 1
{
	TL0 = 0x00;		//设置定时初始值
	TH0 = 0x4C;		//设置定时初始值
	sum++;
	if(sum==20)
	{
	    second++;
		sum=0;
		if(second==60)
		{
		     minute++;
			 second=0;
			 if(minute==60)
			 {
			      hour++;
				  minute=0;
				  if(hour==24)
				  {
				       hour=0;
				  }
				  write_sfm(0,hour);
			 }
			 write_sfm(3,minute);
		}
		write_sfm(6,second); 
	}
}

 

 

物联沃分享整理
物联沃-IOTWORD物联网 » C51单片机LCD1602时钟项目简易教程

发表评论