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

📄 main.c

📁 这是一个对OSD芯片upd6464A操作的接口测试程序,使用KC51编译一个高速球键盘程序
💻 C
字号:
/*---------------------------------
记住调整ID时键盘发的码和PELCO有点相同,程序要加识别处理的

-----------------------------------*/
/*-----------------------------------------------

   明景的键盘PELCO-P球机ID为实际球机ID少1,程序要进行处理
   PELCO-D上下两代码颠倒了,UP为000     DOWN 为00108 与公布的相反
------------------------------------------------*/
#include <general.h>      //定义外部的函数
struct structSwitchStatus
{
unsigned char 	 id;
unsigned char 	 protocol;
unsigned char 	 rxdBaud;
unsigned char 	 cameraBaud;
unsigned char 	 cameraType;
};
volatile unsigned char programFlyOff;
volatile unsigned char flagTxd;
volatile unsigned long comTxd;
volatile unsigned char countTxd;
volatile unsigned char bdata  bflag;						   //通用位变量
sbit bflag_0=bflag^0; sbit bflag_1=bflag^1;	sbit bflag_2=bflag^2; 
sbit bflag_3=bflag^3; sbit bflag_4=bflag^4; sbit bflag_5=bflag^5;
sbit bflag_6=bflag^6;sbit bflag_7=bflag^7;
volatile unsigned char  cProtocol;
volatile unsigned char id;
volatile unsigned char cameraType;						   //通用位变量
unsigned char idata sKeyCode[20]={""}; //目前只用一组来表示,并且为0值	接收键盘码用
volatile unsigned char idata cKeyCodeReceiveState;	//初值处于无串口码接收到状态有值用1表示
volatile unsigned char idata cKeyCodeReceive;
volatile unsigned char idata  *pKeyCode;
struct 	structSwitchStatus  GetSwitchStatus();
volatile struct structSwitchStatus struSwitchTemp;
void TxdString(unsigned long com);
void main()
{	

volatile    unsigned int x;
volatile	unsigned long y;
	
	 
ERRor:	  
	WdtCls();
	GlobalSet();
	IntDisable();
	T0Stop();
	T1Stop();
	T2Stop();
	IntSet();
	TimerSet();
	SciSet();
	IntEnable(); 
	for(x=0;y<0xffff;x++)
	WdtCls();
	flagTxd=0xee;	//初始化发送器状态变量
	countTxd=0;
	T1Start();	   //默认的发送
	if(programFlyOff)
	{
	TxdBaud9600();
	programFlyOff=1;	
	TxdString(0);  //接口传递
	}
    struSwitchTemp=GetSwitchStatus();
	switch(struSwitchTemp.rxdBaud)
	{
	case  0: TxdBaud2400();break;
	case  1: TxdBaud9600();break;
	case  2: TxdBaud4800();break;
	case  3: TxdBaud19200();break;
	}
	switch(struSwitchTemp.cameraBaud)
	{
	case  0: RxdBaud2400();break;
	case  1: RxdBaud9600();break;
	case  2: RxdBaud4800();break;
	case  3: RxdBaud19200();break;
	}
	T2Start();
   	id=struSwitchTemp.id;
	cProtocol=struSwitchTemp.protocol;
	cameraType=struSwitchTemp.cameraType;
	cKeyCodeReceiveState=0;		  //复位接收状态
	pKeyCode=sKeyCode;				 //接收码清零程序
				 for(x=0;x<20;x++)					 //预设20个字符
				 {
					 *pKeyCode =0;
				     ++pKeyCode ;
				 }
				 pKeyCode=sKeyCode;	   //重新指向代码

 
	switch(cProtocol)  				 //与说明手册上控制位一致
	
	{
	 default:  goto ERRor;

 case PELCOD:	   
  		while(1)
			 {	
		
			 	 WdtCls();	
 			if(PELCOD!=cProtocol)   // 利用协议出错处理
			 goto ERRor;
			if(!cKeyCodeReceiveState)  	continue;
		
			if(0xff!=cKeyCodeReceive)
			{
				 cKeyCodeReceiveState=0;
				 continue;					//首码错则结束  进  入  循  环
				 }
		
			   cKeyCodeReceiveState=0; 
						 while(!cKeyCodeReceiveState)  
						 {
							 WdtCls();	

						 }
						 				 
 
 						 if( cKeyCodeReceive!=id)	//说明是正确的键盘码转入处理程序

						 {							   //不是本球机的接收码ID不正确或者是一误码都必须会结束
							 cKeyCodeReceiveState=0;
							 continue;					   //处理并且清除接收标志
						 }
 
						
							 
							 x=2;
							 	 pKeyCode=sKeyCode;	
							 *pKeyCode=0xff;	   //起始同步码
							 	
							 ++pKeyCode;
							 *pKeyCode=id;	   //ID码
   
							 cKeyCodeReceiveState=0;//已取走第2个码
							 do
							 {
							//	 x=x+*pKeyCode	;	//从第二个开始累加校验
								 while(!cKeyCodeReceiveState)  //读码等待
								 {
									 _nop_();
								 }
								 ++pKeyCode;	
								 *pKeyCode=cKeyCodeReceive;
 	
								 cKeyCodeReceiveState=0; //取走键盘码
								 ++x;	
							 }while(x!=7);	 //读码结束标志

				  
					   if( sKeyCode[3]==0x55)  continue;
						y= (sKeyCode[2]<<24)+(sKeyCode[3]<<16)+(sKeyCode[4]<<8)+sKeyCode[5];
						 //构造一译码关键字
						WdtCls();			
		

						
						



				}	 				//end case while rotate
			break; //finish case 

	 case SUMSUNG:	   //三星协议  

				while(1)
			 {	
	
			 	 WdtCls();	
 			if(SUMSUNG!=cProtocol)   // 利用协议出错处理
			 goto ERRor;
			if(!cKeyCodeReceiveState)  	continue;
			
			if(0xa0!=cKeyCodeReceive)
			{
				 cKeyCodeReceiveState=0;
				 continue;					//首码错则结束  进  入  循  环
				 }
		
			   cKeyCodeReceiveState=0; 
						 while(!cKeyCodeReceiveState)  
						 {
							 WdtCls();	

						 }
						 cKeyCodeReceiveState=0; 
						 while(!cKeyCodeReceiveState)  
						 {
							 WdtCls();	

						 }

			 							 
 
 						 if( cKeyCodeReceive!=id)	//说明是正确的键盘码转入处理程序

						 {							   //不是本球机的接收码ID不正确或者是一误码都必须会结束
							 cKeyCodeReceiveState=0;
							 continue;					   //处理并且清除接收标志
						 }
 
						
							 
							 x=3;
							 	 pKeyCode=sKeyCode;	
							 *pKeyCode=0xa0;	   //起始同步码
							
							 ++pKeyCode;  //跳过发送地址
							 ++pKeyCode;
							 *pKeyCode=id;	   //ID码
   
							 cKeyCodeReceiveState=0;//已取走第3个码
							 do
							 {
							//	 x=x+*pKeyCode	;	//从第二个开始累加校验
								 while(!cKeyCodeReceiveState)  //读码等待
								 {
									 _nop_();
								 }
								 ++pKeyCode;	
								 *pKeyCode=cKeyCodeReceive;
 	
								 cKeyCodeReceiveState=0; //取走键盘码
								 ++x;	
							 }while(x!=9);	 //读码结束标志




				}	 				//end case while rotate
			break; //finish case 

 
 case PELCOP:	   
  		while(1)
			 {	
	
			 	 WdtCls();	
 			if(PELCOP!=cProtocol)   // 利用协议出错处理
			 goto ERRor;
			if(!cKeyCodeReceiveState)  	continue;
	
			if(0xa0!=cKeyCodeReceive)
			{
				 cKeyCodeReceiveState=0;
				 continue;					//首码错则结束  进  入  循  环
				 }
		
			   cKeyCodeReceiveState=0; 
						 while(!cKeyCodeReceiveState)  
						 {
							 WdtCls();	

						 }
						 				 
 
 						 if( cKeyCodeReceive!=id)	//说明是正确的键盘码转入处理程序

						 {							   //不是本球机的接收码ID不正确或者是一误码都必须会结束
							 cKeyCodeReceiveState=0;
							 continue;					   //处理并且清除接收标志
						 }
 
						
							 
							 x=2;
							 	 pKeyCode=sKeyCode;	
							 *pKeyCode=0xa0;	   //起始同步码
							 	
							 ++pKeyCode;
							 *pKeyCode=id;	   //ID码
   
							 cKeyCodeReceiveState=0;//已取走第2个码
							 do
							 {
							//	 x=x+*pKeyCode	;	//从第二个开始累加校验
								 while(!cKeyCodeReceiveState)  //读码等待
								 {
									 _nop_();
								 }
								 ++pKeyCode;	
								 *pKeyCode=cKeyCodeReceive;
 	
								 cKeyCodeReceiveState=0; //取走键盘码
								 ++x;	
							 }while(x!=8);	 //读码结束标志



				}	 				//end case while rotate
			break; //finish case 

 case B01:	   

				while(1)
			 {	
	
			 	 WdtCls();	
 			if(B01!=cProtocol)   // 利用协议出错处理
			 goto ERRor;
			if(!cKeyCodeReceiveState)  	continue;
		
			if(0xa0!=cKeyCodeReceive)
			{
				 cKeyCodeReceiveState=0;
				 continue;					//首码错则结束  进  入  循  环
				 }
		
			   cKeyCodeReceiveState=0; 
						 while(!cKeyCodeReceiveState)  
						 {
							 WdtCls();	

						 }
													 
 
 						 if( cKeyCodeReceive!=id)	//说明是正确的键盘码转入处理程序

						 {							   //不是本球机的接收码ID不正确或者是一误码都必须会结束
							 cKeyCodeReceiveState=0;
							 continue;					   //处理并且清除接收标志
						 }
 
						
							 
							 x=2;
							 	 pKeyCode=sKeyCode;	
							 *pKeyCode=0xa0;	   //起始同步码
							 ++pKeyCode;
							 *pKeyCode=id;	   //ID码
   
							 cKeyCodeReceiveState=0;//已取走第2个码
							 do
							 {
							//	 x=x+*pKeyCode	;	//从第二个开始累加校验
								 while(!cKeyCodeReceiveState)  //读码等待
								 {
									 _nop_();
								 }
								 ++pKeyCode;	
								 *pKeyCode=cKeyCodeReceive;
 	
								 cKeyCodeReceiveState=0; //取走键盘码
								 ++x;	
							 }while(x!=11);	 //读码结束标志




				}	 				//end case while rotate
			break; //finish case 

  		while(1)
			 {	
	
			 	 WdtCls();	
 			if(YAAN!=cProtocol)   // 利用协议出错处理
			 goto ERRor;
			if(!cKeyCodeReceiveState)  	continue;
		
			if(0x02!=cKeyCodeReceive)
			{
				 cKeyCodeReceiveState=0;
				 continue;					//首码错则结束  进  入  循  环
				 }
		
			   cKeyCodeReceiveState=0; 
						 while(!cKeyCodeReceiveState)  
						 {
							 WdtCls();	

						 }
						 				 
 
 						 if( cKeyCodeReceive!=id)	//说明是正确的键盘码转入处理程序

						 {							   //不是本球机的接收码ID不正确或者是一误码都必须会结束
							 cKeyCodeReceiveState=0;
							 continue;					   //处理并且清除接收标志
						 }
 	
							 	 pKeyCode=sKeyCode;	
							 *pKeyCode=0x02;	   //起始同步码
							 	
							 ++pKeyCode;
							 *pKeyCode=id;	   //ID码
   
							 cKeyCodeReceiveState=0;//已取走第2个码
							  while(!cKeyCodeReceiveState)  //读码等待
								 {
									 _nop_();
								 }
								 ++pKeyCode;	
								 *pKeyCode=cKeyCodeReceive;
 	
								 cKeyCodeReceiveState=0; //取走键盘码
								  if((sKeyCode[2]>1)&&(sKeyCode[2]<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; //取走键盘码
								  }
							 




				}	 				//end case while rotate
			break; //finish case 



	}   //switch cProtocol end

}   //end main			 
				 
  	
								
	
  
	
		
		void receive_send(void) interrupt 	SIO_VECTOR
		{	
		   
			switch((char)RI)
			{
			case 1:
				
				RI=0;
				cKeyCodeReceiveState=1; //有接收时就置位	然后在主程序中清除
				cKeyCodeReceive=SBUF;
				break;	
							
			case 0:
				TI=0;
				if(flagTxd==0xff)
				{
				 SBUF=(unsigned char)(comTxd>>countTxd);
				 ++countTxd;
				 if(countTxd==4)
				  flagTxd=0xee;
				  }
				  break;				
			}	
		}
		

 struct 	structSwitchStatus  GetSwitchStatus()
 {
volatile struct 	structSwitchStatus	statu;
bflag=0;
ID0=ID1=ID3=ID4=ID5=ID6=1;
bflag_0=!ID0 ;bflag_1=!ID1 ;bflag_2=!ID2 ;bflag_3=!ID3 ;bflag_4=!ID4 ;
bflag_5=!ID5 ;bflag_6=!ID6 ;
statu.id=bflag;
bflag=0;
PROTOCOL0=PROTOCOL1=PROTOCOL2=PROTOCOL3=1;
bflag_0=!PROTOCOL3 ;bflag_1=!PROTOCOL2 ;bflag_2=!PROTOCOL1;bflag_3=!PROTOCOL0 ; 
statu.protocol=bflag;
bflag=0;
BAUD0=BAUD1=1;
bflag_0=!BAUD1 ; bflag_1=!BAUD0 ; 
statu.rxdBaud=bflag;
bflag=0; 
CAMBAUD0=CAMBAUD1=1;
bflag_0=!CAMBAUD1 ; bflag_1=!CAMBAUD0 ;   
statu.cameraBaud=bflag;
bflag=0; 
CAMERA0=CAMERA1=1;
bflag_0=!CAMERA1 ; bflag_1=!CAMERA0  ;   
statu.cameraType=bflag;
return(statu);
}
void TxdString(unsigned long com)
{
if(flagTxd==0xee)
{
flagTxd=0xff;
countTxd=0;
comTxd=com;
SBUF=0xff;
}
}

⌨️ 快捷键说明

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