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

📄 perfect111.c

📁 智能车控制,基于c51,LCD显示,带模式选择功能,可选择直线,S线,全自动模式,统计运行情况
💻 C
📖 第 1 页 / 共 4 页
字号:
			 	break;
		}
				
		if (Next==True)		
		{
			NextTimes++;
			Next=False;
			ReturnMain=False;
			ReturnSelection=False;			          //按下了Next键,那么这个时候关闭返回键的功能	
			if (AVGSpeedShow==False)				  //还没有显示AVGSpeed选项,显示它
			{										  //即第一次选择了确定键
				WriteCmd(LCD_CLS);
				DisplayString(0x0,0,"    AVGSpeed    ");
				DisplayString(0x0,1,"Next        Show");
				TotalDistanceShow=False;			  //显示了AVGSpeed,则表明TotalDistance还没有显示
				
				Delay(120);														
			}	
			if (AVGSpeedShow==True)					  //已经显示过AVGSpeed选项了,则显示下一个选项
			{										  //即第一次选择了Next键
				WriteCmd(LCD_CLS);
				DisplayString(0x0,0," Total Distance ");
				DisplayString(0x0,1,"Next        Show");
				TotalDistanceShow=True;				  //表明显示了TotalDistance选项	

				Delay(120);							
			}
			if (Next==True)							  //检测按键抖动并消除
				Next=False;	
		}	

		if (Selected==True)						 //按下了确定键或返回键
		{
			SelectedShow=False;
			SelectedReturn=False;
			Selected=False;
			if (ReturnSelection==True)           //第一次选择了确定键,故这次按下的是返回键
				ReturnMain=True;
			if (ReturnSelection==False)			 //第一次选择了Next键,故这次按下的是确定键,显示第二个选项的内容
			{
				WriteCmd(LCD_CLS);
				DisplayString(0,0,"The AVGSpeed is");					
				DisplayAVGSpeed();
				DisplayString(0x0A,1,"m/s");
				ReturnSelection=True; 					//按下了确定键,那么这个时候开启返回键的功能
				
				Delay(120);										
			}
			TotalDistanceShow=False;					//不管按下的是确定键还是返回键盘都表明TotalDistance选项还没有显示
			
			if (Selected==True)						//检测按键抖动并消除
			{
				SelectedShow=False;
				SelectedReturn=False;
				Selected=False;
			}
		}

		if (ReturnMain==True)					 //按下了返回键,返回主菜单
		{
			ReturnMain=False;
			continue;
		}						

	/*------------------------------------第三次按键--------------------------------------*/

		/*如果没有返回主菜单,则继续检测Next键和确定键*/
        
		while(1)
		{			    
			if (Next==True)
				break;
			if (SelectedShow==True)
				break;
		}
		
		/*按下Next键,显示下一个选项*/
		if (Next==True)
		{
			NextTimes++;
			Next=False;
			ReturnMain=False;
			ReturnSelection=False;			        //按下了Next键,那么这个时候关闭返回键的功能	
			if (TotalDistanceShow==True)
				ReturnMain=True;
			if (TotalDistanceShow==False)			//还没有显示TotalDistance选项,显示它
			{										
				WriteCmd(LCD_CLS);
				DisplayString(0x0,0," Total Distance ");
				DisplayString(0x0,1,"Next        Show");
				TotalDistanceShow=True;			 		
				Delay(120);															
			}	
			if (Next==True)						 //检测按键抖动并消除
				Next=False;							
		}

		if (Selected==True)						 //按下了确定键或返回键
		{
			SelectedShow=False;
			SelectedReturn=False;
			Selected=False;
			if (ReturnSelection==True)           //按下的是返回键
				ReturnMain=True;
			if (ReturnSelection==False)			 
			{
				if (TotalDistanceShow==False)	 //表明AVGSpeed选项的内容还没有显示
				{
					WriteCmd(LCD_CLS);
					DisplayString(0,0,"The AVGSpeed is");					
					DisplayAVGSpeed();
					DisplayString(0x0A,1,"m/s");
					ReturnSelection=True; 	
					Delay(120);							
				}
				if (TotalDistanceShow==True)
				{
					WriteCmd(LCD_CLS);
					DisplayString(0,0,"Total Distance");
					DisplayDistance();
					DisplayString(0x0A,1,"m");
					ReturnSelection=True; 		  //按下了确定键,那么这个时候开启返回键的功能
					Delay(120);						
				}
			}
			if (Selected==True)					  //检测按键抖动并消除
			{
				SelectedShow=False;
				SelectedReturn=False;
				Selected=False;
			}
		}

		if (ReturnMain==True)					 //按下了返回键,返回主菜单
		{
			ReturnMain=False;
			continue;				
		}

	/*------------------------------------第四次按键--------------------------------------*/
		while(1)
		{			    
			if (Next==True)
				break;
			if (SelectedShow==True)
				break;
		}
		
		if (Next==True)						     //所有菜单项已经显示完毕,返回主菜单
		{
			NextTimes++;
			Next=False;
			ReturnMain=False;
			ReturnSelection=False;			        
			if (TotalDistanceShow==False)		
			{										
				WriteCmd(LCD_CLS);
				DisplayString(0x0,0," Total Distance ");
				DisplayString(0x0,1,"Next        Show");
				TotalDistanceShow=True;			 	
				Delay(120);													
			}	
			if (Next==True)						 //检测按键抖动并消除
				Next=False;								
		}

		if (SelectedShow==True)
		{
			SelectedShow=False;
			SelectedReturn=False;
			Selected=False;
			if (ReturnSelection==True)           //按下的是返回键
				ReturnMain=True;
			if (ReturnSelection==False)			 
			{
				if (TotalDistanceShow==True)
				{
					WriteCmd(LCD_CLS);
					DisplayString(0,0,"Total Distance");
					DisplayDistance();
					DisplayString(0x0A,1,"m");
					ReturnSelection=True; 					//按下了确定键,那么这个时候开启返回键的功能
					Delay(120);								
				}
			}
			if (SelectedShow==True)							//检测按键抖动并消除
			{
				SelectedShow=False;
				SelectedReturn=False;
				Selected=False;
			}			
		}
		
		if (ReturnMain==True || NextTimes==3)			//按下了返回键或者Next键按过3次,返回主菜单
		{
			ReturnMain=False;
			continue;				
		}



	/*------------------------------------第五次按键--------------------------------------*/
		while(1)
		{			    
			if (Next==True)
				break;
			if (SelectedShow==True)
				break;
		}

		if (Next==True)						     //所有菜单项已经显示完毕,返回主菜单
		{
			NextTimes++;
			Next=False;
			ReturnMain=False;
			ReturnSelection=False;
			if (TotalDistanceShow==True)		//最后一个选项已经显示完毕,返回主菜单
				ReturnMain=True;
			if (Next==True)						//检测按键抖动并消除
				Next=False;									        
		}
	
		if (SelectedShow==True)
		{
			SelectedShow=False;
			SelectedReturn=False;
			Selected=False;
			if (ReturnSelection==True)           //按下的是返回键
				ReturnMain=True;
			if (ReturnSelection==False)			 
			{
				if (TotalDistanceShow==True)
				{
					WriteCmd(LCD_CLS);
					DisplayString(0,0,"Total Distance");
					DisplayDistance();
					DisplayString(0x0A,1,"m");
					ReturnSelection=True; 					//按下了确定键,那么这个时候开启返回键的功能
					Delay(120);										
				}
			}												
			if (SelectedShow==True)						    //检测按键抖动并消除
			{
				SelectedShow=False;
				SelectedReturn=False;
				Selected=False;
			}	
		}

		if (ReturnMain==True || NextTimes==3)				 //按下了返回键或者Next键按过3次,返回主菜单
		{
			ReturnMain=False;
			continue;				
		}
	/*------------------------------------第六次按键--------------------------------------*/		
		while(1)
		{			    
			if (Next==True)
				break;
			if (SelectedShow==True)
				break;
		}

		if (Next==True)
		{
			NextTimes++;
			Next=False;
			ReturnMain=False;
			ReturnSelection=False;
			if (Next==True)				 				//检测按键抖动并消除
				Next=False;							
		}
		if (SelectedShow==True)
		{
			SelectedShow=False;
			SelectedReturn=False;
			Selected=False;
			if (SelectedShow==True)						//检测按键抖动并消除
			{
				SelectedShow=False;
				SelectedReturn=False;
				Selected=False;				
			}
		}
		continue;	
	} 
}

/****************************************************************************************\
**								   LCD驱动模块											**
\****************************************************************************************/

/*---------------------------------  LCD初始化函数--------------------------------------*/

void LCDInit(void)
{
    //三次显示模式设置
	LCD_Data=0;
	LCD_E=Disable;
	Delay(5);
	WriteCmd(LCD_Init);
	Delay(5);
	WriteCmd(LCD_Init);
	Delay(5);
	WriteCmd(LCD_Init);

	WriteCmd(LCD_Init);	   							//初始化
	WriteCmd(LCD_CloseCtr);							//关显示
	WriteCmd(LCD_CLS);								//清屏幕
	WriteCmd(LCD_EnterSet);							//光标移动设置
	WriteCmd(LCD_DispCtr);							//显示开以及光标设置
	
}
/*---------------------------------  LCD模式设置函数--------------------------------------*\
	
	SetWriteCmd() 	 			设置LCD为写命令模式
	SetReadCmd()   		    	设置LCD为读命令模式
	SetWriteData()				设置LCD为写数据模式
	
\*----------------------------------------------------------------------------------------*/
void SetWriteCmd(void)
{
	LCD_RW=Write;
	LCD_RS=Cmd;
}

void SetReadCmd(void)
{
	LCD_RW=Read;
	LCD_RS=Cmd;
}

