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

📄 disk.c

📁 万年历C语言
💻 C
字号:
/*-------------------------------------
程序功能:万年历
硬件连接:输出(PO连接J3,P1.0连接位码,P1.1连接段码)
		 独立按键输入(P2连接K1--8,但是只用到了端口低位4个)
--------------------------------------*/


#include<reg52.h>
#define uint unsigned int
#define	uchar unsigned char
#define ulong unsigned long
#define	InPut P2
#define DataOut	P0

sbit SegDat=P1^0;
sbit SegCs=P1^1;

ulong JBit;
uint KeyData,CsCount,JChoose,i;
uint TimeCount,SecondData,MinuteData,HourData;DayData,MonthData,YearDataL,YearDataH;
bit JDisplay;

uint ReadKey();


DisplayData [8];
CsData [9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x67};

uchar   code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
			 			   /*0	   1    2    3    4    5    6    7    8    9    共阴*/

//*****时间模式*****
TimeDisplay()	
{DisplayData [0]=tab[HourData/10];
 DisplayData [1]=tab[HourData%10];
 DisplayData [2]=0x40;
 DisplayData [3]=tab[MinuteData/10];
 DisplayData [4]=tab[MinuteData%10];
 DisplayData [5]=0x40;
 DisplayData [6]=tab[SecondData/10];
 DisplayData [7]=tab[SecondData%10];		//送入显示数据
 if(JChoose==1)								//小时修改
 	{if(KeyData==0xfb)
	 	{KeyData=0xff,HourData++;}
	 if(KeyData==0xf7)
	 	{KeyData=0xff,HourData--;}
	
	 if(SecondData%2==0)				//光标闪烁
	 {DisplayData [0]=0x00;
	  DisplayData [1]=0x00;}
	}
 else if(JChoose==2)						//分钟修改
 	{if(KeyData==0xfb)
	 	{KeyData=0xff,MinuteData++;}
	 if(KeyData==0xf7)
	 	{KeyData=0xff,MinuteData--;}
	
	 if(SecondData%2==0)				//光标闪烁
	 {DisplayData [3]=0x00;
	  DisplayData [4]=0x00;}
	}
 else JChoose=0;
}
//*****日期模式*****
DateDisplay()
{DisplayData [0]=tab[2];
 DisplayData [1]=tab[0];
 DisplayData [2]=tab[YearDataL/10];
 DisplayData [3]=tab[YearDataL%10];
 DisplayData [4]=tab[MonthData/10];
 DisplayData [5]=tab[MonthData%10];
 DisplayData [6]=tab[DayData/10];
 DisplayData [7]=tab[DayData%10];		//送入显示数据
 if(JChoose==1)							//年份修改
 	{if(KeyData==0xfb)
	 	{KeyData=0xff,YearDataL++;}
	 if(KeyData==0xf7)
	 	{KeyData=0xff,YearDataL--;}
	
	 if(SecondData%2==0)
	 {DisplayData [0]=0x00;
	  DisplayData [1]=0x00;
	  DisplayData [2]=0x00;
	  DisplayData [3]=0x00;}
	}
 else if(JChoose==2)					//月份修改
 	{if(KeyData==0xfb)
	 	{KeyData=0xff,MonthData++;}
	 if(KeyData==0xf7)
	 	{KeyData=0xff,MonthData--;}
	
	 if(SecondData%2==0)
	 {DisplayData [4]=0x00;
	  DisplayData [5]=0x00;}
	}
 else if(JChoose==3)					//日期修改
 	{if(KeyData==0xfb)
	 	{KeyData=0xff,DayData++;}
	 if(KeyData==0xf7)
	 	{KeyData=0xff,DayData--;}
	
	 if(SecondData%2==0)
	 {DisplayData [6]=0x00;
	  DisplayData [7]=0x00;}
	}
 else JChoose=0;
}

//////////菜单判断系统////////////////
DisplaySystem()
{	if(KeyData==0xfe)		//判断菜单按键
	{JDisplay=~JDisplay;
	 KeyData=0xff;}
	else if(KeyData==0xfd)		//判断修改按键
	{JChoose++;
	 KeyData=0xff;}
	else;

	if(JDisplay==0)
		{TimeDisplay();}		//时间模式
	else
		{DateDisplay();}		//日期模式
}


////////时间判断系统////////////////
HourSystem()	//小时判断
{	if(SecondData==60)
		{SecondData=0;
		 MinuteData++;}
	else if(SecondData>60)
		{SecondData=0;}
	else;
	
	if(MinuteData==60)
		{MinuteData=0;
		 HourData++;}
	else if(MinuteData>60)
		{MinuteData=0;}
	else;
	
	if(HourData>24)
		{HourData=0;
		 DayData++;}
	else;
}

/////////////日期判断系统///////////
DaySystem()
{	if(MonthData<7&MonthData>0)		//1~7月
		{if(MonthData==2)		//2月	
			{if(YearDataL%4==0)		//润年
			 	{if(DayData>29)
					{DayData=1;
					 MonthData++;}
				 else if(DayData==0)
				 	{DayData=1;}
				 else;
				}
			 else					//平年	
			 	{if(DayData>28)
					{DayData=1;
					 MonthData++;}
				 else if(DayData==0)
				 	{DayData=1;}
				 else;
				}
			}
		

		 if(MonthData%2==0&MonthData!=2)		//小月
		 	{if(DayData>30)
				{DayData=1;
				MonthData++;}
			 else if(DayData==0)
				 	{DayData=1;}
			 else;		
			}
		 else					//大月
		 	{if(DayData>31)
				{DayData=1;
				MonthData++;}
			 else if(DayData==0)
				 	{DayData=1;}
			 else;
			}
		}


	else if(MonthData>=7&MonthData<=12)//8~12月	
		{if(MonthData%2==0)				//大月
			{if(DayData>31)
				{DayData=1;
				MonthData++;}
			 else if(DayData==0)
				 	{DayData=1;}
			 else;
			}

		 else							//小月
		 	{if(DayData>30)
				{DayData=1;
				MonthData++;}
			 else if(DayData==0)
				 	{DayData=1;}
			 else;
			}
		
		}
	else if(MonthData==13)		//月份进位
		{MonthData=1;
		 YearDataL++;}
	else {MonthData=1;}//超出范围
}

///////////年份判断系统/////////////
YearSystem()
	{if(YearDataL>50)
	 	{YearDataL=50;}
	 else if(YearDataL<0)
	 	{YearDataL=0;}
	 else ;
	}
///////////按键////////////
KeyScan()
{	if(ReadKey()!=0xff)
		{JBit++;
		 if(JBit==10)				//短按防抖
			{KeyData=ReadKey();}
		 else if(JBit%50==0)		//长按加1
		 	{KeyData=ReadKey();}
		 else; 
		}
	else {JBit=0;}
}

uint ReadKey()						//键值读取
{	uint tempkey;
	InPut=0xff;
	tempkey=InPut;
	return (tempkey);
}
//*****显示
Display()
{	while(CsCount<8)
		{	DataOut=DisplayData[CsCount];	//送数据
			SegDat=1;
			SegDat=0;
			
			DataOut=CsData[CsCount];		//送位码
			SegCs=1;
			SegCs=0;
			
			for(i=0;i<100;i++);			//循环写入

			DataOut=0xff;				
			SegCs=1;
			SegCs=0;
			CsCount++;
		 		
		}
	CsCount=0;		
}


main()
{  	TMOD=0x01;
	TH0=(65539-50000)/256;
	TL0=(65539-50000)%256;
	EA=1;
	ET0=1;
	TR0=1;	
//*****************************
	while(1)
 		{HourSystem();
 		 DaySystem();
 		 YearSystem();
 		 KeyScan();
 		 DisplaySystem();
		 Display();
		 }
}
////////定时中断///////////////
void Time() interrupt 1 
{	TH0=(65536-50000)/256;
  	TL0=(65536-50000)%256;
	TimeCount++;
	if(TimeCount==20)
		{SecondData++;
		 TimeCount=0;}
	else;
}

⌨️ 快捷键说明

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