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

📄 clock.c

📁 一个c51的时钟事例程序
💻 C
字号:
#include <REGX52.H>

//==========变量定义===========
int data msAdd=0;//ms累加
char data dispCode[8]=0,timeNum[3]=0;//时间量的字形码//具体时间量
char data whatLed=7;//当前显示的数码管
int data i=0,j=0,k=0,stepAdd=0;//循环变量//时标变量
char data select=3,keyNum=0;//设置位指示//键号

//==========函数定义===========
void setDisp(void);//计算字形码
void runKey(void);//执行键盘功能

void main(void)
{

//==========T0/T1定时3ms/1ms==========
	EA=1;
	ET0=1;
	ET1=1;
	TMOD=0x11;
	TH0=0xfc;
	TL0=0x67;
	TH1=0xf5;
	TL1=0x33;
	TR0=1;
	TR1=1;
//=============================

	P2=0x7f;
	P3_6=1;
	P3_7=1;

	dispCode[6]=0xbf;//显示"-"

	while(1){;}

	return;
}

//==========时间/显示==========
void Disp(void) interrupt 1 using 1
{	
	bit data P2_H;
	char data P2_ALL;
		
	ET0=0;

	if(select==3)
	{
		if(msAdd==625)
		{
			msAdd=0;

//========循环彩灯闪烁=========
			if(P1==0x00)
			{
				P1=0xff;
			}
			else
			{
				P1>>=1;
			}

//=========时间累加============
			if(timeNum[0]==59)
			{
				timeNum[0]=0;

				if(timeNum[1]==59)
				{
					timeNum[1]=0;

					if(timeNum[2]==23)
					{
						timeNum[2]=0;
					}
					else
					{
						timeNum[2]++;
					}
				}
				else
				{
					timeNum[1]++;
				}
			}
			else
			{
				timeNum[0]++;
			}
		}
		else
		{
			msAdd++;
		}
	}

//=========按键识别============	
	if(P3_6==0||P3_7==0)
	{
		if(P3_6==0)
		{
			keyNum=P2+1;
			runKey();
		}
		else if(P3_7==0)
		{
			keyNum=P2+2;
			runKey();
		}
	}	
	
//=========上午/下午===========
	if(timeNum[2]>=12)
	{
		dispCode[7]=0x8c;//显示"P"
	}
	else
	{
		dispCode[7]=0x88;//显示"A"
	}

//==========拆字/显示==========
	i=2;
	for(j=5;j>=0;j-=2)
	{
		dispCode[j]=timeNum[i]/10;
		dispCode[j-1]=timeNum[i]-dispCode[j]*10;
		i--;
	}	
	setDisp();

//========循环显示数值=========
	P2_ALL=P2;
	P2_H=P2_0;
	P2=0xff;

	if(whatLed>0)
	{
		whatLed--;
	}
	else
	{
		whatLed=7;
	}
	P0=dispCode[whatLed];

//=========P2循环右移==========	
	P2_ALL=P2_ALL>>1;
	P2=P2_ALL;
	P2_7=P2_H;	
//=============================	

	TH0=0xfc;
	TL0=0x67;
	TR0=1;
	ET0=1;

	return;
}

//=========计算字形码==========
void setDisp()
{
	for(i=5;i>=0;i--)
	{
		switch(dispCode[i])
		{		
			case 0:dispCode[i]=0xc0;
				break;
			case 1:dispCode[i]=0xf9;
				break;
			case 2:dispCode[i]=0xa4;
				break;
			case 3:dispCode[i]=0xb0;
				break;
			case 4:dispCode[i]=0x99;
				break;
			case 5:dispCode[i]=0x92;
				break;
			case 6:dispCode[i]=0x82;
				break;
			case 7:dispCode[i]=0xf8;
				break;
			case 8:dispCode[i]=0x80;
				break;
			case 9:dispCode[i]=0x90;
				break;
			default:dispCode[i]=0xff;
		}
	}

	if(select!=3)
	{
		if(stepAdd>150)
		{
			dispCode[select*2]=0xff;
			dispCode[select*2+1]=0xff;
		}
	}

	dispCode[2]&=0x7f;
	dispCode[4]&=0x7f;

	return;
}

//========执行键盘功能=========
void runKey(void)
{
	switch(keyNum)
	{
		case 0x80:
		if(stepAdd%50==0)
		{
			if(select>0)
			{
				select--;
			}
			else
			{
				select=3;
			}
		}
			break;
		
		case 0xc0:
		if(stepAdd%50==0)
		{
			if(select!=3)
			{
				if(select!=0)
				{
					timeNum[select]++;
				}
				else if (timeNum[0]>=30)
				{
					timeNum[select]=0;
					timeNum[1]++;
				}
				else
				{
					timeNum[select]=0;
				}

				if (timeNum[1]==60){timeNum[select]=0;}
				if (timeNum[2]==24){timeNum[select]=0;}
			}
		}
		break;
	}

	return;
}

//=========辅助时标产生=========
void step(void) interrupt 3 using 2
{
	ET1=0;

	if(stepAdd<333)
	{
		stepAdd++;
	}
	else
	{
		stepAdd=0;
	}

	TH1=0xf5;
	TL1=0x33;
	TR1=1;
	ET1=1;

	return;
}
					

⌨️ 快捷键说明

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