?? gpsall.c
字號:
Datalcm = X; /*命令輸出到數據口 */
Elcm = 1;_nop_();Elcm = 0; /*讀入到LCM*/
}
/********************************************************/
/* 分區操作允許等待,返回時保留分區選擇狀態 */
/********************************************************/
void lcdbusyL(void)
{
CS1LCM = 0; /*CLR CS1 */
CS2LCM = 0; /*SETB CS2 */
// CS3LCM = 1; /*SETB CS3 */
wtcom(); /* waitting for enable */
}
void lcdbusyM(void)
{
CS1LCM = 1; /*SETB CS1 */
CS2LCM = 0; /*CLR CS2 */
// CS3LCM = 1; /*SETB CS3 */
wtcom(); /* waitting for enable */
}
void lcdbusyR(void)
{
CS1LCM = 0; /*SETB CS1 */
CS2LCM = 1; /*SETB CS2 */
// CS3LCM = 0; /*CLR CS3 */
wtcom(); /* waitting for enable */
}
void wtcom(void)
{
Dilcm = 0; /*CLR DI */
Rwlcm = 1; /*SETB RW */
Datalcm = 0xFF; /*MOV DATA_LCM,#0FFH */
Elcm = 1;_nop_();
while(Datalcm & Lcdbusy);
Elcm = 0;
}
/********************************************************/
/*根據設定的坐標數據,定位LCM上的下一個操作單元位置 */
/********************************************************/
void Locatexy(void)
{
unsigned char x,y;
switch (col&0xc0) /* col.and.0xC0 */
{ /*條件分支執行 */
case 0: {lcdbusyL();break;} /*左區 */
case 0x40: {lcdbusyM();break;} /*中區 */
case 0x80: {lcdbusyR();break;} /*右區 */
}
x = col&0x3F|SETX; /* col.and.0x3f.or.setx */
y = row&0x07|SETY; /* row.and.0x07.or.sety */
wtcom(); /* waitting for enable */
Dilcm = 0; /*CLR DI */
Rwlcm = 0; /*CLR RW */
Datalcm = y; /*MOV P0,Y */
Elcm = 1;_nop_();Elcm = 0;
wtcom(); /* waitting for enable */
Dilcm = 0; /*CLR DI */
Rwlcm = 0; /*CLR RW */
Datalcm = x; /*MOV P0,X */
Elcm = 1;_nop_();Elcm = 0;
}
/********************************/
/*液晶屏初始化 */
/********************************/
void Lcminit(void)
{
cbyte = DISPOFF; /*關閉顯示屏 */
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
cbyte = DISPON; /*打開顯示屏 */
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
cbyte = DISPFIRST; /*定義顯示起始行為零 */
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
Lcmcls();
col=0; /*清屏 */
row=0;
Locatexy();
L_RSET = 1;
}
/********************************/
/* 延時 */
/********************************/
void Delay(uchar MS)
{
uchar us,usn;
while(MS!=0)
{ usn = 4;
while(usn!=0)
{
us=0xf0;
while (us!=0){us--;};
usn--;
}
MS--;
}
}
/****************************************
--------- 延時函數 ,大約1MS.-----------
****************************************
void DELAY(uint z)
{
uchar data l;
while((z--)>0)
{
for(l=0;l<31;l++) RestWatchdog(); //125 _nop_();
}
} */
/**************************************************************
---------------鍵盤掃描程序,返回按下的鍵值代碼----------------
-- 有鍵按下返回鍵值代碼,無鍵按下返回0,有鍵但沒松開返回0XFF --
**************************************************************/
uchar Key_Press(bit b) //按鍵掃描程序
//b=0/沒鍵按下跳出;b=1/等待按鍵
{
uchar data i,key,j=1,d;
//RetKey=0xff;
key=0x3f;
A0: d=0xc0&P1;
P1=0x07|d; //置三列為低,三行為高
//P2=0; // 查詢有無按鍵按下
_nop_();
_nop_();
key=0x3f&P1; //屏蔽掉高兩位
//key=P0;
if(key==7 )
{ // 無鍵按下
if(b==1) goto A0;
KP: RetKey=NoKeyPress; KeyStatus=Up;
goto ENDKPONE;
}
else
{
for(d=0;d<250;d++) RestWatchdog(); /* 254 */
TR0=0;
ET0=0;
key=0x3f&P1;
if(key==7) goto KP; /* 除去因抖動引起的錯誤按鍵信息 */
RetKey=ScanKey(); /*有鍵按下*/
}
ENDKPONE:
return(RetKey);
}
uchar ScanKey(void)
{
uchar data i,key,d,j=0,a[3]={0x37,0x2f,0x1f};
//P1=0xf8;
//key=P1;
for(i=0;i<3;i++)
{ d=0xc0&P1; // 掃描哪個按鍵按下
P1=a[i]|d; // 列掃描
key=7&P1; //屏蔽掉高五位
if(key!=7)
{
//j=i*3; //j behalf column
for(i=0;i<3;i++)
{ /* 行掃描 */
if(key%2==0) break;
key=key>>1;
}
key=j+i*3; /* 按鍵的行列值之和 */
TranDataBy232(key);
OpeningBeep(1);
goto ENDKP1;
}
j++;
RestWatchdog();
}
ENDKP1: return(key);
}
void RestWatchdog(void)
{
_nop_();
_nop_();
_nop_();
}
/*======顯示開機界面======================*/
void DispFirstmenu(void)
{
col=0;
row=2;
Putstr(STR1,10); /*第二行字符輸出,12字節 */
//Putstr(STR4,24);
//col=0;
//row=4;
//Putstr(STR3,30); /*第三行字符輸出,24字節 */
col=0;
row=6;
Hzflag=1;
Putstr(STR1,12); /*第四行字符輸出,12字節 */
}
/*======顯示主菜單======================*/
void DispMainmenu(void)
{
Lcmcls();
col=0;
row=0;
Putstr(STR2,24); /*第一行字符輸出,12字節 */
col=0;
row=2;
Putstr(STR3,24); /*第二行字符輸出,12字節 */
col=0;
row=4;
Putstr(STR4,30); /*第三行字符輸出,24字節 */
}
//======ready or return menu=========
void RdyorRetMenu(void)
{
col=0;
row=6;
Putstr(STR7,24); /*第四行字符輸出,12字節 */
}
//======顯示單點測量界面=============
void DispPointMenu(void)
{
col=0;
row=0;
Putstr(STR6,24); /*第一行字符輸出,12字節 */
RdyorRetMenu();
}
void PointMeasure(void)
{
Lcmcls();
DispPointMenu();
RetKey=0xff;
while(1)
{
FlashGreenled(1);
Key_Press(0);
if (RetKey==5)
{
RecvToBuf();
col=2;
row=4;
Putstr(ComBuf,22);
RetKey=0xff;
}
if(RetKey==8)
{RetKey=0xff; return;}
}
}
//=====與OEM板通訊測試=============
void ComTest(void)
{
Lcmcls();
RdyorRetMenu();
while(1)
{
FlashGreenled(1);
Key_Press(0);
if (RetKey==5)
{
RecvToBuf();
col=0;
row=2;
if(uc0==Error)
Putstr(STR0,24);
else
Putstr(STR0,24);
RetKey=0xff;
}
if(RetKey==8)
{RetKey=0xff; return;}
}
}
void Mainmenu(void)
{
DispMainmenu();
Putstr(STR5,24); /*第四行字符輸出,12字節 */
while(1)
{
Lcmclsline(4);
Key_Press(0);
switch(RetKey){
case Tab1: //Point Measurement
PointMeasure();
DispMainmenu();
break;
case Tab2: //Length Measurement
//LengthMeasure();
DispMainmenu();
break;
case Tab3: //Area Measurement
//AreaMeasure();
DispMainmenu();
break;
case Tab4: //Set
ComTest();
DispMainmenu();
break;
default: break;
}
col=0;
row=6;
Putstr(STR5,24); /*第四行字符輸出,12字節 */
}
}
/*****************************************************
-------從串行端口發送一字節數據------
*****************************************************/
void TranDataBy232(uchar d)
{
SBUF=d;
while(TI==0) RestWatchdog();
TI=0;
}
/*****************************************************
-------從串行端口接收一字節數據,并存入UC0變量中------
*****************************************************/
void RcvDataBy232(void)
{
counter=0;
do{
counter++;
RestWatchdog();
if(counter>0x6ff)
{
uc0=Error;
goto rete1;} // 1fff
RestWatchdog();
} while(RI==0);
uc0=SBUF;
rete1: RI=0;
}
/***********************************************************************
-- 從機接收主機按如下命令格式發送來的信息,數據保存至UN.COMBUF緩沖區中:
-- 包頭(10):(1,$) + G(1) + P(1) + R(1) +M(1) +C(1)+, + 數據 +*(1) + Checksum(2)
-- 數據(56):UTC(6)+,(1)+VorA(1)+,(1)+緯度(9)+,(1)+N(1)+,(1)+經度(10)+,(1)+E(1)+,(1)+其它(22);
***********************************************************************/
void RecvToBuf(void)
{
uchar data i;
uint data pp,tempint;
RcvDataBy232();
if(uc0!=0x24)
{ uc0=0xff; goto ret1; } /* 不是包頭$ */
RcvDataBy232();
if(uc0!=0x47)
{ uc0=0xff; goto ret1; } /* 識別G */
RcvDataBy232();
if(uc0!=0x50)
{ uc0=0xff; goto ret1; } /* 識別P */
RcvDataBy232();
if(uc0!='R')
{ uc0=0xff; goto ret1; } /* 識別R */
RcvDataBy232();
if(uc0!='M')
{ uc0=0xff; goto ret1; } /* 識別M */
RcvDataBy232();
if(uc0!='C')
{ uc0=0xff; goto ret1; } /* 識別C */
for (i=0;i<8;i++)
RcvDataBy232(); //接收UTC時間和2個,號
//pp=0xaa; /* 清校驗和 */
RcvDataBy232();
if(uc0!='A')
{ uc0=0xff; goto ret1; } //接收拉收機狀態標志位 A:有效定位V:無效
//pp=pp+uc0;
RcvDataBy232(); //接收","
//pp=pp+uc0;
//RcvDataBy232(); pp=pp+uc0;
//Slen=uc0;
for(i=0;i<22;i++){ //接收緯度和經度
RcvDataBy232();
ComBuf[i]=uc0; //將ASCII轉換成DEC
//pp+=uc0;
}
RcvDataBy232(); /* 接收校驗和 */
tempint=0;
tempint=(uint)(uc0*256);
RcvDataBy232();
tempint=tempint+uc0;
if(tempint==pp){ /* 效驗和相同 */
// SBUF=OK;
//TranDataBy232();
//fini=1;
}
else{ /* 如果接收效驗和不相同,則回送失敗信息給主機 */
SBUF=Error;
// TranDataBy232();
//fini=0;
}
ret1: _nop_();
}
/***********************************************************************
-- 從機向主機發送數據,數據已存在UN.COMBUF緩沖區中:
-- 包頭(1,0xAA) + 命令(1) + 長度(1) + 數據 + Checksum(1)
***********************************************************************/
void SendBuf(uchar order,uchar len)
{
uchar data i;
uint data CheSum;
ulong l=0;
do{
do{
SBUF=0xaa;
//TranDataBy232();
RcvDataBy232();
} while(uc0!=0xbb); /* 等待主機回送準備好 0XBB */
SBUF=order; /* 發送命令句柄 */
// TranDataBy232();
CheSum=order; /* 初始化校驗和 */
SBUF=len; /* 發送數據長度 */
//TranDataBy232();
CheSum+=len;
for(i=0;i<len;i++){ /* 發送數據 */
// SBUF=Un.ComBuf[i];
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -