⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clok.c

📁 51单片机驱动控制1602显示时钟C语言源程序
💻 C
字号:
#include<reg52.h>

#define uchar unsigned char 
#define uint unsigned int

sbit rs=P2^7;
sbit rw	=P2^6;
sbit lcden=P2^5; 

sbit timeadj=P3^5;
sbit timeadd=P3^4;
sbit timedec=P3^3;
uchar pushnum;	
static char count,sec,min,hou;

uchar code table1[]= "TIME   08-03-20";
uchar code table2[]= "    00:00:00  ";
					 
void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}

void write_com(uchar com)
{
	rs=0;
	rw=0;
	lcden=0;
	P0=com;
	delay(5);
	lcden=1;
	delay(5);		
	lcden=0;	
}

void write_date(uchar date)
{
	rs=1;
	rw=0;
	lcden=0;
	P0=date;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;	
}

void init()
{
	uchar num;
	lcden=0;
	min=00;
	sec=00;
	hou=00;
	write_com(0x38);  //设置显示模式:数据总线长度8,两行,5*7字体
	delay(5);
	write_com(0x0c);  //显示开关设置:显示状态开,光标不显示,不闪烁
	delay(5);
	write_com(0x06);  //设置输入方式:光标右移一格,AC加一,字符不动
	delay(5);
	write_com(0x01);  //清屏
	delay(5);
	write_com(0x80);  //DDRAM7位地址设置:初始地址设为0x00
	delay(5);

	for(num=0;num<15;num++)
		{
			write_date(table1[num]);
			delay(5);
		}

	write_com(0x80+0x40);

	for(num=0;num<14;num++)
		{
			write_date(table2[num]);
			delay(5);
		}

	TMOD=0x01;
	TH0=0x4C;
	TL0=0x00;
	EA=1;
	ET0=1;
	TR0=1;	  
		 
}


void update_time(uchar LEDadd_num,uchar time)
{
	uchar shi,ge;
	shi=time/10;
	ge=time%10;
	write_com(0x80+0x40+LEDadd_num);
	write_date(0x30+shi);
	write_date(0x30+ge);
}

void keyscan()
{
	if(timeadj==0)	
	{
		delay(5);
		if(timeadj==0)
		{	
			while(!timeadj);
			pushnum++;
			switch(pushnum)
			{
			case 1:
				TR0=0;
				write_com(0x80+0x40+10); //地址指针在秒的十位
				write_com(0x0f);//光标显示并闪烁(在当前地址的下一位)
				break;
			case 2:
				write_com(0x80+0x40+7);//地址指针在分的十位
				break;
			case 3:
				write_com(0x80+0x40+4);
				break;
			case 4:
				pushnum=0;
				write_com(0x0c);//关闭光标显示和闪烁
				TR0=1;
				break;
			}		
		}
	}
		

	if(pushnum!=0)
		{
		if(timeadd==0)
			{
				delay(5);
				if(timeadd==0)
				{
					while(!timeadd);
					if(pushnum==1)
					{
						if(sec==59)
							sec=-1;
						sec++;		 //加后为0
						update_time(10,sec);
						write_com(0x80+0x40+10);	
					}
					if(pushnum==2)
					{
						if(min==59)
							min=-1;
						min++;
						update_time(7,min);
						write_com(0x80+0x40+7);
					}
					if(pushnum==3)
					{
						if(hou==23)
							hou=-1;
						hou++;
						update_time(4,hou);
						write_com(0x80+0x40+4);
					}
				}
			}
		if(timedec==0)
			{						
				delay(5);
				if(timedec==0)
				{
					while (! timedec );
					if(pushnum==1)
					{
					/*	if(sec==0)
						{
							sec=59;
							update_time(10,sec);
							write_com(0x80+0x40+10);
						 }
					*/
						if(sec==0)
							sec=60;
						sec--;	 //减后为59
						update_time(10,sec);
						write_com(0x80+0x40+10);
					
					}
					if(pushnum==2)
					{
						
						if(min==0)
							min=60;
						min--;
						update_time(7,min);
						write_com(0x80+0x40+7);
					}
					if(pushnum==3)
					{
						if(hou==0)
							hou=24;
				        hou--;
						update_time(4,hou);
						write_com(0x80+0x40+4);
					}
				}
			}
		}
}

void main()
{
	init();
	while(1)
	{
		if(count==20)
				{
					count=0;
					sec++;
					if(sec==60)
					{
						sec=0;
						min++;
						if(min==60)
						{
							min=0;
							hou++;
							if(hou==24)
								hou=0;
							update_time(4,hou);//时判断完后,送液晶刷新显示
						}
						update_time(7,min);	   //分判断完后,送液晶刷新显示
					}
					update_time(10,sec);	   //秒判断完后,送液晶刷新显示
					
				}		 
		keyscan();		
	}
}

void timer0() interrupt 1
{
	TH0=0x4C;
	TL0=0x00;
	count++;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -