51单片机——简易时钟

代码

#include"reg51.h"
#define lcd P0
typedef unsigned int u16;
typedef unsigned char u8;
sbit lcd_EN=P2^7;             //1602使能端
sbit lcd_RS=P2^6;             //1602数据指令端
sbit lcd_wr=P2^5;			  //读写端
sbit key1=P3^1;               
sbit key2=P3^0;
u8 date[]="  2020-03-08";
u8 time[]="   23:59:53 ";
u16 num;
u8 flag=0;
u8 sign=0;
u8 count=0;
u8 ge;
u8 shi;
u8 hour=0;
u8 fen=0;
u8 miao=0;
u16 temp=0;

void delay(u16 x)           //延时函数
{
	u16 j;
	while(x--)
		for(j=115;j>0;j--);
}

void tim0_init()            //定时器初始化函数
{
	EA=1;                   //中断总允许位
	ET0=1;                  //定时器中断允许位
	TMOD=0X01;              //定时器T0  方式1
	TH0=(65535-50000)/256;  
	TL0=(65535-50000)%256;
	TR0=1;                  //开启定时
}

void lcd_write_com(u8 com)  //lcd 指令函数
{
	lcd_RS=0;               //指令端
	lcd=com;            
	delay(4);
	lcd_EN=1;               //高脉冲
	delay(4);
	lcd_EN=0;
}

void lcd_write_date(u8 date)  //数据函数
{
	lcd_RS=1;               //数据端
	lcd=date;
	delay(4);
	lcd_EN=1;               //高脉冲
	delay(4);
	lcd_EN=0;
}

void lcd_init()             //lcd初始化函数
{
	lcd_wr=0;
	lcd_EN=0;
	lcd_write_com(0x38);    //开启显示
	lcd_write_com(0x01);    //清屏
	lcd_write_com(0x0c);    //不显示光标
	lcd_write_com(0x06); 	//移动
	
	lcd_write_com(0x80);
	for(num=0;num<12;num++)
	{
		lcd_write_date(date[num]);
		delay(4);
	}
	lcd_write_com(0x80+0x40);
	for(num=0;num<12;num++)
	{
		lcd_write_date(time[num]);
		delay(4);
	}
}

void sfm()           
{
	 if(sign==1)
	 {
		flag=1;
		sign=0;
		 miao++;
		 if(miao>=60)
		 {
			miao-=60;
			fen++;
			if(fen>=60)
			{
				hour++;
				fen-=60;
				if(hour>=24)
					hour-=24;
			}
		 }
	 }
}

void key_scan()
{
	if(key1==0)
	{
		delay(3);
		if(key1==0)
		{
			temp++;
			while(!key1);
			TR0=0;
			if(temp==1)
			{
				lcd_write_com(0x0f);
				lcd_write_com(0x80+0x40+10);				
			}
			if(temp==2)
				lcd_write_com(0x80+0x40+7);
				lcd_write_com(0x0f);
			if(temp==3)
				lcd_write_com(0x80+0x40+4);
				lcd_write_com(0x0f);
			if(temp==4)
			{
				temp=0;
				lcd_write_com(0x0c);
				TR0=1;
			}
		}
	}
}

void time_display(hour,fen,miao)
{
	if(flag==1)
	{
		ge=hour%10;
		shi=hour/10;
		lcd_write_com(0x80+0x40+4);
		lcd_write_date(0x30+ge);
		lcd_write_com(0x80+0x40+3);
		lcd_write_date(0x30+shi);

		ge=fen%10;
		shi=fen/10;
		lcd_write_com(0x80+0x40+7);
		lcd_write_date(0x30+ge);
		lcd_write_com(0x80+0x40+6);
		lcd_write_date(0x30+shi);

		ge=miao%10;
		shi=miao/10;
		lcd_write_com(0x80+0x40+10);
		lcd_write_date(0x30+ge);
		lcd_write_com(0x80+0x40+9);
		lcd_write_date(0x30+shi);
		flag=0;
		switch(temp)
		{
			case(1):lcd_write_com(0x80+0x40+10);break;
			case(2):lcd_write_com(0x80+0x40+7);break;
			case(3):lcd_write_com(0x80+0x40+4);break;
			case(0):lcd_write_com(0x0c);break;
		}
	}
}
	
void time_init()
{
	if(key2==0)
	{
		delay(4);
		if(key2==0)
		{
			while(!key2);
			if(temp==1)
			{
				miao++;
				if(miao==60)
				{
					miao=0;
					fen++;
					if(fen==60)
					{
					fen=0;
					hour++;
					}
				}
			}
			if(temp==2)
			{
				fen++;
				if(fen==60)
				{
					fen=0;
					hour++;
					if(hour>=24)
					hour-=24;
				}
			}
			if(temp==3)
			{
				hour++;
				if(hour>=24)
					hour-=24;
			}
			flag=1;
		}
	}

}

void main()
{
	lcd_init();
	tim0_init(); 
	while(1)
	{
		sfm();
		time_display(hour,fen,miao);
		time_init();
		key_scan();
	}
}

void tim() interrupt 1
{
	count++;
	if(count==18)
	{
		sign=1;
		count=0;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值