📄 gpsall.c
字号:
/*写汉字液晶子程 液晶屏分为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 *
;***************************************************************************/
//画线部分请参照avr的c程序。
/*#pragma src /*生成ASM文件开关,必要时打开 */
#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; //数据口
sbit Beep=P1^6;
/***********常用操作命令和参数定义***************/
#define DISPON 0x3f /*显示on */
#define DISPOFF 0x3e /*显示off */
#define DISPFIRST 0xc0 /*显示起始行定义 */
#define SETX 0x40 /*X定位设定指令(页) */
#define SETY 0xb8 /*Y定位设定指令(列) */
#define Lcdbusy 0x80 /*LCM忙判断位 */
/**************显示分区边界位置*****************/
#define MODL 0x00 /*左区 */
#define MODM 0x40 /*左区和中区分界 */
#define MODR 0x80 /*中区和右区分界 */
#define LCMLIMIT 0xC0 /*显示区的右边界 */
/****************全局变量定义*******************/
uchar col,row,cbyte; /*列x,行(页)y,输出数据 */
//bit xy; /*画线方向标志:1水平 */
bit TimeFlag=0,Hzflag=0;
uchar TimeCounter=56;
/*****************************************************
------------------通信变量---------------------------
*****************************************************/
uchar data uc0,RetKey;
uchar Lat,Long;//Latitude 纬度 longitude 经度
//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 /* 没有键按下 */
#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
/*****************函数列表**********************/
void Lcminit(void); /*液晶模块初始化 */
void Delay(uchar); /*延时,入口数为Ms */
void lcdbusyL(void); /*busy判断、等待(左区) */
void lcdbusyM(void); /*busy判断、等待(中区) */
void lcdbusyR(void); /*busy判断、等待(右区) */
void Putedot(uchar); /*半角字符输出 */
void Putcdot(uchar); /*全角(汉字)输出 */
void Wrdata(uchar); /*数据输出给LCM */
void Lcmcls( void ); /*LCM全屏幕清零(填充0) */
void wtcom(void); /*公用busy等待 */
void Locatexy(void); /*光标定位 */
void WrcmdL(uchar); /*左区命令输出 */
void WrcmdM(uchar); /*中区命令输出 */
void WrcmdR(uchar); /*右区命令输出 */
void Putstr(uchar *puts,uchar i); /*中英文字符串输出 */
void Rollscreen(uchar x); /*屏幕向上滚动演示 */
void Rddata(void); /* 从液晶片上读数据 */
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); /*横(竖)方向画线 */
//void point(void); /*打点 */
//void Linexy(uchar endx,uchar endy);
/******************数组列表*********************/
uchar code Ezk[]; /*ASCII常规字符点阵码表0 */
uchar code Hzk[]; /*自用汉字点阵码表 */
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[]; /*自用汉字点阵码表1 */
uchar code Hzk2[]; /*自用汉字点阵码表1 */
/********************************/
/* 演示主程序 */
/********************************/
void main(void)
{
//uchar x;
//Start:
col=0;
row=0;
Delay(100); /*延时大约40Ms,等待外设准备好 */
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); /*延时,控制滚动速度 */
//if (TimeFlag==1) goto Start;
GreenLED=!GreenLED;
};
}
void Timer0init(void)
{
TMOD = 0x01; //定时器0 定时方式1
TH0=0; // 71.11ms@11.0592Mhz
TL0=0;
TR0 = 1; //启动定时器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;
}
}
/****************************************/
/* 屏幕滚动定位 */
/****************************************/
void Rollscreen(uchar x)
{
cbyte = DISPFIRST|x; /*定义显示起始行为x?*/
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
}
/****************************************/
/* 一个字串的输出 */
/****************************************/
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开始*/
}
}
/****************************************/
/* 半角字符点阵码数据输出 */
/****************************************/
void Putedot(uchar Order)
{
uchar i,bakerx,bakery; /*共定义4个局部变量 */
int x; /*偏移量,字符量少的可以定义为uchar */
bakerx = col; /*暂存x,y坐标,已备下半个字符使用 */
bakery = row;
x=Order * 0x10; /*半角字符,每个字符16字节 */
/*上半个字符输出,8列 */
for(i=0;i<8;i++)
{
cbyte = Ezk[x]; /*取点阵码,rom数组 */
Wrdata(cbyte); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){col=0;row++;row++;}; /*下一列,如果列越界换行*/
if (row>7) row=0; /*如果行越界,返回首行 */
} /*上半个字符输出结束 */
col = bakerx; /*列对齐 */
row = bakery+1; /*指向下半个字符行 */
/*下半个字符输出,8列 */
for(i=0;i<8;i++)
{
cbyte = Ezk[x]; /*取点阵码 */
Wrdata(cbyte); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+2;}; /*下一列,如果列越界换行*/
if (row>7) row=1; /*如果行越界,返回首行 */
} /*下半个字符输出结束 */
row=bakery;
} /*整个字符输出结束 */
/****************************************/
/* 全角字符点阵码数据输出 */
/****************************************/
void Putcdot(uchar Order)
{
uchar i,bakerx,bakery; /*共定义3个局部变量 */
int x; /*偏移量,字符量少的可以定义为uchar */
bakerx = col; /*暂存x,y坐标,已备下半个字符使用 */
bakery = row;
x=Order * 0x20; /*每个字符32字节 */
/*上半个字符输出,16列 */
for(i=0;i<16;i++)
{
if(Hzflag)
Wrdata(Hzk1[x]); /*写输出一字节 */
else
Wrdata(Hzk2[x]);
x++;
col++;
if (col==LCMLIMIT){ col=0;row++;row++;} /*下一列,如果列越界换行*/
if (row>6) row=0; /*如果行越界,返回首行 */
} /*上半个字符输出结束 */
/*下半个字符输出,16列 */
col = bakerx;
row = bakery+1;
for(i=0;i<16;i++) /*下半部分*/
{
if(Hzflag)
Wrdata(Hzk1[x]); /*写输出一字节 */
else
Wrdata(Hzk2[x]);
x++;
col++;
if (col==LCMLIMIT){col=0;row++;row++;} /*下一列,如果列越界换行*/
if (row>7) row=1; /*如果行越界,返回首行 */
} /*下半个字符输出结束 */
row = bakery;
} /*整个字符输出结束 */
/****************************************/
/* 清屏,全屏幕清零 */
/****************************************/
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);
}
/****************************************/
/* 从液晶片上读数据,保留在全局变量中 */
/****************************************/
/*
void Rddata(void)
{
Locatexy(); //坐标定位,返回时保留分区状态不变
Datalcm=0xFF;
Dilcm = 1; //数据
Rwlcm = 1; //读数据
Elcm = 1; //读入到LCM
_nop_();
cbyte = Datalcm; //虚读一次
Elcm = 0;
Locatexy(); //坐标定位,返回时保留分区状态不变
Datalcm=0xFF;
_nop_();
Dilcm = 1; //数据
Rwlcm = 1; //读数据
Elcm = 1; //读入到LCM
_nop_();
cbyte = Datalcm; //从数据口读数据,真读
Elcm = 0;
} */
/****************************************/
/* 数据写输出 */
/****************************************/
void Wrdata(uchar X)
{
Locatexy(); /*坐标定位,返回时保留分区状态不变 */
// wtcom();
Dilcm = 1; /*数据输出*/
Rwlcm = 0; /*写输出 */
Datalcm = X; /*数据输出到数据口 */
Elcm = 1; /*读入到LCM*/
_nop_();
Elcm = 0;
}
/****************************************/
/* 命令输出,每次输出一个分区控制口 */
/****************************************/
/*void Wrcmd(uchar X)
// {
// Locatexy(); /*确定分区,返回时保留分区状态不变 */
// wtcom(); /*等待LCM操作允许 */
// Dilcm = 0; /*数据操作 */
// Rwlcm = 0; /*写输出 */
// Datalcm = X; /*数据输出到数据口 */
// Elcm = 1;_nop_();Elcm = 0; /*读入到LCM*/
// }
/********************************/
/* 命令输出到左区控制口 */
/********************************/
void WrcmdL(uchar X)
{
lcdbusyL(); /*确定分区,返回时保留分区状态不变*/
Dilcm = 0; /*命令操作 */
Rwlcm = 0; /*写输出 */
Datalcm = X; /*数据输出到数据口 */
Elcm = 1;_nop_();Elcm = 0; /*读入到LCM*/
}
/********************************/
/* 命令输出到中区控制口 */
/********************************/
void WrcmdM(uchar X)
{
lcdbusyM(); /*确定分区,返回时保留分区状态不变*/
Dilcm = 0; /*命令操作 */
Rwlcm = 0; /*写输出 */
Datalcm = X; /*命令输出到数据口 */
Elcm = 1;_nop_();Elcm = 0; /*读入到LCM*/
}
/********************************/
/* 命令输出到右区控制口 */
/********************************/
void WrcmdR(uchar X)
{
lcdbusyR(); /*确定分区,返回时保留分区状态不变 */
Dilcm = 0; /*命令操作 */
Rwlcm = 0; /*写输出 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -