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

📄 ledv1.c

📁 c51 24X8点阵1302时钟c程序
💻 C
字号:
#include "STC12C2052AD.H"

extern void Read_RAM(unsigned char *s,unsigned char startbyte,unsigned char length);
extern void Write_RAM(unsigned char *s,unsigned char startbyte,unsigned char length);

extern void Read_Time(unsigned char ucCurtime[]);
extern void  Set_Time(unsigned char *pSecDa); 
extern void Set_Charge(void);

sbit   HC138A = P3^2;
sbit   HC138B = P3^3;
sbit   HC138C = P3^4;
sbit   HC138EN = P3^5;

sbit HC595SER=P1^6;
sbit HC595RCLK=P1^5;
sbit HC595SRCLK=P1^4;

sbit BUZ=P1^2;

sbit KEY1=P1^7;
sbit KEY2=P3^7;

//sbit KEY1 = 
//sbit KEY2 =


//DS1302中RAM空间定义

#define CALLTIME1 0
#define CALLTIME2 2
#define CALLTIME3 4

unsigned char MainState;

#define DISPLAYTIME 0
#define DISPLAYDATE 1
#define DISPLAYSECOND 2
#define DISPLAYCALLTIME1 3
#define DISPLAYCALLTIME2 4
#define DISPLAYCALLTIME3 5
#define DISPLAYWEEK 6
#define DISPLAYYEAR 7
#define BDSTATE 8

#define SETTIME 0x80
#define SETDATE 0x81
#define SETSECOND 0x82
#define SETCALLTIME1 0x83
#define SETCALLTIME2 0x84
#define SETCALLTIME3 0x85
#define SETWEEK 0x86
#define SETYEAR 0x87


unsigned char MSecond;
unsigned char Second,Minute,Hour,Day,Month,Week,Year;
unsigned char c1,c2,c3,c4,c5;
unsigned char Time[8];
unsigned char Key1On;
unsigned char Key2On;
unsigned char KeyFlag;

#define NOKEY 0
#define KEY1ON 1
#define KEY2ON 2
//#define KEY1ON=1

unsigned char Cursor;

bit FlashFlag;

unsigned char BUZFlag;
unsigned char BUZTime;

unsigned char SetData[2];

unsigned char RAMBuffer[10];

unsigned char code ZF[]=
{
	0x00,0x06,0x09,0x09,0x09,0x09,0x09,0x06,       //0
	0x00,0x02,0x06,0x02,0x02,0x02,0x02,0x07,       //1
	0x00,0x06,0x09,0x01,0x02,0x04,0x08,0x0f,       //2
	0x00,0x06,0x09,0x01,0x06,0x01,0x09,0x06,       //3
	0x00,0x02,0x06,0x0a,0x0a,0x0f,0x02,0x02,       //4
	0x00,0x0f,0x08,0x0e,0x09,0x01,0x09,0x06,       //5
	0x00,0x06,0x09,0x08,0x0e,0x09,0x09,0x06,       //6
	0x00,0x0f,0x01,0x01,0x02,0x04,0x04,0x04,       //7
	0x00,0x06,0x09,0x09,0x06,0x09,0x09,0x06,       //8
	0x00,0x06,0x09,0x09,0x07,0x01,0x09,0x06,       //9
	0x00,0x00,0x06,0x06,0x00,0x06,0x06,0x00,       //:      10
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,       //空白   11
	0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,       //-      12
	0x08,0x00,0x06,0x06,0x00,0x06,0x06,0x00,       //:      13
	0x0c,0x00,0x06,0x06,0x00,0x06,0x06,0x00,       //:      14
	0x0e,0x00,0x06,0x06,0x00,0x06,0x06,0x00,       //:      15

};

void Delay(unsigned int time)
{
	unsigned int i;
	for (i=0;i<time;i++);
}

void write595(unsigned char dd)
{
	unsigned char i;
	for (i=0;i<8;i++)
	{
		HC595SER=dd&0x01;
		dd=dd/2;
		HC595SRCLK=1;
		HC595SRCLK=0;
	}
}

