📄 main.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 + -