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

📄 main.c

📁 通过89s51实现的模拟键盘代码
💻 C
📖 第 1 页 / 共 3 页
字号:
							cAutoScan=0;    //自动扫描标志
							}
								 CameraStop();
								 Zoom_tele();
								 break;
								 
							 case	0x0008:		  //向上	上下由T1控制
								 if(cAutoScan==1)
							{
							T0_stop();
							cAutoScan=0;    //自动扫描标志
							}
								 cDirectVertical=1 ;	
								 T0_stop();
								 if(cDirectVerticalLim==1 )
									 break;	
								 cDirectVerticalLim=0;
								 T1_start();
								 break;
							 case	0x0010:		  //向下
								if(cAutoScan==1)
							{
							T0_stop();
							cAutoScan=0;    //自动扫描标志
							}
								 cDirectVertical=-1 ;
								 T0_stop();
								 if(cDirectVerticalLim==-1 )
									 break;
									 cDirectVerticalLim=0;
								 T1_start();
								 break;
							 case	0x0004:		  //向左	左右由T0控制
							   if(cAutoScan==1)
							{
							T0_stop();
							cAutoScan=0;    //自动扫描标志
							}
								 cDirectHorizon=1;
								 T1_stop();
								 if(cDirectHorizonLim ==1 )
									 break;	
									 cDirectHorizonLim =0;	  //可以运动则复位
								 T0_start();
								 break;
							 case	0x0002:		  //向右
								if(cAutoScan==1)
							{
							T0_stop();
							cAutoScan=0;    //自动扫描标志
							}
								 cDirectHorizon=-1;
								 T1_stop();
								 if(cDirectHorizonLim ==-1 )
									 break;	
									 cDirectHorizonLim =0;	   //可以运动则复位
								 T0_start();
								 break;
							  case   0x0011:		  //自动扫描
							  cAutoScan=1;    //自动扫描标志
							cDirectHorizon=1;
							T0_start();
							break;
							 case	0:		  //结束所有运动  1标准
								 T1_stop();
								 T0_stop();
								 CameraStop();
								 break;
								 case	0x001f:		  //结束所有运动   2  明景工控
								 T1_stop();
								 T0_stop();
								 CameraStop();
								 break;
							 default :break;
							 }
							 
				 
							 break;				   //处理程序后的分枝完成
					
					
						 }
						 else
						 {							   //不是本球机的接收码ID不正确或者是一误码都必须会结束
							 cKeyCodeReceiveState=0;
							 break;					   //处理并且清除接收标志
						 }
						 
					   default:	   break;
					 }						   //结束协议一次接收
				
					 }						   //结束  if有数
  	
					 }						   //结束协议的while
					 break;					   //结束协议的case事件
					 
					 

	 case 7:	   //亚安
	while(1)
	
	{
			 	 WDT_cls();	
 		if(7!=cProtocal)   // 利用协议出错处理
			{
			goto ERRor;
			}	
				 if(cKeyCodeReceiveState)
				 {
					
	
					 switch((unsigned char)cKeyCodeReceive)
					 {
					 case 0x02:		  //防误码先接收一个FF后接下来进行 判断是否下个码

	
					  cKeyCodeReceiveState=0; //取走第一个码
						 while(!cKeyCodeReceiveState)  //对于键盘发出的选择球机也是七位FF开始的码
						 {
							 _nop_();

						 }
					if(0x02==(unsigned char)cKeyCodeReceive)	   //判断是否是误码,FF说明是误码
						 {							 
							 

							 break;		 //
						 }
						  						 
						 else if( (unsigned char)cKeyCodeReceive==id)	//说明是正确的键盘码转入处理程序
						 {
							 
							
							 	 pKeyCode=sKeyCode;	
							 *pKeyCode=0x02;	   //起始同步码
		         			 ++pKeyCode;
							 *pKeyCode=id;	   //ID码
   
							 cKeyCodeReceiveState=0;
							
								 while(!cKeyCodeReceiveState)  //读码等待
								 {
									 _nop_();
								 }
								 ++pKeyCode;	
								 *pKeyCode=cKeyCodeReceive;
 	
								 cKeyCodeReceiveState=0; //取走键盘码
								  if((sKeyCode[3]>1)&&(sKeyCode[3]<12))
								  {
								    while(!cKeyCodeReceiveState)  //读码等待
								 {
									 _nop_();
								 }
								 ++pKeyCode;	
								 *pKeyCode=cKeyCodeReceive;
 	
								 cKeyCodeReceiveState=0; //取走键盘码
								  while(!cKeyCodeReceiveState)  //读码等待
								 {
									 _nop_();
								 }
								 ++pKeyCode;	
								 *pKeyCode=cKeyCodeReceive;
 	
								 cKeyCodeReceiveState=0; //取走键盘码
								  }
								  else
								  {
								   while(!cKeyCodeReceiveState)  //读码等待
								 {
									 _nop_();
								 }
								 ++pKeyCode;	
								 *pKeyCode=cKeyCodeReceive;
 	
								 cKeyCodeReceiveState=0; //取走键盘码
								  while(!cKeyCodeReceiveState)  //读码等待
								 {
									 _nop_();
								 }
								 ++pKeyCode;	
								 *pKeyCode=cKeyCodeReceive;
 	
								 cKeyCodeReceiveState=0; //取走键盘码
								  while(!cKeyCodeReceiveState)  //读码等待
								 {
									 _nop_();
								 }
								 ++pKeyCode;	
								 *pKeyCode=cKeyCodeReceive;
 	
								 cKeyCodeReceiveState=0; //取走键盘码
								  }
								 
							 y= (((unsigned long)sKeyCode[2])<<16)+(((unsigned long)sKeyCode[3])<<8)+(unsigned long)sKeyCode[4]; 
							 //构造一译码关键字
					
							 WDT_cls();
							  
				 			   switch(y)
							 {
							 case	0x014000:		  //焦距拉近	   因电路接线 必须单操作
								if(cAutoScan==1)
							{
							T0_stop();
							cAutoScan=0;    //自动扫描标志
							}
								 CameraStop();
								 Focus_near();
								 break;
								 
							 case	0x018000:		  //焦距拉远
								 if(cAutoScan==1)
							{
							T0_stop();
							cAutoScan=0;    //自动扫描标志
							}
								 CameraStop();
								 Focus_far()	;
								 break;
								 
							 case	0x011000:		  //视角宽
								  if(cAutoScan==1)
							{
							T0_stop();
							cAutoScan=0;    //自动扫描标志
							}
								 CameraStop();
								 Zoom_wide();
								 break;
								 
							 case	0x012000:		  //视角窄
								  if(cAutoScan==1)
							{
							T0_stop();
							cAutoScan=0;    //自动扫描标志
							}
								 CameraStop();
								 Zoom_tele();
								 break;
							case	0x010001:		  //光圈开
								  if(cAutoScan==1)
							{
							T0_stop();
							cAutoScan=0;    //自动扫描标志
							}
								 CameraStop();
								 IrisOpen();
								 break;
							case	0x010002:		  //光圈关
								  if(cAutoScan==1)
							{
							T0_stop();
							cAutoScan=0;    //自动扫描标志
							}
								 CameraStop();
								 IrisClose();
								 break;		 
							 case	0x010400:		  //向上	上下由T1控制
								 if(cAutoScan==1)
							{
							T0_stop();
							cAutoScan=0;    //自动扫描标志
							}
								 cDirectVertical=1 ;	
								 T0_stop();
								 if(cDirectVerticalLim==1 )
									 break;	
								 cDirectVerticalLim=0;
								 T1_start();
								 break;
							 case	0x010800:		  //向下
								if(cAutoScan==1)
							{
							T0_stop();
							cAutoScan=0;    //自动扫描标志
							}
								 cDirectVertical=-1 ;
								 T0_stop();
								 if(cDirectVerticalLim==-1 )
									 break;
									 cDirectVerticalLim=0;
								 T1_start();
								 break;
							 case	0x010200:		  //向左	左右由T0控制
							   if(cAutoScan==1)
							{
							T0_stop();
							cAutoScan=0;    //自动扫描标志
							}
								 cDirectHorizon=1;
								 T1_stop();
								 if(cDirectHorizonLim ==1 )
									 break;	
									 cDirectHorizonLim =0;	  //可以运动则复位
								 T0_start();
								 break;
							 case	0x010100:		  //向右
								if(cAutoScan==1)
							{
							T0_stop();
							cAutoScan=0;    //自动扫描标志
							}
								 cDirectHorizon=-1;
								 T1_stop();
								 if(cDirectHorizonLim ==-1 )
									 break;	
									 cDirectHorizonLim =0;	   //可以运动则复位
								 T0_start();
								 break;
							  case   0x0f0300:		  //自动扫描
							  cAutoScan=1;    //自动扫描标志
							cDirectHorizon=1;
							T0_start();
							break;
							  
								 case	0x010000:		  //结束所有运动   
								 T1_stop();
								 T0_stop();
								 CameraStop();
								 break;
							 
							 default :break;
							 }
							 
				 
							 break;				   //处理程序后的分枝完成
					
					
						 }
						 else
						 {							   //不是本球机的接收码ID不正确或者是一误码都必须会结束
							 cKeyCodeReceiveState=0;
							 break;					   //处理并且清除接收标志
						 }
						 
					   default:	   break;
					   					  }						   //结束协议一次接收
				
					 }						   //结束  if有数
					 }
  
					 break;					   //结束协议的case事件
					 				 



	}
}	
	
	
  
		/*-----------------
		目前只有键盘发码,如果相机发码则加相应处理程序
		如果需要只需用if-else语句就可以实现了
		-----------------------------------------------*/
		
		/* ---------------------------------------------------------------------------
		--------------------以下是中断程序区	----------------------------------------
		-----------------------------------------------------------------------------*/
		
		
		void left(void) interrupt IE0_VECTOR 			//水平方向
		{
			 if(cAutoScan==1)
			 {
			 cDirectHorizonLim=1; //左极限位换向变成右方向在调试时只需变成反方向即可
			  }
			  else 
			  {
			T0_stop();			 //停止定时器0运动
			cDirectHorizonLim=1; //左极限位换向变成右方向在调试时只需变成反方向即可
			 }
	
		}
		
		void right(void) interrupt IE1_VECTOR
			
		{
			if(cAutoScan==1)
			{
			 cDirectHorizonLim=-1;	//右极限位换向变成左方向在调试时只需变成反方向即可
			}
			else 
			{
			
			T0_stop();			 //停止定时器0运动
			cDirectHorizonLim=-1;	//右极限位换向变成左方向在调试时只需变成反方向即可	
			}
		}
		void up(void) interrupt IE2_VECTOR			//上下方向
		{
			if(cAutoTestVertical==1)
			{
			 cDirectVerticalLim=-1;	
			}
			else 
			{
			T1_stop();			 //停止定时器1运动
			cDirectVerticalLim=-1;	//上极限位换向变成下方向在调试时只需变成反方向即可	
			 }
			
		}
		void down(void) interrupt IE3_VECTOR
		{
			 if(cAutoTestVertical==1)
			{
			 cDirectVerticalLim=1;	
			}
			else 
			{
			T1_stop();			 //停止定时器1运动
			cDirectVerticalLim=1;	//上极限位换向变成下方向在调试时只需变成反方向即可	
			 }
		 
	
		}
		
		
		
		
		void horizonalmotor(void) interrupt TF0_VECTOR
		{
			T0_load();
		 
		 if(cAutoScan==1)
		 {
		 if(cDirectHorizonLim==1 )
		 {
			cDirectHorizonLim=0;
		   cDirectHorizon=-1;
		 }
		 if(cDirectHorizonLim==-1 )
		 {
			cDirectHorizonLim=0;
		   cDirectHorizon=1;
		 }

		 }
			switch(cDirectHorizon)
			{
			
			case -1:
				if(cHorizonStep==7)
				{
					cHorizonStep=0;
				}
				else
				{	
					++cHorizonStep;	
				}
				break;
			case 1:
				
				if(cHorizonStep==0)
				{
					cHorizonStep=7;
				}
				else
				{
					--cHorizonStep;
				}
				break;
				default:break;
			} 
	
		LeftRight_out(Left_Right[cHorizonStep]);
			
		}
		
		
		
		void verticalmotor(void) interrupt TF1_VECTOR
		{
			
			T1_load();

			if(cAutoTestVertical==1)
		 {
		 if(cDirectVerticalLim==1 )
		 {
			cDirectVerticalLim=0;
		   cDirectVertical=-1;
		 }
		 if(cDirectVerticalLim==-1 )
		 {
			cDirectVerticalLim=0;
		   cDirectVertical=1;
		 }

		 }
			switch(cDirectVertical)
			{
			case -1:
				if(cVerticleStep==7)
				{
					cVerticleStep=0;
				}
				else
				{
					++cVerticleStep;
				}
				break;
			case 1:
				if(cVerticleStep==0)
				{
					cVerticleStep=7;
				}
				else
				{
					--cVerticleStep;
				}
				break;
			 default: break;
			}
			UpDown_out(Up_Down[cVerticleStep]);
			
			
		}
		
		void receive_send(void) interrupt 	SIO_VECTOR
		{
			
			
			switch((char)RI)
			{
			case 1:
				
				RI=0;
				cKeyCodeReceiveState=1; //有接收时就置位	然后在主程序中清除
				cKeyCodeReceive=SBUF;
			
 /*------------------------------------------------------------------------------------------------*/
//	SBUF=cKeyCodeReceive;
 
 /*------------------------------------------------------------------------------------------------*/

				break;	
				
				
			case 0:
				TI=0;
				break;
			}	
		}
		

⌨️ 快捷键说明

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