void main (void)
{
	unsigned char i;
	unsigned char j;
	unsigned char z1,z2,z3;
	unsigned int x;
//	unsigned int x1;

	EA=1;  //允许CPU中断
	ET0=1;  //定时器0中断打开
	TMOD=0x01; //设定时器0为方式1
	TH0=0xf8;
	TL0=0xcd; //设定时值为20 000 μs(20 ms)
	TR0=1;  //开始定时
	P1M0=0;
	P1M1=0;

	Set_Charge();
	KeyFlag=0;
	MainState=0;

	BUZFlag=0;

	Read_RAM(RAMBuffer,0,6);

	while(1)
	{
		for (i=0;i<8;i++)
		{
			HC138EN=1;
	
			HC595SER=0;
			HC595RCLK=0;
			HC595SRCLK=0;	

			x=0;
			
			x=ZF[8*c5+i];
			x=x<<5;

			x=x+ZF[8*c4+i];
			z1=0xff-(unsigned char)(x>>1);
			x=x<<5;

			x=x+ZF[8*c3+i];
			x=x<<5;

			x=x+ZF[8*c2+i];
			z2=0xff-(unsigned char)(x>>3);
			x=x<<5;

			x=x+ZF[8*c1+i];
			z3=(unsigned char)x;
			z3=0xff-z3;

			write595(z1);
			write595(z2);
			write595(z3);

			HC595RCLK=1;
			HC595RCLK=0;
			HC595SER=0;
			HC595SRCLK=0;

			HC138A=i&0x01;
			HC138B=i&0x02;
			HC138C=i&0x04;

			HC138EN=0;
		
			Read_Time(Time);

			if ((Time[1]!=0)&&(Time[2]!=0))
			{
				for(j=0;j<3;j++)
				{
					if (Time[2]==RAMBuffer[j*2+1])
					{
						if (Time[1]==RAMBuffer[j*2])
						{
							if (Time[0]==0)
							{
								BUZFlag=j+1;
								BUZTime=0;
							}
						}
					}
				}
			}


			if (MainState>=0x80)
			{
				if((MainState==SETTIME)||(MainState==SETDATE)||(MainState==SETCALLTIME1)||(MainState==SETCALLTIME2)||(MainState==SETCALLTIME3))
 			    {
					if (MainState==SETDATE)
					{
						if ((SetData[0]&0x0f)>9) SetData[0]=SetData[0]+6;
						if (SetData[0]>0x12) SetData[0]=1; 
					
						if ((SetData[1]&0x0f)>9) SetData[1]=SetData[1]+6;
						if (SetData[1]>0x31) SetData[1]=1;

						c3=12;
					}
					else
					{
						if ((SetData[0]&0x0f)>9) SetData[0]=SetData[0]+6;
						if (SetData[0]>0x23) SetData[0]=0; 
						
						if ((SetData[1]&0x0f)>9) SetData[1]=SetData[1]+6;
						if (SetData[1]>0x59) SetData[1]=0;

						if (MainState==SETTIME) c3=10;
						else c3=13+(MainState-SETCALLTIME1);
					}

					if (Cursor>2)
				 	{
						if (MainState==SETTIME)
						{
//							Hour=SetData[0];
//							Minute=SetData[1];
							Read_Time(Time);
							Time[1]=SetData[1];//Minute;
							Time[2]=SetData[0];//Hour;
//							if (Time[0]>0x80) Time[0]=0;
							Set_Time(Time);
						}
						else if (MainState==SETDATE)
						{
//							Month=SetData[0];
//							Day=SetData[1];
							Read_Time(Time);
							Time[3]=SetData[1];//Day;
							Time[4]=SetData[0];//Month;
//							if (Time[0]>0x80) Time[0]=0;
							Set_Time(Time);
						}
						else
						{
							RAMBuffer[(MainState-SETCALLTIME1)*2]=SetData[1];
							RAMBuffer[(MainState-SETCALLTIME1)*2+1]=SetData[0];
							Write_RAM(RAMBuffer,0,6);
						}
						Cursor=0;
						MainState=MainState-0x80;
					}
					else if (Cursor==1)
					{
						c4=11;
						c5=11;
						if (FlashFlag==1)
						{
							c4=SetData[0]%16;
							c5=SetData[0]/16;
//							MSecond=0;
						}
//						else
//						{
//							c4=11;
//							c5=11;
//							MSecond=0;
//						}
						c1=SetData[1]%16;
						c2=SetData[1]/16;
					}
					else if (Cursor==2)
					{
						c4=SetData[0]%16;
						c5=SetData[0]/16;
						if (FlashFlag==1)
						{
							c1=SetData[1]%16;
							c2=SetData[1]/16;
//							MSecond=0;
						}
						else
						{
							c1=11;
							c2=11;
//							MSecond=0;
						}
					}						
				}
				else if ((MainState==SETSECOND)||(MainState==SETWEEK)||(MainState==SETYEAR))
				{
					if (MainState==SETSECOND)
					{
						if ((SetData[0]&0x0f)>9) SetData[0]=SetData[0]+6;
						if (SetData[0]>0x59) SetData[0]=0;
					}
					else if (MainState==SETWEEK)
					{
						if (SetData[0]>7) SetData[0]=1;
					}
					else
					{
						if ((SetData[0]&0x0f)>9) SetData[0]=SetData[0]+6;
						if (SetData[0]>0x99) SetData[0]=0;
					}

					if (Cursor>1)
				 	{
						Read_Time(Time);
						if(MainState==SETSECOND)
 					    {
//							Second=SetData[0];
							Time[0]=SetData[0];
						}
						else if (MainState==SETWEEK)
						{
							Time[5]=SetData[0];	
						}
						else
						{
							Time[6]=SetData[0];	
						}
						Set_Time(Time);
						SetData[1]=0;
						Cursor=0;
						MainState=MainState-0x80;
					}
					else if (Cursor==1)
					{
						c5=11;
						c3=11;
						c4=11;

						if (MainState==SETYEAR)
						{
							c4=2;
							c3=0;
						}

//						c1=11;
//						c2=11;
						if (FlashFlag==1)
						{
							c1=SetData[0]%16;
							c2=SetData[0]/16;

							if (MainState==SETWEEK) c2=11;
						}
						else
						{
							c1=11;
							c2=11;
//							MSecond=0;
						}
					}
				}
				
				Delay(300);
			}
			else 
			{
				if (MainState==DISPLAYTIME)
				{
					Read_Time(Time);
					if (Second!=Time[0])
		 			{
						Second=Time[0];
						c3=10;
						MSecond=0;
						FlashFlag=0;
					}

					if (FlashFlag==1) c3=11;

					Minute=Time[1];
					Hour=Time[2];
//					Day=Time[3];
//					Month=Time[4];
//					Week=Time[5];
//					Year=Time[6];
					c4=Hour%16;
					c5=Hour/16;
					c1=Minute%16;
					c2=Minute/16;
				}
				else if ((MainState==DISPLAYCALLTIME1)||(MainState==DISPLAYCALLTIME2)||(MainState==DISPLAYCALLTIME3))
				{
//					Read_RAM(RAMBuffer,0,6);
					Minute=RAMBuffer[(MainState-DISPLAYCALLTIME1)*2];
					Hour=RAMBuffer[(MainState-DISPLAYCALLTIME1)*2+1];
					c3=13+MainState-DISPLAYCALLTIME1;
					c4=Hour%16;
					c5=Hour/16;
					c1=Minute%16;
					c2=Minute/16;
				}
				else if (MainState==DISPLAYWEEK)
				{
					Read_Time(Time);
					Week=Time[5];

					c3=11;
					c4=11;
					c5=11;
					c1=Week%16;
					c2=11;
				}
				else if (MainState==DISPLAYYEAR)
				{
					Read_Time(Time);
					Year=Time[6];

					c3=0;
					c4=2;
					c5=11;
					c1=Year%16;
					c2=Year/16;

				}
				else if (MainState==DISPLAYDATE)
				{
					Read_Time(Time);
					Day=Time[3];
					Month=Time[4];
					c4=Month%16;
					c5=Month/16;
					c1=Day%16;
					c2=Day/16;
					c3=12;	
				}
				else if (MainState==DISPLAYSECOND)
				{
					Read_Time(Time);
					if (Second!=Time[0])
		 			{
						Second=Time[0];
						if (Second==0) SetData[1]++;
					}
					c4=SetData[1]%10;
					c5=SetData[1]/10;
					c1=Second%16;
					c2=Second/16;
					c3=10;
				}
			}
		}
	}
}

void Time0Interrupt(void) interrupt 1 using 1
{
	TH0=0xf8; //20 ms断点 (1)
	TL0=0xcd; //设定时值
	MSecond=MSecond+1;

	if (KEY1==0)
	{
		Key1On++;
		if (Key1On==3) KeyFlag=KEY1ON;
		if (Key1On>250) Key1On=251;
	}
	else Key1On=0;

	if (KEY2==0)
	{
		Key2On++;
		if (Key2On==3) KeyFlag=KEY2ON;
		if (Key2On>250) Key2On=251;
	}
	else Key2On=0;
	
	if (KeyFlag==KEY1ON)
	{
		if (MainState<0x80)
	 	{
			MainState++;
			SetData[1]=0;
			if (MainState>=BDSTATE) MainState=0;
		}
		else
		{
			SetData[Cursor-1]++;	
		}
	}
	else if (KeyFlag==KEY2ON)
	{
		if(MainState<0x80)
		{
			MainState=MainState+0x80;

			if ((MainState==SETTIME)||(MainState==SETCALLTIME1)||(MainState==SETCALLTIME2)||(MainState==SETCALLTIME3))
			{
				SetData[0]=Hour;
				SetData[1]=Minute;
			}
			else if (MainState==SETDATE)
			{
				SetData[0]=Month;
				SetData[1]=Day;
			}
			else if (MainState==SETSECOND)
			{
				SetData[0]=Second;
			}
			else if (MainState==SETWEEK)
			{
				SetData[0]=Week;
			}
			else
			{
				SetData[0]=Year;
			}

			Cursor=1;
		}
		else
		{
			Cursor++;
		}
	}
	KeyFlag=NOKEY;

	if (MSecond==150)
	{
		FlashFlag=~FlashFlag;		
		MSecond=0;
		BUZTime++;
	}
	
	if (BUZFlag>0)
	{
		if (BUZTime<10)
		{
			if (MSecond==0) BUZ=0;
			else if (MSecond==20) BUZ=1;
			if (BUZFlag>1)
			{
				if (MSecond==50) BUZ=0;
				else if (MSecond==70) BUZ=1;
				if (BUZFlag>2)
				{
					if (MSecond==100) BUZ=0;
					else if (MSecond==120) BUZ=1;
				}
			}
		}
		else
		{
			BUZFlag=0;
		}
	}
//	if ((BUZFlag>(MSecond>>5))&&((MSecond%0x1f)==0)) BUZ=0;
//	if ((BUZFlag>(MSecond>>5))&&((MSecond%0x1f)==0)) BUZ=1;
}

⌨️ 快捷键说明

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