⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpsall.c

📁 GPS接收机模块的解码,采用51系列单片机编程
💻 C
📖 第 1 页 / 共 3 页
字号:
			  
/*写汉字液晶子程 液晶屏分为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 + -