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

📄 mainproc.c

📁 Keil C51完整的128X64LCD显示的电子打铃仪代码,内含DS1302X5045等操作代码
💻 C
字号:

#include 	"Config.H"

bool		ret_Flag;		//延时返回标志1-- 延时返回
bool		HaveKey_Flag;	//延时返回标志1-- 开,0--关
bool    	LightOnOff;		//背光开或关标志1--关,0--开

#if MAINMENUITEMNUM>4
bool 		First_Showmenu;
#endif

bool  		BeepOnOff;
bool			KeyBool;

idata uint8 	volatile 	Light_DelayTime;//背光由亮到灭的时间以秒为单位,当设为0时为背光不灭
idata uint16	volatile 	Light_DT;   
idata uint16	volatile 	Count_BG;
idata uint16	volatile 	Light_Destory;
idata uint8  	volatile 	Cursor_Count;
idata uint16  	volatile 	RetDelay;

idata uint8		volatile    KeyCount;

xdata TimerType  	TimerArray[36];

void _NOP_(void);
void PowerOnInitial(void);
void VariableInitial(void);
void SystemInitial(void);


//***************************************************************
//============ FUNCTION CODE SEGMENT =================
//***************************************************************

//**************************************************
//============= FUNCTION CODE SEGMENT ==============
//**************************************************

//==================================================
//Function: 	Delay	
//Description: 	Delay Function 
//				TotalDelayTime=2503uS*shinum+1uS
//				SYSTEM Oscillate:	Fosc=12MHz
//Parameters: 	shinum.
//Returns: 		NO.
//Side Effects: NO.
//==================================================
void  Delay(uint8 Interval)     			
{							
	do						
	{						
		Delay2ms5();		
	}while(--Interval!=0);		
}			

//==================================================
//Function: 	Delay1	
//Description: 	Delay Function 
//				TotalDelayTime=2503uS*shinum+1uS
//				SYSTEM Oscillate:	Fosc=12MHz
//Parameters: 	shinum.
//Returns: 		NO.
//Side Effects: NO.
//==================================================			
void  Delay1(uint8 Interval)     			
{							
	do						
	{						
		DelayS();		
	}while(--Interval!=0);
		
}
//==================================================
//Function: 	Key_Beep	
//Description: 	Key Sound Function 
//Parameters: 	NO.
//Call:			Delay()
//Returns: 		NO.
//Side Effects: NO.
//==================================================
void Beep(uint8 num)
{
	uint8	frequency;
	Key_Sound=1;

	do
	{
		frequency=30;

		do
		{
			Delay1(3);
			Key_Sound=~Key_Sound;
		}while(--frequency!=0);

		Delay(12);

	}while(--num!=0);
}

//==================================================
//Function: 	Status_Beep	
//Description: 	send Sound Function when the Machine of  Working status changing. 
//Parameters: 	NO.
//Call:			Delay(),Key_Beep()
//Returns: 		NO.
//Side Effects: NO.
//==================================================
void	Status_Beep(void)
{  
			Beep(1);
        	Delay(12);
        	Beep(1);
        	Delay(12);
        	Beep(1);
}

void	BeepLing(void)
{  
			Beep(1);
        	Delay(4);
        	Beep(4);
        	Delay(4);
        	Beep(3);
			Delay(4);
			Beep(4);
			Delay(4);
			Beep(5);
}
//===============================================================
//Function: 	
//Description: 	
//Parameters: 	
//Returns: 		
//Side Effects: 
//===============================================================
void PowerOnInitial(void)
{
	P0		=	0xFF;
	P1		=	0xFF;
	P2		=	0xFF;
	P3		=	0xFF;	
	AUXR	=	0x01;//允许XRAM,禁ALE

	Beep(1);
	
	TMOD	=	0x21;
	TR0		=	0;
	EA		=	TRUE;
	ET0		=	TRUE;
}


void VariableInitial(void)
{
	uint8 tempv;
	
	//控制灭背光时间(3S)
	Count_BG		=	0x0000;
	Light_Destory	=	0x00;
	Light_DelayTime =   T0_NOUSE;
	
	ret_Flag		=	FALSE;
	HaveKey_Flag	=	FALSE;
	LightOnOff      =   FALSE;
	BeepOnOff       =   FALSE;
   	KeyCount		=	0x00;
	KeyBool			=	FALSE;

#if MAINMENUITEMNUM>4
	First_Showmenu	=	FALSE;	//为FALSE表示为第一次显示菜单
#endif
	
	//查系统参数是否已设置
	tempv=RD_ByteFromDS1302_RAM(DS1302Init_Addr0|0x01);
	if(tempv==DS1302Init_Flag0)
	{
		tempv=RD_ByteFromDS1302_RAM(DS1302Init_Addr1|0x01);
		if(tempv==DS1302Init_Flag1)return;
	}
	
	//查系统参数未设置则初始化
	W_ByteToDS1302_RAM(Light_RAMAddr,T0_NOUSE);					//延时0秒
	W_ByteToDS1302_RAM(Beep_RAMAddr,BEEP_OPEN);					//按键音开
}

void SystemInitial(void)
{
	//读取延时关背光时间值
	//Light_DelayTime
	//LightOnOff=TRUE 开背光控制,FALSE--关背光控制
	uint8 tempvar1,tempvar;
	Light_DelayTime=RD_ByteFromDS1302_RAM(Light_RAMAddr|0x01);

	if(Light_DelayTime==T0_NOUSE)
	{
		LightOnOff=FALSE;
		Light_DT=0x00;
	}
	else
	{
		LightOnOff	=	TRUE;
		Light_DT	=	(uint16)((Light_DelayTime*100));
        Light_DT	=	Light_DT/TIME_VMS;
	}
	
	//读取按键音开或关值
	//BeepOnOff=TRUE 开,FALSE--关
	if(RD_ByteFromDS1302_RAM(Beep_RAMAddr|0x01)==0x00)
		BeepOnOff=FALSE;
	else
		BeepOnOff=TRUE;

	//闹铃初始化
	tempvar=EepromRead(TimerFlag);
	tempvar1=EepromRead(TimerFlag+1);
	if(tempvar!=0x55 || tempvar1!=0xAA)
	{
		
		EepromWrite(TimerFlag,0x55);
		Delay(1);
		EepromWrite(TimerFlag+1,0xAA);
		Delay(1);
		//清X5045
		for(tempvar1=0x12;tempvar1<160;tempvar1++)
		{
			EepromWrite(tempvar1,0x00);
			Delay(1);
		}
	}
	else
	{//读已设置的铃点数值
		tempvar=EepromRead(Timers);
		for(tempvar1=0;tempvar1<tempvar;tempvar1++)
		{
			TimerArray[tempvar1].BitEnable=EepromRead(TimerValue+tempvar1*3);
			TimerArray[tempvar1].Hour=EepromRead(TimerValue+tempvar1*3+1);
			TimerArray[tempvar1].Minute=EepromRead(TimerValue+tempvar1*3+2);
		}
	}

	Initial_DS1302();
	InitLcd();	

	Set_Timer0_60ms();	
}


//==========================================
//定时器0中断
#pragma disable
void Timer0ISR(void) interrupt 1 
{
	Set_Timer0_60ms();

	if(LightOnOff==TRUE)
	{
		Count_BG++;
		if (Count_BG>=Light_DT)
		{
			Light_Off();
		}
	}
	
	if (HaveKey_Flag)
	{
		Light_Destory++;
		if (Light_Destory>=RetDelay)
		{
			Light_Destory=0;
			ret_Flag=TRUE;
		}
	}

	KeyCount++;
	if(KeyCount>25)
	{
		KeyCount=0;
		KeyBool=TRUE;
	}
	Cursor_Count++;
	    
}


void main()
{
	idata uint8 Sys_D_T0[7];
	idata uint8 KeyValue,MainMenuIndex=0;
	bit SucFlag=0;
	PowerOnInitial();
	VariableInitial();
	SystemInitial();
	ClearRAM(0,7);
	LOGO();
	Beep(2);
	ClearRAM(0,8);

#ifdef MYDEBUG
	KeyValue=0x77;
	Msingle_font_pattern (English_Offset[(KeyValue>>4)&0x0F],2,64,0);
	Msingle_font_pattern (English_Offset[(KeyValue&0x0F)],2,72,0);
	KeyValue=0x00;
	EepromWrite(0x20,0x55);
	Beep(1);
	KeyValue=EepromRead(0x20);
	Msingle_font_pattern (English_Offset[(KeyValue>>4)&0x0F],2,8,0);
	Msingle_font_pattern (English_Offset[(KeyValue&0x0F)],2,16,0);
	EepromWrite(0x21,0x66);
	Beep(1);
	KeyValue=EepromRead(0x21);
	Msingle_font_pattern (English_Offset[(KeyValue>>4)&0x0F],2,32,0);
	Msingle_font_pattern (English_Offset[(KeyValue&0x0F)],2,40,0);
	
	KeyValue=KeyScan();
	while(KeyValue==NOKEY_PRESS);
#endif

	while(1)
	{
		Get_TimeFromDS1302(Sys_D_T0);

	

		if(SucFlag==0)
		{			
			DispRTC(0,Sys_D_T0);//显示时钟日历	
			Display_Line(5,32,5,0,ShowTip[0]);	
			Delay_Ret(T0_60S);
		}
		else
		{
			MainMenuShow(MainMenuIndex);
			if(ret_Flag)
			{
			 	ClearRAM(0,8);
				SucFlag=0;			
			}	
		}

		OpenSystem(Sys_D_T0[2],Sys_D_T0[1]);
	
		KeyValue=KeyScan();

		if(KeyValue==NOKEY_PRESS)continue;

		Light_On();
		NoDelay_Ret();	
						
		switch(KeyValue)
		{
			case ENTER:
				if(SucFlag==0)//未校验口令则校验权限口令
				{
					if(PwdCheck())//校验口令,正确后显示主菜单
					{
						ClearRAM(0,8);
					  	MainMenuShow(0);
					  	SucFlag=1;	
					 }
					 else
					 {		
						SucFlag=0;
					 }
				}
				else//已校验口令则进入保存相应菜单处理事件
				{
					switch(MainMenuIndex)//菜单命令处理
					{
						case 0://时钟设置
							SystemSet();
							break;
						case 1://闹钟设置
							TimerSetProc();
							break;
						case 2://背光设置--常开\常关或延时关
							WakeSetProc();
							break;
						case 3://本机蜂鸣声开还关设置
							DispInfo();
							break;
					}
				}
				break;
			 case MOVE://菜单移动键
			 	MainMenuIndex++;
			 	if(MainMenuIndex>=MAINMENUITEMNUM)MainMenuIndex=0;
			 	break; 
			 case ESC:
				ClearRAM(0,8);
				SucFlag=0;
				break;	 
		}
	}
}

⌨️ 快捷键说明

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