void SetWriteData(void)
{
	LCD_RW=Write;
	LCD_RS=Data;
}
/*---------------------------------  LCD功能执行函数--------------------------------------*\
	
	WriteCmd()					写命令
	WriteData()					写数据
	ExecuteCmd()				执行命令
	SetXY()						显示定位
	DisplaySingleChar()			显示单个字符
	DisplayString()				显示一串字符
	IsBusy()					忙标志检测

\*----------------------------------------------------------------------------------------*/

void WriteCmd(char cmd)
{
	while(IsBusy());
	LCD_Data=cmd;	
	SetWriteCmd();
	ExecuteCmd();
}

void WriteData(char ddata)
{
	while(IsBusy());
	LCD_Data=ddata;
	SetWriteData();	
	ExecuteCmd();
}

void ExecuteCmd(void)
{
	LCD_E=Enable;
	LCD_E=Disable;
}

void SetXY(char x,char y)
{
	if (y)
		x|=0x40;
	x|=0x80;
	Delay(5);
	WriteCmd(x);

}

void DisplaySingleChar(char x,char y,char cchar)
{
	SetXY(x,y);
	WriteData(cchar);	
}

void DisplayString(char x,char y,char *str)
{
	while(*str)
	{
		Delay(5);
		DisplaySingleChar(x++,y,*str);
		str++;
	}
}

bit IsBusy(void)
{
	LCD_Data=0xFF;
	SetReadCmd();
	ExecuteCmd();
	return (bit)(P1 & 0x80);	
}

/*-------------------------------------    延时函数   -------------------------------------*/
void Delay(unsigned int time)
{
    unsigned int timeCounter = 0;
	for (timeCounter = time;timeCounter > 0 ;timeCounter --)
		DelayUs(255);
}

void DelayUs(unsigned int time)
{
	unsigned int timeCounter = 0;
	for (timeCounter = 0;timeCounter < time;timeCounter ++)

⌨️ 快捷键说明

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