?? gpsall.c
字號(hào):
/*寫(xiě)漢字液晶子程 液晶屏分為4行*12列漢字,全部使用模擬接口方式。
/* JHD19264A接口程序(模擬方式)
;***************************************************************************
;連線圖:
;*LCM---89C52* *LCM---89C52* *LCM-------89C52* *LCM----------89C52* *
;*DB0---P0.0* *DB4---P0.4* *D/I-------P2.5* *CS1----------P2.4* *
;*DB1---P0.1* *DB5---P0.5* *R/W-------P2.6* *CS2----------P2.3* *
;*DB2---P0.2* *DB6---P0.6* *RST--------VCC* *RST----------P2.2*
;*DB3---P0.3* *DB7---P0.7* *E---------P2.7* *
;注:89C52的晶振頻率為11.0592MHz *
;***************************************************************************/
//畫(huà)線部分請(qǐng)參照avr的c程序。
/*#pragma src /*生成ASM文件開(kāi)關(guān),必要時(shí)打開(kāi) */
#include<reg52.h>
#include<math.h>
#include<INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/***********液晶顯示器接口引腳定義***************/
sbit L_RSET =P2^2;
sbit Elcm= P2^1; //
sbit CS1LCM= P2^4; //
sbit CS2LCM= P2^3; //
sbit Dilcm= P2^5; //
sbit Rwlcm= P2^6; //
sbit RedLED=P3^4;
sbit GreenLED=P3^5;
sfr Datalcm=0x80; //數(shù)據(jù)口
sbit Beep=P1^6;
/***********常用操作命令和參數(shù)定義***************/
#define DISPON 0x3f /*顯示on */
#define DISPOFF 0x3e /*顯示off */
#define DISPFIRST 0xc0 /*顯示起始行定義 */
#define SETX 0x40 /*X定位設(shè)定指令(頁(yè)) */
#define SETY 0xb8 /*Y定位設(shè)定指令(列) */
#define Lcdbusy 0x80 /*LCM忙判斷位 */
/**************顯示分區(qū)邊界位置*****************/
#define MODL 0x00 /*左區(qū) */
#define MODM 0x40 /*左區(qū)和中區(qū)分界 */
#define MODR 0x80 /*中區(qū)和右區(qū)分界 */
#define LCMLIMIT 0xC0 /*顯示區(qū)的右邊界 */
/****************全局變量定義*******************/
uchar col,row,cbyte; /*列x,行(頁(yè))y,輸出數(shù)據(jù) */
//bit xy; /*畫(huà)線方向標(biāo)志:1水平 */
bit TimeFlag=0,Hzflag=0;
uchar TimeCounter=56;
/*****************************************************
------------------通信變量---------------------------
*****************************************************/
uchar data uc0,RetKey;
uchar Lat,Long;//Latitude 緯度 longitude 經(jīng)度
//uint data l0;
uchar ComBuf[22]="3417.4744,N,10804.2075";
uint data counter;
//uint CounterNub1=0,CounterNub2=0;
//uint Key;
bit bdata KeyStatus;
//bit bdata ShiftStatus; /* 上下檔鍵切換:=0上,=1下檔鍵. */
sbit RS_C0=P2^0;
sbit RS_C1=P2^7;
#define COM0 RS_C1=0;RS_C0=0
#define COM1 RS_C1=0;RS_C0=1
#define COM2 RS_C1=1;RS_C0=0
#define COM3 RS_C1=1;RS_C0=1
#define WaitTI while(TI==0);TI=0
#define WaitRI while(RI==0);RI=0
//-------鍵值定義---------------
#define NoKeyPress 0xff /* 沒(méi)有鍵按下 */
#define Tab1 0
#define Tab2 1
#define Tab3 2
#define Tab4 3
#define Uparrow 4
#define Rightarrow 5
#define Enter 6
#define Downarrow 7
#define Leftarrow 8
#define Yes 1
#define No 0
#define Off 0
#define On 1
#define Down 0
#define Up 1
#define Start 0
#define End 1
#define Low 1
#define High 0
#define Ok 1
#define Error 0
/*****************函數(shù)列表**********************/
void Lcminit(void); /*液晶模塊初始化 */
void Delay(uchar); /*延時(shí),入口數(shù)為Ms */
void lcdbusyL(void); /*busy判斷、等待(左區(qū)) */
void lcdbusyM(void); /*busy判斷、等待(中區(qū)) */
void lcdbusyR(void); /*busy判斷、等待(右區(qū)) */
void Putedot(uchar); /*半角字符輸出 */
void Putcdot(uchar); /*全角(漢字)輸出 */
void Wrdata(uchar); /*數(shù)據(jù)輸出給LCM */
void Lcmcls( void ); /*LCM全屏幕清零(填充0) */
void wtcom(void); /*公用busy等待 */
void Locatexy(void); /*光標(biāo)定位 */
void WrcmdL(uchar); /*左區(qū)命令輸出 */
void WrcmdM(uchar); /*中區(qū)命令輸出 */
void WrcmdR(uchar); /*右區(qū)命令輸出 */
void Putstr(uchar *puts,uchar i); /*中英文字符串輸出 */
void Rollscreen(uchar x); /*屏幕向上滾動(dòng)演示 */
void Rddata(void); /* 從液晶片上讀數(shù)據(jù) */
void Timer0init(void);
uchar Key_Press(bit b);
uchar ScanKey(void);
void RestWatchdog(void);
void TranDataBy232(uchar d);
void OpeningBeep(uchar OBN);
void InitSBUF(void);
void RecvToBuf(void);
void CheckLED(void);
void DispFirstmenu(void);
void Mainmenu(void);
void Lcmclsline(uchar lineNo );
void FlashGreenled(uchar Num);
//void Linehv(uchar length); /*橫(豎)方向畫(huà)線 */
//void point(void); /*打點(diǎn) */
//void Linexy(uchar endx,uchar endy);
/******************數(shù)組列表*********************/
uchar code Ezk[]; /*ASCII常規(guī)字符點(diǎn)陣碼表0 */
uchar code Hzk[]; /*自用漢字點(diǎn)陣碼表 */
uchar code STR1[]; /*自定義字符串 */
uchar code STR2[]; //
uchar code STR3[]; //
uchar code STR4[]; //
uchar code STR5[];
uchar code STR6[];
uchar code STR7[];
uchar code STR8[];
uchar code STR9[];
uchar code STR0[];
uchar code Hzk1[]; /*自用漢字點(diǎn)陣碼表1 */
uchar code Hzk2[]; /*自用漢字點(diǎn)陣碼表1 */
/********************************/
/* 演示主程序 */
/********************************/
void main(void)
{
//uchar x;
//Start:
col=0;
row=0;
Delay(100); /*延時(shí)大約40Ms,等待外設(shè)準(zhǔn)備好 */
OpeningBeep(1);
CheckLED();
TimeFlag=0;
Timer0init();
Lcminit(); /*液晶模塊初始化,包括全屏幕清屏*/
InitSBUF();
DispFirstmenu();
Key_Press(1);
Lcmcls();
RetKey=0xff;
while(1){
Key_Press(0); //按鍵掃描程序
Mainmenu();
//RedLED=!RedLED;
//Rollscreen(x); /*定位新的顯示起始行 */
// x++;
Delay(80); /*延時(shí),控制滾動(dòng)速度 */
//if (TimeFlag==1) goto Start;
GreenLED=!GreenLED;
};
}
void Timer0init(void)
{
TMOD = 0x01; //定時(shí)器0 定時(shí)方式1
TH0=0; // 71.11ms@11.0592Mhz
TL0=0;
TR0 = 1; //啟動(dòng)定時(shí)器0
TimeFlag=0;
ET0=1;EA=1;
}
void Timer0_int(void) interrupt 1 using 1
{
TH0=0;
TL0=0;
TimeCounter--;
if(TimeCounter==0)
{
TimeFlag=1;
TimeCounter=56;
}
else
{
TH0=0;
TL0=0;
}
}
/****************************************/
/* 屏幕滾動(dòng)定位 */
/****************************************/
void Rollscreen(uchar x)
{
cbyte = DISPFIRST|x; /*定義顯示起始行為x?*/
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
}
/****************************************/
/* 一個(gè)字串的輸出 */
/****************************************/
void Putstr(uchar *puts,uchar i)
{
uchar j,X;
for (j=0;j<i;j++)
{
X = puts[j];
if (X&0x80)
{
Putcdot(X&0x7f); /*只保留低7位*/
}
else Putedot(X-0x20); /*ascii碼表從0x20開(kāi)始*/
}
}
/****************************************/
/* 半角字符點(diǎn)陣碼數(shù)據(jù)輸出 */
/****************************************/
void Putedot(uchar Order)
{
uchar i,bakerx,bakery; /*共定義4個(gè)局部變量 */
int x; /*偏移量,字符量少的可以定義為uchar */
bakerx = col; /*暫存x,y坐標(biāo),已備下半個(gè)字符使用 */
bakery = row;
x=Order * 0x10; /*半角字符,每個(gè)字符16字節(jié) */
/*上半個(gè)字符輸出,8列 */
for(i=0;i<8;i++)
{
cbyte = Ezk[x]; /*取點(diǎn)陣碼,rom數(shù)組 */
Wrdata(cbyte); /*寫(xiě)輸出一字節(jié) */
x++;
col++;
if (col==LCMLIMIT){col=0;row++;row++;}; /*下一列,如果列越界換行*/
if (row>7) row=0; /*如果行越界,返回首行 */
} /*上半個(gè)字符輸出結(jié)束 */
col = bakerx; /*列對(duì)齊 */
row = bakery+1; /*指向下半個(gè)字符行 */
/*下半個(gè)字符輸出,8列 */
for(i=0;i<8;i++)
{
cbyte = Ezk[x]; /*取點(diǎn)陣碼 */
Wrdata(cbyte); /*寫(xiě)輸出一字節(jié) */
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+2;}; /*下一列,如果列越界換行*/
if (row>7) row=1; /*如果行越界,返回首行 */
} /*下半個(gè)字符輸出結(jié)束 */
row=bakery;
} /*整個(gè)字符輸出結(jié)束 */
/****************************************/
/* 全角字符點(diǎn)陣碼數(shù)據(jù)輸出 */
/****************************************/
void Putcdot(uchar Order)
{
uchar i,bakerx,bakery; /*共定義3個(gè)局部變量 */
int x; /*偏移量,字符量少的可以定義為uchar */
bakerx = col; /*暫存x,y坐標(biāo),已備下半個(gè)字符使用 */
bakery = row;
x=Order * 0x20; /*每個(gè)字符32字節(jié) */
/*上半個(gè)字符輸出,16列 */
for(i=0;i<16;i++)
{
if(Hzflag)
Wrdata(Hzk1[x]); /*寫(xiě)輸出一字節(jié) */
else
Wrdata(Hzk2[x]);
x++;
col++;
if (col==LCMLIMIT){ col=0;row++;row++;} /*下一列,如果列越界換行*/
if (row>6) row=0; /*如果行越界,返回首行 */
} /*上半個(gè)字符輸出結(jié)束 */
/*下半個(gè)字符輸出,16列 */
col = bakerx;
row = bakery+1;
for(i=0;i<16;i++) /*下半部分*/
{
if(Hzflag)
Wrdata(Hzk1[x]); /*寫(xiě)輸出一字節(jié) */
else
Wrdata(Hzk2[x]);
x++;
col++;
if (col==LCMLIMIT){col=0;row++;row++;} /*下一列,如果列越界換行*/
if (row>7) row=1; /*如果行越界,返回首行 */
} /*下半個(gè)字符輸出結(jié)束 */
row = bakery;
} /*整個(gè)字符輸出結(jié)束 */
/****************************************/
/* 清屏,全屏幕清零 */
/****************************************/
void Lcmcls( void )
{
for(row=0;row<8;row++)
for(col=0;col<LCMLIMIT;col++) Wrdata(0);
}
/****************************************/
/*屏幕某一行清零 */
/****************************************/
void Lcmclsline(uchar lineNo )
{ uchar i;
i=lineNo+1;
for(row=lineNo;row<i;row++)
for(col=0;col<LCMLIMIT;col++) Wrdata(0);
}
/****************************************/
/* 從液晶片上讀數(shù)據(jù),保留在全局變量中 */
/****************************************/
/*
void Rddata(void)
{
Locatexy(); //坐標(biāo)定位,返回時(shí)保留分區(qū)狀態(tài)不變
Datalcm=0xFF;
Dilcm = 1; //數(shù)據(jù)
Rwlcm = 1; //讀數(shù)據(jù)
Elcm = 1; //讀入到LCM
_nop_();
cbyte = Datalcm; //虛讀一次
Elcm = 0;
Locatexy(); //坐標(biāo)定位,返回時(shí)保留分區(qū)狀態(tài)不變
Datalcm=0xFF;
_nop_();
Dilcm = 1; //數(shù)據(jù)
Rwlcm = 1; //讀數(shù)據(jù)
Elcm = 1; //讀入到LCM
_nop_();
cbyte = Datalcm; //從數(shù)據(jù)口讀數(shù)據(jù),真讀
Elcm = 0;
} */
/****************************************/
/* 數(shù)據(jù)寫(xiě)輸出 */
/****************************************/
void Wrdata(uchar X)
{
Locatexy(); /*坐標(biāo)定位,返回時(shí)保留分區(qū)狀態(tài)不變 */
// wtcom();
Dilcm = 1; /*數(shù)據(jù)輸出*/
Rwlcm = 0; /*寫(xiě)輸出 */
Datalcm = X; /*數(shù)據(jù)輸出到數(shù)據(jù)口 */
Elcm = 1; /*讀入到LCM*/
_nop_();
Elcm = 0;
}
/****************************************/
/* 命令輸出,每次輸出一個(gè)分區(qū)控制口 */
/****************************************/
/*void Wrcmd(uchar X)
// {
// Locatexy(); /*確定分區(qū),返回時(shí)保留分區(qū)狀態(tài)不變 */
// wtcom(); /*等待LCM操作允許 */
// Dilcm = 0; /*數(shù)據(jù)操作 */
// Rwlcm = 0; /*寫(xiě)輸出 */
// Datalcm = X; /*數(shù)據(jù)輸出到數(shù)據(jù)口 */
// Elcm = 1;_nop_();Elcm = 0; /*讀入到LCM*/
// }
/********************************/
/* 命令輸出到左區(qū)控制口 */
/********************************/
void WrcmdL(uchar X)
{
lcdbusyL(); /*確定分區(qū),返回時(shí)保留分區(qū)狀態(tài)不變*/
Dilcm = 0; /*命令操作 */
Rwlcm = 0; /*寫(xiě)輸出 */
Datalcm = X; /*數(shù)據(jù)輸出到數(shù)據(jù)口 */
Elcm = 1;_nop_();Elcm = 0; /*讀入到LCM*/
}
/********************************/
/* 命令輸出到中區(qū)控制口 */
/********************************/
void WrcmdM(uchar X)
{
lcdbusyM(); /*確定分區(qū),返回時(shí)保留分區(qū)狀態(tài)不變*/
Dilcm = 0; /*命令操作 */
Rwlcm = 0; /*寫(xiě)輸出 */
Datalcm = X; /*命令輸出到數(shù)據(jù)口 */
Elcm = 1;_nop_();Elcm = 0; /*讀入到LCM*/
}
/********************************/
/* 命令輸出到右區(qū)控制口 */
/********************************/
void WrcmdR(uchar X)
{
lcdbusyR(); /*確定分區(qū),返回時(shí)保留分區(qū)狀態(tài)不變 */
Dilcm = 0; /*命令操作 */
Rwlcm = 0; /*寫(xiě)輸出 */
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -