51单片机-1602液晶显示的时钟代码

   单片机小白,初学单片机,利用51单片机简单的编写了基于1602显示的时钟程序,技术不好,可能会有许多不好的地方,希望大神指正

基本功能:时钟显示,利用按键调时,分

#include
#define uint unsigned int
#define uchar unsigned char
sbit en=P3^4;
sbit rs=P3^5;
sbit rw=P3^6;
sbit s2=P3^0;
sbit s3=P3^1;
sbit s4=P3^2;
sbit s5=P3^3;
uchar shi,fen,miao,num,num1=0,num2=0,num3=0,flag;
void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}
void busy()
{
	uchar busy;
	P0=0xff;
	rs=0;
	rw=1;
	do
	{
		en=1;
		busy=P0;
		en=0;

	}while(busy & 0x80);//取最高位

}
void write_com(uchar com)
{
	busy();
	rs=0;
	rw=0;
	P0=com;
	en=1;
	en=0;
}
void write_date(uchar date)
{
	busy();
	rs=1;
	rw=0;
	P0=date;
	en=1;
	en=0;
}
void display(uchar num,weizhi)
{
	uchar shi,ge;
	shi=num/10;
	ge=num%10;
	write_com(0x80+0x03+weizhi);
	write_date(0x30+shi);
	write_date(0x30+ge);
}
void init()
{
	write_com(0x38);
	write_com(0x0c);
	write_com(0x06);
	write_com(0x01);//清屏
	write_com(0x80|0x07);
	write_date(':');
	write_com(0x80|0x0a);
	write_date(':');
	display(0,2);
	display(0,5);
	display(0,8);
	TMOD=0x01;
	TH0=(65536-45872)/256;
	TL0=(65536-45872)%256;
	EA=1;
	ET0=1;
	TR0=0;	
}
void keyscan()
{
	if(s5==0)
	{
		delay(10);
		if(s5==0)
		{
			while(!s5);
			TR0=~TR0;
		}
	}
	if(s3==0)
	{
		delay(10);
		if(s3==0)
		{
			num2++;
			if(num2==60)
				num2=0;
				display(num2,5);
				while(!s3);	
		}			   
	}
	if(s2==0)
	{
		delay(10);
		if(s2==0)
		{
		num3++;
		if(num3==24)
			num3=0;
			display(num3,2);
			while(!s2);
		}
	}
}  
void main()
{
	init();
	while(1)
	{
		keyscan();
	}
}
void time0() interrupt 1
{
	TH0=(65536-45872)/256;
	TL0=(65536-45872)%256;
	num++;
	if(num==20)
	{
		num=0;
		num1++;
	}
	display(num1,8);
	if(num1==60)
		{
			num1=0;
			num2++;
			if(num2==60)
			{
				num2=0;
				num3++;
				if(num3==24)
				{
					num3=0;
				}
					display(num3,2);
			}
				display(num2,5);
		}
}

你可能感兴趣的:(51单片机-1602液晶显示的时钟代码)