📄 remoter.c
字号:
#if 0
// Data frame format MaxLen=255
// Token + type + frameLen + Data + CheckSum
//frameLen is sum of Token,type,frameLen+data+CheckSum
// Token = 0x24
#include<common.h>
//extern uChar CompareData(void);
//extern uChar GetCurLongitudeLatitude(uChar *p);
extern uChar Handle776InfoData(uChar *p);
extern uChar CompareData(void);
extern void ViewGpsDat();
extern uChar GetCurLongitudeLatitude(uChar *p);
volatile uChar gIrKeyValue=0;
volatile uChar gNecState = Nec_Null;
volatile uInt2 gIrTick;//per tick 200us
void Init(void);
void delay(uchar);
void SendCharsToSerial(uchar *p,uchar);
void PrintNum(uChar i);
volatile uInt2 gSystemTick=0;
volatile uChar g500usCnt = 0;
volatile uChar g100msCnt = 0;
volatile uChar xdata pReceiveBuffer[150] ;
volatile uChar gGetInfoDataSuccessFlag=0;
//max 100 station.
uChar gTotalStation=0;
uChar gReceiveTotalStation=0;
GpsInfo xdata pGpsInfo[50];
uInt4 gCurLongitude = 0;
uInt4 gCurLatitude = 0;
volatile uChar gReceiveTimeout = 8;
volatile uChar gSerialReceiveFlag=0;
volatile uInt2 gSendTimeout = 0;
volatile uInt2 gSendArray=0;
volatile uChar gSendBit=0;
volatile uInt2 gSendLen = 0;
volatile uChar g776SendFlag=0;
//volatile uChar idata p776SendArray[20];
volatile uChar g776SendBytePos=0;
volatile uChar g776SendBitPos=0;
volatile uChar g776SendFinishFlag = 0;
volatile uChar g776SendTimeout = 0;
const uChar code pByteMap[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void Delay_100ms(uChar param)
{
g100msCnt=param;
while(1)
{
if((g500usCnt==0)&&(g100msCnt==0))
break;
}
}
void init_reg(void)
{
CHPENT=0x87;
CHPENT=0x59;
CHPCON|=0x10;
CHPENT=0;
}
void Init(void)
{
TMOD=0x21;
TH0=0xfa;
TL0=0x00;
ET0=1;
EX0=0;
EX1=1;
// TH1=0xfa;//0xf4 is 4800 for 22.1184 ,0xfa is 9600 for 22.1184
// TL1=0xfa;//0xfd for 19200
TH1=0xf4;
TL1=0xf4;
ET1=0;
// PCON=0x80; //bandrate=19200 for 11.0592
PCON=0x00; //bandrate=19200 for 22.1184
SCON=0x50;
RI=TI=0;
ES=1;
TR1=1;
TR0=1;
EA=1;
IT0=1;
IT1=1;
P1=0xff;
IP=0x05;
OpenInt0AndCloseSerial();
init_reg();
}
void SendCharsToSerial(uchar *p,uchar count)
{
uchar i;
EA=0;
for(i=0 ; i<count; i++)
{
SBUF = p[i];
while(!TI);
TI=RI=0;
}
EA=1;
}
void PrintNum(uChar i)
{
#define SBUF_SERIAL SBUF=tTemp + 0x30; \
while(!TI); \
TI=RI=0
uChar tTemp = i/100;
EA=0;
SBUF_SERIAL;
tTemp = (i%100)/10;
SBUF_SERIAL;
tTemp = i%10;
SBUF_SERIAL;
EA=1;
}
void Timer0()interrupt 1 //for all sort of timeout and system'tick
{
TR0 = 0 ;
// TH0=0xfb;
// TL0=0xf5; //560us for 22.1184M
TH0=0xfe;
TL0=0x8f; //200us for 22.1184M
TR0 = 1 ;
if(gReceiveTimeout)
gReceiveTimeout--;
if(gSendTimeout)
gSendTimeout--;
if(g776SendTimeout)
g776SendTimeout--;
if(g500usCnt)
g500usCnt--;
if((g100msCnt)&&(g500usCnt==0))
{
g500usCnt = 200;
g100msCnt--;
}
gSystemTick++;
GUEST ^=0x01;
}
void Int1() interrupt 2 //for remoter
{
#define dIr_Margin 2
static uChar sTempCnt = 0;
static uChar sIrBuffer[4];
switch(gNecState)
{
case Nec_Null:
gIrTick=gSystemTick;
gNecState = Nec_Head;
sTempCnt=0;
break;
case Nec_Head:
{
if((gSystemTick>=(gIrTick+67-dIr_Margin)) && (gSystemTick<=(gIrTick+67+dIr_Margin)))
{
gIrTick=gSystemTick;
gNecState = Nec_FacDat;
}
else
{
gNecState = Nec_Null;
}
break;
}
case Nec_FacDat:
if((gSystemTick>=(gIrTick+6-dIr_Margin)) && (gSystemTick<=(gIrTick+6+dIr_Margin)))//0
sIrBuffer[sTempCnt/8] &= ~pByteMap[sTempCnt%8];
else if((gSystemTick>=(gIrTick+11-dIr_Margin)) && (gSystemTick<=(gIrTick+11+dIr_Margin)))//1
sIrBuffer[sTempCnt/8] |= pByteMap[sTempCnt%8];
else
gNecState = Nec_Null;
sTempCnt++;
gIrTick = gSystemTick ;
if(sTempCnt==32)
{
gNecState = Nec_Null;
if((sIrBuffer[0]==~sIrBuffer[1])&&(sIrBuffer[2]==~sIrBuffer[3]))
gIrKeyValue = sIrBuffer[2];
}
break;
default:
gNecState = Nec_Null;
break;
}
}
void Int0() interrupt 0 //for bi_communication
{
//for receive data from 776
if(g776SendFlag==1)
{
DAT = 1;
if(DAT==1)
// p776SendArray[g776SendBytePos] |= pByteMap[g776SendBitPos];
pReceiveBuffer[g776SendBytePos] |= pByteMap[g776SendBitPos];
else
// p776SendArray[g776SendBytePos] &= ~pByteMap[g776SendBitPos];
pReceiveBuffer[g776SendBytePos] &= ~pByteMap[g776SendBitPos];
g776SendTimeout = 200;
g776SendBitPos++;
if(g776SendBitPos==8)
{
g776SendBitPos=0;
// if(++g776SendBytePos==(p776SendArray[2]))
if(++g776SendBytePos==(pReceiveBuffer[2]))
if(g776SendBytePos>4)
{
g776SendBytePos=0;
g776SendFlag = 0;
DAT = 1;
g776SendFinishFlag = 1;
}
}
return;
}
//send data to 776
if((gSendArray==0)&&(gSendBit==0))
return;
if(pReceiveBuffer[gSendLen-gSendArray]&pByteMap[8-gSendBit])
DAT =1;
else
DAT =0;
gSendTimeout = 200;
if(gSendBit)
gSendBit-=1;
if((gSendBit==0)&&(gSendArray))
{
gSendArray--;
if(gSendArray)
gSendBit=8;
else
DAT = 1;//finished send
}
}
void delay(uChar a)//delay(1) for 500us
{
uChar i,k;
for(k=0 ;k<a; k++)
for(i=0 ;i<200; i++)
_nop_();
}
void Serial_int(void) interrupt 4
{ //$GPRMC,212110.64,V,3339.1116,N,11742.9893,W
//pReceive[]=",212110.64,V,3339.1116,N,11742.9893,W";
code uChar pGPRMC[]={0x24, 0x47, 0x50, 0x52 ,0x4d ,0x43};//"$GPRMC";
static uChar sReceiveState=0;
uChar c;
if(_testbit_(RI))
{
RI=0;
TI=0;
c=SBUF;
if(sReceiveState<6)
{
if(pGPRMC[sReceiveState] != c)
{
sReceiveState = 0;
return;
}
sReceiveState++;
}else
{
pReceiveBuffer[sReceiveState-6]=c;
sReceiveState++;
if(sReceiveState == 43)
{
sReceiveState = 0;
gSerialReceiveFlag = 1;
}
}
}
if(sReceiveState>2)
{
if(gReceiveTimeout==0)
sReceiveState = 0;
gReceiveTimeout=200;
}
else
gReceiveTimeout=200;
}
void SendDataTo776(uChar type ,uChar len,uChar *pTemp)
{
uChar *pSendTo776Buffer = pReceiveBuffer;
uChar i;
uChar tTempSum=0;
OpenInt0AndCloseSerial();
pSendTo776Buffer[0]=0x24;
pSendTo776Buffer[1]=type;
pSendTo776Buffer[2]=len + 4;//4 for Token+type+len+CheckSum;
for(i=0 ;i<len; i++)
pSendTo776Buffer[3+i] = pTemp[i];
for(i=0 ;i<(len+3); i++)
tTempSum = pSendTo776Buffer[i];
pSendTo776Buffer[len+3] = tTempSum;
gSendArray = len+4;
gSendLen = gSendArray;
gSendBit=8;
gSendTimeout = 200;
DAT = 0;
}
void main(void)
{
delay(20);
Init();
Delay_100ms(2);
while(1)
{
if(gGetInfoDataSuccessFlag == 0)
{
if((gReceiveTotalStation == gTotalStation)&&(gReceiveTotalStation!=0))
{
gGetInfoDataSuccessFlag = 1;
SendDataTo776(0xff,2,"OK");
}
}
if(gIrKeyValue)
{
PrintNum(gIrKeyValue);
if(gIrKeyValue == _Key_2)
{
uChar pTemp[2];
pTemp[0]=0x05;
pTemp[1]=~0x05;
SendCharsToSerial("SendData\n",9);
SendDataTo776(0x01,2,pTemp);
// ViewGpsDat();
}
if(gIrKeyValue == _Key_3)
{
PrintNum(gTotalStation);
PrintNum(gReceiveTotalStation);
}
if(gIrKeyValue == _Key_4)
{
gCurLongitude = 0x12345678;
gCurLatitude = 0x123456789;
if(CompareData()!=0)
SendCharsToSerial("find\n",5);
else
SendCharsToSerial("no find\n",8);
PrintNum(gTotalStation);
}
gIrKeyValue=0;
}
if(gSerialReceiveFlag == 1)
{
gSerialReceiveFlag = 0;
SendCharsToSerial(pReceiveBuffer,43);
// if(GetCurLongitudeLatitude(pReceiveBuffer))
{
uChar pTemp[2];
pTemp[0] = CompareData();
pTemp[1]=~pTemp[0];
// if(pTemp!=0)
SendDataTo776(0x0,2,pTemp);
}
}
if(g776SendFinishFlag == 1)
{
g776SendFinishFlag = 0;
EnterCrucial();
DAT=1;
PrintNum(pReceiveBuffer[2]);
if(Handle776InfoData(pReceiveBuffer)==TRUE)
SendCharsToSerial("GPS Succed!\n",12);
else
SendCharsToSerial("GPS Fail!\n",10);
ExitCrucial();
CloseInt0AndOpenSerial();
}
if((gSendTimeout ==0)&&((gSendArray!=0)||(gSendBit!=0)))//fail send and restart .
{
OpenInt0AndCloseSerial();
gSendTimeout = 200;
gSendArray =gSendLen;
gSendBit=8;
DAT = 0;
}
if(gNecState != Nec_Null)
{
if(gSystemTick>(gIrTick+67))
{
SendCharsToSerial("Nec_Null\n",9);
gNecState = Nec_Null;
}
}
if((gSendArray==0)&&(gSendBit ==0)&&(g776SendFlag==0))
{
CloseInt0AndOpenSerial();
DAT=1;
CLK=1;
if(DAT == 0)
{
DAT = 0;
g776SendFlag = 1;
g776SendBitPos=0;
g776SendBytePos = 0;
g776SendTimeout=200;
OpenInt0AndCloseSerial();
}
}
if((g776SendTimeout==0)&&(g776SendFlag == 1))//fail and GiveUp
{
g776SendFlag = 0;
g776SendBytePos = 0;
g776SendBitPos = 0;
SendCharsToSerial("AA!\n",4);
DAT = 1;
CloseInt0AndOpenSerial();
}
}//while(1)
}
#else
//#include<reg52.h>
#include "reg51.h"
sbit STB = P2^1;
sbit CLK = P2^2;
sbit DAT = P2^3;
#define uchar unsigned char
#define uint unsigned int
void InputBYTE(uchar tTemp);
void Long_Delay(void)
{
int i=4000;
while(i--);
}
void delay(void)
{
uchar i;
for(i=0;i<1;i++);
}
void send(uchar tTemp)
{
STB=1;
DAT=1;
CLK=1;
STB=0;
InputBYTE(tTemp);
STB=1;
DAT=1;
CLK=1;
}
void InputBYTE(uchar tTemp)
{
uchar ar,i;
#if 0
for(i=0;i<8;i++)
{
delay();
CLK=0;
delay();
ar=0x01;
ar<<=i;
if(tTemp&ar)
DAT=1;//为1则置高电平
else
DAT=0;//为0则置低电平
CLK=1;//置脉冲
delay();
}
#else
ar=0x01;
for(i=0;i<8;i++)
{
CLK=0;
if(ar&tTemp)
DAT=1;
else
DAT=0;
ar<<=0x01;
CLK=1;
}
#endif
}
void InputBYTE2(uchar tTempValue)
{
uchar i;
uchar tTemp=0x01;
for(i=0;i<8;i++)
{
CLK=0;
if(tTemp&tTempValue)
DAT=1;
else
DAT=0;
tTemp<<=0x01;
CLK=1;
}
}
void displaymodeset()
{
delay();
send(0x02);
delay();
}
void dataset()
{
delay();
send(0x40);
delay();
}
void displaycontrolset()
{
delay();
send(0x8c);
delay();
}
void senddata(uchar ucaddr,uchar senda)
{
delay();
STB=1;
delay();
STB=0;
delay();
InputBYTE(ucaddr);
// delay();
InputBYTE(senda);
STB=1;
delay();
}
void UpdateVFD(uchar add,uchar dat);
void main(void)
{
int i;
dataset();//数据设置命令
displaymodeset();//显示模式设置命
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -