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

📄 workspace.c

📁 利用STC89C52制作一个万年历,文件包含原理图(Cadence-Allegro),PCB示意图及整个源程序,经调试可用,希望对于编程初学者有帮助.
💻 C
字号:

void	WORK0(void)
{	
	if(K3)
	{	
		DSFL = 0X04;			//转时钟设定模块
		STA = 0X01;
	}
	else
	{	
		T5SL++;					//5S定时
		if(T5SL>250)
		{	
			T5SL = 0;
			T5SH++;
			if(T5SH>4)
			{	
				T5SH = 0;
				DIS = 0;
			}
		}
		switch(DIS)				
		{		
			case 0:				//显示年份
				DSBUF1 = YEARH;
				DSBUF2 = YEARL;
				T1S++;
				if(T1S>250)
				{	
					T1S = 0;
					DIS = 1;
				}
				break;
			case 1:				//显示月、日
				DSBUF1 = MON;
				DSBUF2 = DAY;
				T1S++;
				if(T1S>250)
				{	
					T1S = 0;
					DIS = 2;
				}
				break;		
			default:			//显示时、分
				DSBUF1 = HOUR;
				DSBUF2 = MIN;
				break;
		}	
		STA = 0X00;
	}
}

//时钟设定模块

void	WORK1(void)
{	
	uchar temp,qw,bw,sw,gw,xx;
	switch(DW)
	{	
		case 0:
			DSBUF1 = YEARH;
			DSBUF2 = YEARL;
			break;
		case 1:
			DSBUF1 = MON;
			DSBUF2 = DAY;
			break;	
		default:
			DSBUF1 = HOUR;
			DSBUF2 = MIN;
			break;
		}
	if(DSFL&0X02)				//赋值变量送显缓,并取出闪烁位的值
	{	
		DSB_TEMP = DSBUF2;
	}
	else
	{	
		DSB_TEMP = DSBUF1;
	}
	if(DSFL&0X01)
	{	
		temp = DSB_TEMP&0X0F;
	}
	else
	{	
		temp = (DSB_TEMP&0XF0)>>4;
	}
	if(temp ==0)
	{	
		K2 = 0;					//闪烁位值0则清K2键
	}
	else if(temp ==9)
	{	
		K1 = 0;					//闪烁位值0则清K1键
	}
	switch(DW)
	{
		case 0:					//年挡位设置
			ADD_DEL();
			break;

/*****************月、日挡位设置*******************/

		case 1:				
			xx = DSFL&0X03;
			if(xx==0)					//千位闪?
			{	
				qw = (DSBUF1&0XF0)>>4;
				if(qw==1)				//千位上限为1
				{		
					K1 = 0;	
				}		
			}
			else if(xx==1)				//百位闪?	
			{
				qw = (DSBUF1&0XF0)>>4;
				bw = (DSBUF1&0X0F);
				if((qw==1)&(bw>=2))				//千位为1时,百位上限为2
				{		
					K1 = 0;
				}
		
			}
			else if(xx==2)				//十位闪?	
			{	
				sw = (DSBUF2&0XF0)>>4;
				if((MON==0X02)&(sw>=2))			//2月份(只有28天),十位上限为2
				{			
					K1 = 0;
				}
				else 
				{	
					if(sw>=3)			//其它,十位上限为3
					{		
						K1 = 0;
					}
				}

			}
			else						//个位闪
			{	
				sw = (DSBUF2&0XF0)>>4;
				gw = DSBUF2&0X0F;
				if((MON==0X02)&(sw==2)&(gw>=8)) //2月2X时,个位上限为8
				{	
					K1 = 0;
				}
				else if(((MON<8)&(MON^0==1))||((MON>=8)&(MON^0==0)))		//为1、3、5、7、8、10、12月份31天
				{	
					if((sw>=3)&(gw>=1))
					{	
						K1 = 0;
					}
				}
				else					//4、6、9、11
				{	
					if(sw>=3)
					{	
						K1 = 0;
					}
				}
			}	
			ADD_DEL();					//调用加减1子程序
			break;

/*****************时、分挡位设置******************/	
	
		default:			
			xx = DSFL&0X03;
			if(xx==0)					//千位闪?
			{	
				qw = (DSBUF1&0XF0)>>4;
				if(qw==2)				//千位上限为2
				{		
					K1 = 0;	
				}		
			}
			else if(xx==1)				//百位闪?	
			{
				qw = (DSBUF1&0XF0)>>4;
				bw = DSBUF1&0X0F;
				if((qw==2)&bw==3)				//千位为2时,百位上限为3
				{		
					K1 = 0;
				}
		
			}
			else if(xx==2)				//十位闪?	
			{
				sw = (DSBUF2&0XF0)>>4;
				if(sw==5)				//十位上限为5
				{		
					K1 = 0;
				}
			}	
			ADD_DEL();					//个位闪&调用加减1子程序
			break;
	}	
	if(K3)
	{	
		DSFL++;					//有K3键则闪烁位移位
		if(DSFL&0X08)			//赋值完?
		{	
			switch(DW)
			{	
				case 0:
					YEARH = DSBUF1;
					YEARL = DSBUF2;
					DW++;
					DSFL = 0X04;
					STA = 0X01;	
					break;
				case 1:
					MON = DSBUF1;
					DAY = DSBUF2;
					DW++;
					DSFL = 0X04;
					STA = 0X01;
					break;	
				default:
					HOUR = DSBUF1;
					MIN = DSBUF2;
					DW = 0;
					DSFL = 0X00;
					STA = 0X00;
					break;	
			}		
		}		
	}
	else
	{	
		STA = 0X01;				//保持时钟设定设置
		switch(DW)
		{	
			case 0:
				YEARH = DSBUF1;
				YEARL = DSBUF2;
				break;
			case 1:
				MON = DSBUF1;
				DAY = DSBUF2;
				break;	
			default:
				HOUR = DSBUF1;
				MIN = DSBUF2;
				break;
		}
	}
	
}	

/************加减1*****************/
void	ADD_DEL(void)
{	
	if(K1)
	{	
		if(DSFL&0X01)			//有K1键则闪烁位加1
		{	
			DSB_TEMP += 0X01;	
		}
		else
		{	
			DSB_TEMP += 0X10;
		}
	}
	if(K2)
	{	
		if(DSFL&0X01)			//有K2键则闪烁位减1
		{	
			DSB_TEMP -= 0X01;	
		}
		else
		{	
			DSB_TEMP -= 0X10;
		}
	}
	if(DSFL&0X02)				//改变数据后送回显缓
	{	
		DSBUF2 = DSB_TEMP;
	}
	else
	{	
		DSBUF1 = DSB_TEMP;
	}
}

⌨️ 快捷键说明

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