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

📄 time.c

📁 可位调并显示位调的电子时钟
💻 C
字号:
#include <AT89X51.h>

unsigned char tc;								//软件延时单元
bit flag1=0;									//秒标志
unsigned char data dispbit,dispbuf[4],m[5];	//显示位,显示缓冲区
code unsigned char ds=0x14; 				//软件延时系数__20
unsigned char second,minute,hour,b=0,a;		//秒,分,时

void delay (unsigned int count); 		//延时函数
void display(void);              //显示函数
void key(void);						//键处理函数
void sx(void);							//送显示函数

void main(void)						//主函数
{
unsigned char i;

TMOD=0x01;								//定时器初始化
TH0=0x4C;
TL0=0x00;
IE=0x82;									//开放定时器0中断
tc=ds;									//软件延时初值
TR0=1;									//启动定时器
P1_0=0;

do{
	key();								//键处理
	sx();
	for(i=0;i<4;i++)
	display();							//显示
	if(flag1==1)						//有秒标志
	{
			flag1=0;						//秒标志清零
			P1_0=0;						//LED亮
			second++;					//秒加一
			if (second==60) 
			{
				second=0;
				minute++;				//分加一
				if (minute==60)
				{
				hour++;					//时加一
				minute=0;
				if (hour==24) hour=0;
				}
			}
		sx();									//送显示
	}
   }while(1);
}

void timer0(void) interrupt 1			//定时器0中断服务函数
{
	TH0=0x4C;								//再送定时初值
	tc--;										//软件延时计数
	if(tc==0x0a) P1_0=1;					//LED灭
	if (tc==0)								//中断20次
 		{
		 tc=ds;								//再设软件延时初值
		 flag1=1;							//建秒标志
		 }
}

void display(void)					//显示函数
{
	code unsigned char design[32]={0x5F,0x44,0x3D,0x6D,0x66,0x6B,0x7B,0x45,
        			      		   	 0x7F,0x6F,0x00,0x77,0x7A,0x1B,0x7C,0x3B,0x33,
        						   		 0xDF,0xC4,0xBD,0xED,0xE6,0xEB,0xFB,0xC5,
        						   		 0xEF,0x76,0x1A,0x37,0x00,0x20,0x6E};
											//字型码表
	unsigned char i;
	dispbit=0x08;						//字位初值

	for(i=0;i<4;i++)					//扫描4位数码显示器
	{
		P0=design[dispbuf[i]];		//转换字型并输出
		P2=dispbit;						//输出字位
		dispbit=dispbit+dispbit;	//字位左移
		delay (1);						//延时
	}
}

void key(void)
{
	unsigned char keycode,k1,m[5];
	k1=~(P3)&0x30;					//读键
	if ( k1 != 0) 					//有键按下
		{
			IE=0x00;					//关中断
			delay (30);				//延时
			keycode=~(P3)&0x30;	//读键码
			do							//等待键释放 
			{
			k1=~(P3)&0x30;
			}
			while (k1!=0);
	
			switch (keycode)		
			{
				case 0x10:			//P3.4键,分加一
				{
			//	minute++;
			//	if (minute==60) minute=0;
                m[a]++;
				if(m[1]==3)
				   m[1]=0;
				if(m[2]==10)
				   m[2]=0; 
  				   if(m[3]==6)
				   m[3]=0;
				   m[4]=m[4]%10;
                minute=m[3]*10+m[4];
                  hour=m[1]*10+m[2];
				  if (hour>23) 
                   { hour=0;
                     m[2]=0;
					 m[1]=0;}
                if (minute==60)
                   minute=0;
				};
				break;
				case 0x20:			//P3.5键,时加一
				{ a=a+1;
                 if(a==5)
                   a=0;
			//	hour++;
			/*	if (hour==24) 
                    hour=0;
                if (minute==60)
                   minute=0;*/
				};
			}
			sx();						//送显示
			IE=0x82;					//开中断
		 }
}

void delay (unsigned int count)//延时函数
{
	unsigned int i,j;
	for (i=0;i<count;i++)
		for (j=0;j<120;j++);
}

void sx (void)						//送显示函数
{       
		dispbuf[3]=minute%10;	//分个位
		dispbuf[2]=minute/10;	//分十位
		dispbuf[1]=hour%10;		//时个位
		dispbuf[0]=hour/10; 	//时十位
		b++;
		if(b<5)
		dispbuf[a-1]=10 ;
		if(b==10)
	   	b=0;

}

⌨️ 快捷键说明

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