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

📄 fun.c

📁 基于AT89C51的电子万年历
💻 C
字号:
//文件名:fun.c
//文件包括:液晶模块的初始化子程序,写命令子程序,写数据子程序,按键扫描子程序,延时子程序,刷新时间子程序


//头文件
#include<config.h>


//延时1ms子程序程序
void Delay(uchar z)
{
	uchar x,y;
	for(x=z;x>0;x--)
		for(y=100;y>0;y--);
}


//写命令子程序
void Write_com(uchar com)
{
	RS=0;
	RW=0;
	Lcd_en=0;
	P0=com;
	Delay(5);
	Lcd_en=1;
	Delay(5);
	Lcd_en=0;
}


//写数据子程序
void Write_data(uchar dat)
{
	RS=1;
	RW=0;
	Lcd_en=0;
	P0=dat;
	Delay(5);
	Lcd_en=1;
	Delay(5);
	Lcd_en=0;	
}

/*
//读数据子程序
char Read_Data(void)
{
    RS=1; 
    RW=1;
	Lcd_en=0;
	Delay(5);
	Lcd_en=1;
	Lcd_data=P0;
	return(Lcd_data);
}
*/

//初始化子程序
//将开机要显示的内容和某些寄存器的处置全部初始化
void Initiate(void)
{
	num=0;
	temp=0;	
//	uchar t;
	year=2008;
	mon=5;
	day=9;
	we=5;
	hour=8;
	min=50;
	sec=00;
	SET_flag=0;
	Lcd_en=0;
	Write_com(0x38);			//设置显示模式
	Write_com(0x0c);			//开显示,不显示光标
	Write_com(0x06);			//设置地址指针移动方式,每写一个字符后地址指针加1
	Write_com(0x01);			//显示清零,必须清零,否则液晶屏上会显示黑块
	Write_com(0x80);	 		//设置数据地址指针为第一行
	for(t=0;t<16;t++)
	{
		Write_data(table[t]);	//显示液晶第一行
		Delay(5);
	}
	Write_com(0x80+0x40);		//设置数据地址指针为第二行
	for(t=0;t<16;t++)
	{
		Write_data(table1[t]);	//显示液晶第二行
		Delay(5);				
	}	
	TMOD=0x01;
	TH0=(65536-50000)/256;		//定时器计数器定时50ms
	TL0=(65536-50000)%256;	
	EA=1;
	ET0=1;	
	TR0=1;	
}


//刷新时间子程序
void Write_Time(uchar add,uchar dat)
{
	uchar shi,ge;
	shi=dat/10;
	ge=dat%10;
	Write_com(0x80+0x40+add);	//设置数据地址指针
	Write_data(0x30+shi);		//刷新时间的十位
	Write_data(0x30+ge);		//刷新时间的个位
}


//刷新日期子程序
void Write_Date(uchar add,uchar dat)
{
	uchar shi,ge;
	shi=dat/10;
	ge=dat%10;
	Write_com(0x80+add);		//设置数据地址指针
	Write_data(0x30+shi);		//刷新日期的十位
	Write_data(0x30+ge);		//刷新日期的个位
}


//刷新年子程序
void Write_Year(uchar add,int dat)
{
	uchar qian,bai,shi,ge;
	qian=dat/1000;
	bai=dat/100%10;
	shi=dat/10%10;
	ge=dat%10;
	Write_com(0x80+add);		//设置数据地址指针
	Write_data(0x30+qian);		//刷新日期的十位
	Write_data(0x30+bai);		//刷新日期的个位
	Write_data(0x30+shi);		//刷新日期的十位
	Write_data(0x30+ge);		//刷新日期的个位
		
}
//键盘扫描子程序
void Key_scan(void)
{
	if(SET==0)
	{
		Delay(5);
		if(SET==0)
		{
			while(!SET);
			SET_flag=1;
			temp++;
			if(temp==8)
			{
				temp=0;
				SET_flag=0;
				Write_com(0x0c);			//光标不再闪烁
			}			
		}
	}
}


//
void Key_process(void)
{
	TR0=0;
//	Key_scan();
	switch(temp)
	{
		case 1:					
				Write_com(0x80+0x40+9);		//设置数据地址指针到秒钟的位置
				Write_com(0x0f);
				Up_key();
				Down_key();
				break;
		case 2:	
				Write_com(0x80+0x40+6);		//设置数据地址指针到分钟的位置
				Up_key();
				Down_key();
				break;
		case 3: 
				Write_com(0x80+0x40+3);		//设置数据地址指针到时钟的位置
				Up_key();
				Down_key();
				break;
		case 4: 
				Write_com(0x80+15);			//设置数据地址指针到星期的位置
				Up_key();
				Down_key();
				break;
		case 5:					
				Write_com(0x80+11);			//设置数据地址指针到日的位置
				Up_key();
				Down_key();
				break;
		case 6:	
				Write_com(0x80+8);			//设置数据地址指针到月的位置
				Up_key();
				Down_key();
				break;
		case 7: 
				Write_com(0x80+3);			//设置数据地址指针到年的位置
				Up_key();
				Down_key();
				break;

		default:break;
	}
	TR0=1;
}


