?? lcd3.c.bak
字號(hào):
#include <absacc.h>
#include <reg51.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <zifu.c>
#include <hz.c>
#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
#define LC_CUR_POS 0x21 // 光標(biāo)位置設(shè)置
#define LC_CGR_POS 0x22 // CGRAM偏置地址設(shè)置
#define LC_ADD_POS 0x24 // 地址指針位置
#define LC_TXT_STP 0x40 // 文本區(qū)首址
#define LC_TXT_WID 0x41 // 文本區(qū)寬度
#define LC_GRH_STP 0x42 // 圖形區(qū)首址
#define LC_GRH_WID 0x43 // 圖形區(qū)寬度
#define LC_MOD_OR 0x80 // 顯示方式:邏輯“或”
#define LC_MOD_XOR 0x81 // 顯示方式:邏輯“異或”
#define LC_MOD_AND 0x82 // 顯示方式:邏輯“與”
#define LC_MOD_TCH 0x83 // 顯示方式:文本特征
#define LC_DIS_SW 0x9B // 顯示開(kāi)關(guān):D0=1/0:光標(biāo)閃爍啟用/禁用;
// D1=1/0:光標(biāo)顯示啟用/禁用;
// D2=1/0:文本顯示啟用/禁用;
// D3=1/0:圖形顯示啟用/禁用;
#define LC_CUR_SHP 0xA0 // 光標(biāo)形狀選擇:0xA0-0xA7 表示光標(biāo)占的行數(shù)
#define LC_AUT_WR 0xB0 // 自動(dòng)寫(xiě)設(shè)置
#define LC_AUT_RD 0xB1 // 自動(dòng)讀設(shè)置
#define LC_AUT_OVR 0xB2 // 自動(dòng)讀/寫(xiě)結(jié)束
#define LC_INC_WR 0xC0 // 數(shù)據(jù)一次寫(xiě),地址加1
#define LC_INC_RD 0xC1 // 數(shù)據(jù)一次讀,地址加1
#define LC_DEC_WR 0xC2 // 數(shù)據(jù)一次寫(xiě),地址減1
#define LC_DEC_RD 0xC3 // 數(shù)據(jù)一次讀,地址減1
#define LC_NOC_WR 0xC4 // 數(shù)據(jù)一次寫(xiě),地址不變
#define LC_NOC_RD 0xC5 // 數(shù)據(jù)一次讀,地址不變
#define LC_SCN_RD 0xE0 // 屏讀
#define LC_SCN_CP 0xE8 // 屏拷貝
#define LC_BIT_OP 0xF0 // 位操作:D0-D2:定義D0-D7 位;D3:1 置位;0:清除
#define LCMDW XBYTE[0x7AFF] // 數(shù)據(jù)口
#define LCMCW XBYTE[0x7BFF] // 命令口
void key(void);
uchar xdata rbuf[500];
uchar xdata tbuf[88];
uint r_in;
uchar c,q;
uchar a,b;
uchar key_flag;
uchar x,y;
uchar t=0;
uchar gCurRow,gCurCol;
uint d,g,n,h;
uchar uRow,uCol;
uint i,e,f;
uchar fnGetRow(void)
{
return gCurRow;
}
uchar fnGetCol(void)
{
return gCurCol;
}
void fnST01(void) // 狀態(tài)位STA1,STA0 判斷(讀寫(xiě)指令和讀寫(xiě)數(shù)據(jù))
{uchar sta;
do{ sta=LCMCW & 0x03; }
while(sta!=0x03);
}
/*void fnST2(void) // 狀態(tài)位ST2 判斷(數(shù)據(jù)自動(dòng)讀狀態(tài))
{
uchar sta;
do{ sta=LCMCW & 0x04; }
while(sta!=0x04);
}*/
void fnST3(void) // 狀態(tài)位ST3 判斷(數(shù)據(jù)自動(dòng)寫(xiě)狀態(tài))
{
uchar sta;
do{ sta=LCMCW & 0x08; }
while(sta!=0x08);
}
/*uchar fnST6(void) // 狀態(tài)位ST6 判斷(屏讀/屏拷貝狀態(tài))
{
uchar i;
for(i=10;i>0;i--)
{
if((LCMCW & 0x40) == 0x40)
break;
}
return i; // 若返回零,說(shuō)明錯(cuò)誤
}*/
void fnPR1(uchar uCmd,uchar uPar1,uchar uPar2) // 寫(xiě)雙參數(shù)的指令
{
fnST01();
LCMDW = uPar1;
fnST01();
LCMDW = uPar2;
fnST01();
LCMCW = uCmd;
}
void fnPR11(uchar uCmd,uchar uPar1) // 寫(xiě)單參數(shù)的指令
{
fnST01();
LCMDW = uPar1;
fnST01();
LCMCW = uCmd;
}
void fnPR12(uchar uCmd) // 寫(xiě)無(wú)參數(shù)的指令
{fnST01();
LCMCW = uCmd;
}
void fnPR13(uchar uData) // 寫(xiě)數(shù)據(jù)
{fnST01();
LCMDW = uData;
}
/*uchar fnPR2(void) // 讀數(shù)據(jù)
{fnST01();
return LCMDW;
}*/
// 設(shè)置當(dāng)前地址
void fnSetPos(uchar urow, uchar ucol)
{
uint iPos;
iPos = urow * 30 + ucol;
fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256);
gCurRow = urow;
gCurCol = ucol;
}
// 設(shè)置當(dāng)前顯示行、列
void cursor(uchar uRow, uchar uCol)
{
fnSetPos(uRow * 16, uCol);
}
//指針設(shè)置
void Text_Curser(uchar x3,uchar y3)
{fnPR1(0x21,x3,y3);
a=x3;
b=y3;}
// 清屏
void cls(void)
{
uint i;
fnPR1(LC_ADD_POS,0x00,0x00); // 置地址指針
fnPR12(LC_AUT_WR); // 自動(dòng)寫(xiě)
for(i=0;i<240*128;i++)
{
fnST3();
fnPR13(0x00); // 寫(xiě)數(shù)據(jù)
}
fnPR12(LC_AUT_OVR); // 自動(dòng)寫(xiě)結(jié)束
fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指針
gCurRow = 0; // 置地址指針存儲(chǔ)變量
gCurCol = 0;
}
// LCM 初始化
void fnLCMInit(void)
{
fnPR1(LC_TXT_STP,0xDF,0x01) ; // 文本顯示區(qū)首地址
fnPR1(0x41,0x1E,0x00); // 文本顯示區(qū)寬度
fnPR1(LC_GRH_STP,0x00,0x00); // 圖形顯示區(qū)首地址
fnPR1(LC_GRH_WID,0x1E,0x00); // 圖形顯示區(qū)寬度
fnPR12(0xA0); // 光標(biāo)形狀
fnPR12(0x80); // 顯示方式設(shè)置
fnPR12(0x9F); // 顯示開(kāi)關(guān)設(shè)置
cls();
}
//延時(shí)
void shortdelay(uint tt)
{ uchar i;
while(tt)
{i=100;
while(i)
i--;
tt--;};
}
//顯示一個(gè)字符
void dchar(uchar x,uchar y,uchar a)
{uchar j,uRow,uCol;
for(j=0;j<16;j++)
{
uRow=y;
uCol=x;
fnSetPos(uRow*16+j,uCol);
uRow = fnGetRow();
uCol = fnGetCol();
fnPR12(LC_AUT_WR);
fnPR13(ASC_MSK[(a-0x20)*16+j]);
fnPR12(LC_AUT_OVR);
}
}
//顯示字符串
void dstring(uchar x,uchar y,uchar *ptr)
{
char c1;
uchar i,j,uLen,uRow,uCol;
uLen=strlen(ptr);
for(i=0;i<uLen;i++)
{c1 =ptr[i];
for(j=0;j<16;j++)
{uRow=y;
uCol=x;
fnSetPos(uRow*16+j,uCol);
uRow = fnGetRow();
uCol = fnGetCol();
fnPR12(LC_AUT_WR);
fnPR13(ASC_MSK[(c1-0x20)*16+j]);
fnPR12(LC_AUT_OVR);}
if(x<29)
{x++;}
else
{y++;x=0;}}
}
//顯示漢字
void dhz(uchar x,uchar y,uchar *shz)
{uint length=0,no,k;
uchar uRow,uCol;
while (*(shz+length)!='\0')
{length++;}
for(no=0;no<length/2;no++)
{uint j,find=0;
for(j=0;j<sizeof(hzinx)/2;j++)
{if(hzinx[j*2]==*(shz+no*2)&&hzinx[j*2+1]==*(shz+no*2+1))
{find=1;break;}}
for(k=0;k<16;k++)
{uRow=y;
uCol=x+no*2;
fnSetPos(uRow*16+k,uCol);
uRow = fnGetRow();
uCol = fnGetCol();
fnPR12(LC_AUT_WR);
fnPR13(zimo[j*32+2*k]);
fnPR12(LC_AUT_OVR);
x++;
fnPR12(LC_AUT_WR);
fnPR13(zimo[j*32+2*k+1]);
fnPR12(LC_AUT_OVR);
x--;}
}}
//串口數(shù)據(jù)接收
serial()interrupt 4 using 1
{
if(RI)
{
c=SBUF;
RI=0;
rbuf[r_in++]=c;
if((rbuf[r_in-3]=='*')&&(rbuf[r_in-2]=='*')&&(rbuf[r_in-1]=='*'))
{ if(r_in<250)
r_in=250;
else if(r_in>250)
r_in=0;
}
}
}
//串口初始化
void nintser(void)
{r_in=0;
TMOD=0x20;
TL1=0xF3;TH1=0xF3; //在12MHz下,設(shè)串口波特率為4800,方式3
SCON=0xd8;PCON=0x80;
TR1=1;
IE=0x90; //串口開(kāi)中斷
IP=0x10;
}
//接收緩沖區(qū)分塊
void part(void)
{
if(r_in<250)
{e=250; //當(dāng)前顯示緩沖區(qū)首地址
f=500;}
else if(r_in>250) //當(dāng)前顯示緩沖區(qū)末地址
{e=0;f=250;}
for(i=e;i<f;i++)
{if(rbuf[i]=='c'&&rbuf[i+1]=='o'&&rbuf[i+2]=='m')
{h=i;break;
}}
for(i=e;i<f;i++)
{if(rbuf[i]=='D'&&rbuf[i+1]=='V'&&rbuf[i+2]=='L')
{d=i;break;
}}
for(i=e;i<f;i++)
{if(rbuf[i]=='G'&&rbuf[i+1]=='P'&&rbuf[i+2]=='S')
{g=i;break;
}}
for(i=e;i<f;i++)
{if(rbuf[i]=='I'&&rbuf[i+1]=='N'&&rbuf[i+2]=='S')
{n=i;break;
}}}
//接收信息顯示
void sebuf(void)
{uchar k,j;
for(k=0;k<10;k++)
{
for(j=0;j<16;j++)
{uRow=y;
uCol=x;
fnSetPos(uRow*16+j,uCol);
uRow = fnGetRow();
uCol = fnGetCol();
fnPR12(LC_AUT_WR);
fnPR13(ASC_MSK[(rbuf[2+k+q]-0x20)*16+j]);
fnPR12(LC_AUT_OVR);
}
x++;
}
}
//組合信息顯示
void serh1(void)
{
uint i;
uchar find=0;
for(i=h;i<d;i++)
{if(rbuf[i]=='j'&&rbuf[i+1]=='d')
{find=1;
q=i;
break;}
}
if(find==1)
{
y=5;x=6;
sebuf();
}
}
void serh2(void)
{
uint i;
uchar find=0;
for(i=h;i<d;i++)
{if(rbuf[i]=='w'&&rbuf[i+1]=='d')
{
find=1;q=i;
break;}
}
if(find==1)
{
y=6;x=6;
sebuf();}
}
void serh3(void)
{
uint i;
uchar find=0;
for(i=h;i<d;i++)
{if(rbuf[i]=='h'&&rbuf[i+1]=='x')
{
find=1;q=i;
break;}
}
if(find==1)
{
y=7;x=6;
sebuf();}
}
void serh4(void)
{
uint i;
uchar find=0;
for(i=h;i<d;i++)
{if(rbuf[i]=='h'&&rbuf[i+1]=='y')
{
find=1;q=i;
break;}
}
if(find==1)
{
y=8;x=6;
sebuf();}
}
void serh5(void)
{
uint i;
uchar find=0;
for(i=h;i<d;i++)
{if(rbuf[i]=='z'&&rbuf[i+1]=='y')
{
find=1;q=i;
break;}
}
if(find==1)
{
y=9;x=6;
sebuf();}
}
void serh6(void)
{
uint i;
uchar find=0;
for(i=h;i<d;i++)
{if(rbuf[i]=='V'&&rbuf[i+1]=='e')
{
find=1;q=i;
break;}
}
if(find==1)
{
y=10;x=6;
sebuf();}
}
void serh7(void)
{
uint i;
uchar find=0;
for(i=h;i<d;i++)
{if(rbuf[i]=='V'&&rbuf[i+1]=='n')
{
find=1;q=i;
break;}
}
if(find==1)
{
y=11;x=6;
sebuf();}
}
//七種信息統(tǒng)一顯示
void serh(void)
{
part();
serh1();
serh2();
serh3();
serh4();
serh5();
serh6();
serh7();
}
//DVL信息
void serd1(void)
{
uint i;
uchar find=0;
for(i=d;i<g;i++)
{if(rbuf[i]=='V'&&rbuf[i+1]=='e')
{
find=1;q=i;
break;}
}
if(find==1)
{
y=4;x=6;
sebuf();}
}
void serd2(void)
{
uint i;
uchar find=0;
for(i=d;i<g;i++)
{if(rbuf[i]=='V'&&rbuf[i+1]=='n')
{
find=1;q=i;
break;}
}
if(find==1)
{
y=5;x=6;
sebuf();}
}
//DVL東北速顯示
void serd(void)
{
part();
serd1();
serd2();
}
//GPS信息
void serg1(void)
{
uint i;
uchar find=0;
for(i=g;i<n;i++)
{if(rbuf[i]=='j'&&rbuf[i+1]=='d')
{
find=1;q=i;
break;}
}
if(find==1)
{
y=10;x=6;
sebuf();}
}
void serg2(void)
{
uint i;
uchar find=0;
for(i=g;i<n;i++)
{if(rbuf[i]=='w'&&rbuf[i+1]=='d')
{
find=1;q=i;
break;}
}
if(find==1)
{
y=11;x=6;
sebuf();}
}
//GPS經(jīng)緯度顯示
void serg(void)
{
part();
serg1();
serg2();
}
//INS信息
void sern1(void)
{
uint i;
uchar find=0;
for(i=n;i<f;i++)
{if(rbuf[i]=='j'&&rbuf[i+1]=='d')
{
find=1;q=i;
break;}
}
if(find==1)
{
y=5;x=6;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -