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

📄 led_clock.c

📁 很好的代码哦很好的代码哦很好的代码哦!
💻 C
字号:
/***************************************************************************************

					author : aishinimi6
					mail :aishinimi6@sina.com
					qq:51606603
					qq group:46068076

****************************************************************************************/
#include<at89x52.h>
#include<intrins.h>

#define speaker P3_7
#define PRE P3_4
#define SET P3_5
#define dat P0

unsigned char flag,currentkey,previouskey;
unsigned char scankey();
void keyproc();

//unsigned char code select[]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0xBF,0X7F};//for  PNP transistor
unsigned char code select[]={0X01,0X02,0X04,0X08,0X10,0X20};//for NPN transistor
unsigned char code disp[]={
													0xc0,0xF9,0xA4,0xB0,0x99,//0-4
      										0x92,0x82,0xF8,0x80,0x90,//5-9
	  											0x88,0x90,0xC6,0xC7,0x86,0x8E//A,b,C,L,E,F	  										
	  											};
unsigned char dispbuf[6]={0,0,0,0,0,0};
unsigned char second,minute,hour;
unsigned char sel;

void delay(void);
void delay1ms(unsigned char n);

unsigned char second100;
unsigned char alarmhour,alarmminute,alarmsecond;
bit alarm;
unsigned int change;

void main()
{
	second=50;
	minute=59;
	hour=17;
	second100=0;
	alarmhour=6;
	alarmminute=10;
	alarmsecond=0;
	alarm=1;
	speaker=0;
	change=0;
	IE=0X8F;
	IP=0X01;
	IT0=0;
	IT1=0;
	TMOD=0X11;
	TH0=0XD8;
	TL0=0Xf4;//adjust the time to be correct,maybe the crystal is not so good
	/*
	TH0=D8;
	TL0=0XF0;
	12MHZ CRYSTAL 10ms interrupt
	*/
	TR0=1;
	while(1)
	{
		
		for(sel=0;sel<6;sel++)
		{
			if(second100>99)
			{
				second100=0;
				second++;
				if(second>59)
				{
					second=0;
					minute++;
					if(minute>59)
					{
						minute=0;
						hour++;
						if(hour>23)
						hour=0;
					}
				}
			}
		
		
			if(alarm)
			{
				change++;
				if(change<2500)
				{
					dispbuf[0]=hour/10;
					dispbuf[1]=hour%10;
					dispbuf[2]=minute/10;
					dispbuf[3]=minute%10;
					dispbuf[4]=second/10;
					dispbuf[5]=second%10;
					
				}
				else
				{
						dispbuf[0]=alarmhour/10;
						dispbuf[1]=alarmhour%10;
						dispbuf[2]=alarmminute/10;
						dispbuf[3]=alarmminute%10;
						dispbuf[4]=alarmsecond/10;
						dispbuf[5]=alarmsecond%10;
					
				}
				if(change==3500)
				change=0;
				
			}

			else
			{
					dispbuf[0]=hour/10;
					dispbuf[1]=hour%10;
					dispbuf[2]=minute/10;
					dispbuf[3]=minute%10;
					dispbuf[4]=second/10;
					dispbuf[5]=second%10;
				
			}

			if(sel==1||sel==3)
			{
				
				P0=disp[dispbuf[sel]]&0x7F;//display the dot
			}
			else
			{
				P0=disp[dispbuf[sel]];
			}
			P2=select[sel];
			delay();
			//P2=0x00;//added for the simulator,not for the real circuit仿真的时候使用,实际程序好象不可以用
	
		}
	}
}
	


void delay(void)//short delay
{
	unsigned char n;
	for(n=0;n<255;n++)
	{
		_nop_();
		_nop_();
	}
}

void timer0()interrupt 1//process the time
{
	TH0=0XD8;
	TL0=0Xf4;//adjust the time to be correct,maybe the crystal is not so good
	/*
	TH0=D8;
	TL0=0XF0;
	12MHZ CRYSTAL 10ms interrupt
	*/
	second100++;
	if(alarmhour==hour&&alarmminute==minute&&alarmsecond==second)
	{
		if(alarm)
		TR1=1;
	}
	
}
void timer1() interrupt 3//start alarm
{
	TH1=0X00;
	TL0=0Xff;
	speaker=~speaker;
	if((minute-alarmminute)==5)//stop the alarmer after five minutes
	{
		TR1=0;
		speaker=0;
	}
}

void int0() interrupt 0//into the process function
{
	TR0=0;
	IE=0;//stop all the interrupt
	dat=disp[8];
	P2=0X3F;

	flag=0;
	previouskey=0x30;
	while(flag^0x0e)//make the flag less than 13
	{
		currentkey=scankey();
		if(currentkey^previouskey)
		{
			delay1ms(1);
			if(currentkey^previouskey)
			{
				previouskey=currentkey;
				if(currentkey==0x01)
				{
					flag++;
					switch(flag)
					{
						//adjust the alarm time and current time
						
						case 1:
							dat=disp[10];
							P2=0X3f;
							break;
							
						case 2:		
							dispbuf[0]=alarmhour/10;
							dat=disp[dispbuf[0]]&0x7F;
							P2=select[0];						
							break;
							
						case 3:
							dispbuf[1]=alarmhour%10;
							dat=disp[dispbuf[1]]&0x7F;
							P2=select[1];
							break;
						case 4:
							dispbuf[2]=alarmminute/10;							
							dat=disp[dispbuf[2]]&0x7F;
							P2=select[2];
							break;
						case 5:
						 	dispbuf[3]=alarmminute%10;
							dat=disp[dispbuf[3]]&0x7F;
							P2=select[3];
							break;
						case 6:
						 	dispbuf[4]=alarmsecond/10;
							dat=disp[dispbuf[4]]&0x7F;
							P2=select[4];
							break;
						case 7:
						 	dispbuf[5]=alarmsecond%10;
							dat=disp[dispbuf[5]]&0x7F;
							P2=select[5];
							break;
						
						case 8:			
						
							dispbuf[0]=hour/10;
							dat=disp[dispbuf[0]];
							P2=select[0];						
							break;
						case 9:
							
							dispbuf[1]=hour%10;
							dat=disp[dispbuf[1]];
							P2=select[1];
							break;
						case 10:
							dispbuf[2]=minute/10;
							dat=disp[dispbuf[2]];
							P2=select[2];
							break;
						case 11:
						 	dispbuf[3]=minute%10;
							dat=disp[dispbuf[3]];
							P2=select[3];
							break;
						case 12:
						 	dispbuf[4]=second/10;
							dat=disp[dispbuf[4]];
							P2=select[4];
							break;
						 case 13:
						 	dispbuf[5]=second%10;
							dat=disp[dispbuf[5]];
							P2=select[5];
							break;
						 	
							
							default:
								break;
					}
				}
				if(currentkey==0x02)
				{
					keyproc();
				}
			}
			
		}



	}

	IE=0X8F;
	TR0=1;

	
}		
void int1() interrupt 2//extern interrupt to stop the alarm
{
	if(TR1)
	TR1=0;
	speaker=0;	
}

unsigned char scankey()
{
	currentkey=0x00;
	currentkey|=PRE;
	currentkey=currentkey<<1;
	currentkey|=SET;
	return currentkey;
}

void keyproc()
{
	switch(flag)//adjust the data of alarm time and current time 
	{
		case 1:
			alarm=!alarm;
			if(alarm)
			dat=disp[10];
			else
			dat=disp[0];
			P2=0X3f;

			break;
		case 2:		
			if(alarmhour/10==2)			
			alarmhour=alarmhour-20;
			else
			alarmhour=alarmhour+10;
			dispbuf[0]=alarmhour/10;
			dat=disp[dispbuf[0]]&0x7F;
			P2=select[0];
			break;
		 case 3:
		 	
			if(alarmhour%10==9)
			alarmhour=alarmhour-9;
			else
			alarmhour++;			
			dispbuf[1]=alarmhour%10;
			dat=disp[dispbuf[1]]&0x7F;
			P2=select[1];
			break;
		case 4:			
			if(alarmminute/10==5)
			alarmminute=alarmminute-50;
			else
			alarmminute=alarmminute+10;
			dispbuf[2]=alarmminute/10;
			dat=disp[dispbuf[2]]&0x7F;
			P2=select[2];
			break;
		 case 5:		 	
			if(alarmminute%10==9)
			alarmminute=alarmminute-9;
			else
			alarmminute++;			
			dispbuf[3]=alarmminute%10;
			dat=disp[dispbuf[3]]&0x7F;
			P2=select[3];
			break;
		case 6:
			
			if(alarmsecond/10==5)
			alarmsecond=alarmsecond-50;
			else
			alarmsecond=alarmsecond+10;

			dispbuf[4]=alarmsecond/10;
			dat=disp[dispbuf[4]]&0x7F;
			P2=select[4];
			break;
		 case 7:
		 	
			if(alarmsecond%10==9)
			alarmsecond=alarmsecond-9;
			else
			alarmsecond++;			
			dispbuf[5]=alarmsecond%10;
			dat=disp[dispbuf[5]]&0x7F;
			P2=select[5];
			break;



		case 8:		
			if(hour/10==2)			
			hour=hour-20;
			else
			hour=hour+10;
			dispbuf[0]=hour/10;
			dat=disp[dispbuf[0]];
			P2=select[0];
			break;
		 case 9:
		 	
			if(hour%10==9)
			hour=hour-9;
			else
			hour++;			
			dispbuf[1]=hour%10;
			dat=disp[dispbuf[1]];
			P2=select[1];
			break;
		case 10:			
			if(minute/10==5)
			minute=minute-50;
			else
			minute=minute+10;
			dispbuf[2]=minute/10;
			dat=disp[dispbuf[2]];
			P2=select[2];
			break;
		 case 11:		 	
			if(minute%10==9)
			minute=minute-9;
			else
			minute++;			
			dispbuf[3]=minute%10;
			dat=disp[dispbuf[3]];
			P2=select[3];
			break;
		case 12:
			
			if(second/10==5)
			second=second-50;
			else
			second=second+10;

			dispbuf[4]=second/10;
			dat=disp[dispbuf[4]];
			P2=select[4];
			break;
		 case 13:
		 	
			if(second%10==9)
			second=second-9;
			else
			second++;			
			dispbuf[5]=second%10;
			dat=disp[dispbuf[5]];
			P2=select[5];
			break;

		default:
			break;
	}
}

void delay1ms(unsigned char n)
{
	while(n--)
	{
		unsigned char i;
		for(i=0;i<250;i++)
		{
			_nop_();
			_nop_();
			_nop_();
			_nop_();
		}
	}
}

⌨️ 快捷键说明

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