//加调节键按键扫描程序
void Up_key(void)
{
	if(value_up==0)
	{
		Delay(5);
		if(value_up==0)
		{
			while(!value_up);
			switch(temp)
			{
				case 1:
//						Write_com(0x80+9);
//						sec=Read_Data();						
						sec++;
						if(sec==60)
							sec=0;
						Write_Time(9,sec);
						Write_com(0x80+0x40+9);
						break;
				case 2:
						min++;
						if(min==60)
							min=0;
						Write_Time(6,min);
						Write_com(0x80+0x40+6);
						break;
				case 3:
						hour++;
						if(hour==24)
							hour=0;
						Write_Time(3,hour);
						Write_com(0x80+0x40+3);
						break;
				case 4:
						we++;
						if(we==8)
							we=1;
						Write_com(0x80+15);
						Write_data(0x30+we);
						break;
				case 5:
						day++;
						if(day==31)
							day=1;
						Write_Date(11,day);
						Write_com(0x80+11);
						break;
				case 6:
						mon++;
						if(mon==12)
							mon=0;
						Write_Date(8,mon);
						Write_com(0x80+8);
						break;
				case 7:
						year++;
						if(year==10000)
							year=0000;
						Write_Year(3,year);	
						break;
				default:break;
			}
		}
	}
}


//减调节键按键扫描程序
void Down_key(void)
{
	if(value_down==0)
	{
		Delay(5);
		if(value_down==0)
		{
			while(!value_down);
			switch(temp)
			{
				case 1:
						sec--;
						if(sec==-1)
							sec=59;
						Write_Time(9,sec);
						Write_com(0x80+0x40+9);
						break;
				case 2:		
						min--;
						if(min==-1)
							min=59;
						Write_Time(6,min);
						Write_com(0x80+0x40+6);
						break;
				case 3:
						hour--;
						if(hour==-1)
							hour=23;
						Write_Time(3,hour);
						Write_com(0x80+0x40+3);
						break;
				case 4:
						we--;
						if(we==-1)
							we=7;
						Write_com(0x80+15);
						Write_data(0x30+we);
						break;
				case 5:
						day--;
						if(day==-1)
							day=31;
						Write_Date(11,day);
						Write_com(0x80+11);
						break;
				case 6:
						mon--;
						if(mon==-1)
							mon=12;
						Write_Date(8,mon);
						Write_com(0x80+8);
						break;
				case 7:
						year--;
						if(year==-1)
							year=9999;
						Write_Year(3,year);	
						break;
				default:break;
			}
		}
	}	
}


/*
void Key_scan(void)
{
	if(SET==0)
	{
		Delay(5);
		if(SET==0)
		{
			temp++;
			while(!SET);									
			if(temp==1)
			{
				TR0=0;						//当功能键有效时,定时器计数器停止计数
				Write_com(0x80+0x40+9);		//设置数据地址指针到秒钟的位置
				Write_com(0x0f);
			}
			if(temp==2)
			{
				Write_com(0x80+0x40+6);		//设置数据地址指针到分钟的位置
			}
			if(temp==3)
			{
				Write_com(0x80+0x40+3);		//设置数据地址指针到时钟的位置				
			}
			if(temp==4)
			{
				temp=0;
				Write_com(0x0c);			//光标不再闪烁
				TR0=1;
			}
		}
	}
	if(temp!=0)
	{
		if(value_up==0)
		{
			Delay(5);
			if(value_up==0)
			{
				while(!value_up);
				if(temp==1)
				{
					sec++;
					if(sec==60)
						sec=0;
					Write_Time(9,sec);
					Write_com(0x80+0x40+9);
				}
				if(temp==2)
				{
					min++;
					if(min==60)
						min=0;
					Write_Time(6,min);
					Write_com(0x80+0x40+6);
				}
				if(temp==3)
				{
					hour++;
					if(hour==24)
						hour=0;
					Write_Time(3,hour);
					Write_com(0x80+0x40+3);
				}
			}
		}
		if(value_down==0)
		{
			Delay(5);
			if(value_down==0)
			{
				while(!value_down);
				if(temp==1)
				{
					sec--;
					if(sec==-1)
						sec=59;
					Write_Time(9,sec);
					Write_com(0x80+0x40+9);
				}
				if(temp==2)
				{
					min--;
					if(min==-1)
						min=59;
					Write_Time(6,min);
					Write_com(0x80+0x40+6);
				}
				if(temp==3)
				{
					hour--;
					if(hour==-1)
						hour=23;
					Write_Time(3,hour);
					Write_com(0x80+0x40+3);
				}
			}
		}
	}
}
*/

⌨️ 快捷键说明

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