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

📄 lcddir0.h

📁 c51 led菜单 程序 功能 上下选择菜单
💻 H
字号:

/***********常用操作命令和参数定义***************/
#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	 MODR		0x40	/*中区和右区分界	*/
#define	 LCMLIMIT	0x80	/*显示区的右边界	*/

/****************全局变量定义*******************/
Uchar col,row,cbyte;		/*列x,行(页)y,输出数据	*/
bit xy;				/*画线方向标志:1水平	*/

/*****************函数列表**********************/
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 Linehv(Uchar length);	/*横(竖)方向画线	*/
void point(void);		/*打点			*/
void Linexy(Uchar endx,Uchar endy);

void Display(Uchar hang,Uchar lie,Uchar *chuan,Uchar shu );//字符输出函数





/************************************************/
/*画线。任意方向的斜线,不支持垂直的或水平线	*/
/************************************************/

void Linexy(Uchar endx,Uchar endy)
{
	register Uchar t;
	int xerr=0,yerr=0,delta_x,delta_y,distance;
	Uchar incx,incy;

/* 	compute the distance in both directions */
	delta_x=endx-col;
	delta_y=endy-row;

/* compute  the direction of the increment ,
	an increment of "0" means either a vertical or horizontal lines */

	if(delta_x>0) incx=1;
	else if( delta_x==0 ) incx=0;
		else incx=-1;


	if(delta_y>0) incy=1;
	else if( delta_y==0 ) incy=0;
		else incy=-1;

/*  determine which distance is greater */
	delta_x = cabs( delta_x );
	delta_y = cabs( delta_y );

	if( delta_x > delta_y ) distance=delta_x;
	else distance=delta_y;

/* draw the line */
	for( t=0;t <= distance+1; t++ ) {
		point();
 	   xerr += delta_x ;
		yerr += delta_y ;
		if( xerr > distance ) {
			xerr-=distance;
 		    col+=incx;
		}
		if( yerr > distance ) {
			yerr-=distance;
 		    row+=incy;
		}

	}
}

/****************************************/
/*画线。只提供X或Y方向的,不支持斜线	*/
/****************************************/
void Linehv(Uchar length)
	{
		Uchar xs,ys;
		if (xy){ys = col;
			for (xs=0;xs<length;xs++){
					col = ys + xs;
					point();}
				}
		else	{xs = row;
			for (ys=0;ys<length;ys++){
					row = xs + ys;
					point();}
				}
}

/****************************************/
/*	画点				*/
/****************************************/

void point(void)
	{
		Uchar	x1,y1,x,y;
		x1=col;
		y1=row;
		row=y1>>3;		/*取Y方向分页地址	*/
		Rddata();
		y=y1&0x07;		/*字节内位置计算	*/
		x=0x01;
		x=x<<y;			/*移入所画点		*/
		Wrdata(cbyte|x);	/*画上屏幕		*/
		col=x1;			/*恢复xy坐标		*/
		row=y1;
	}

/****************************************/
/*	屏幕滚动定位			*/
/****************************************/
void Rollscreen(Uchar x)
	{
		cbyte = DISPFIRST|x;	/*定义显示起始行为x?*/
		WrcmdL(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++)
		{
		Wrdata(Hzk[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++)				/*下半部分*/
		{
		Wrdata(Hzk[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 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_();
      Delay(1);
		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 WrcmdR(Uchar X)
	{
		lcdbusyR();	/*确定分区,返回时保留分区状态不变	*/
		Dilcm = 0;			/*命令操作	*/
		Rwlcm = 0;			/*写输出  	*/
		Datalcm = X;			/*命令输出到数据口 */
		Elcm = 1;_nop_();Elcm = 0;	/*读入到LCM*/
	}

/********************************************************/
/* 分区操作允许等待,返回时保留分区选择状态		*/
/********************************************************/
void lcdbusyL(void)
	{
        CS1LCM = 0;		/*CLR	CS1		*/
        CS2LCM = 1;		/*SETB	CS2		*/
//        CS3LCM = 1;		/*SETB	CS3		*/
	     wtcom();		/* waitting for enable	*/
	}


void lcdbusyR(void)
	{
        CS1LCM = 1;		/*SETB	CS1		*/
        CS2LCM = 0;		/*SETB	CS2		*/
//        CS3LCM = 0;		/*CLR	CS3		*/
	wtcom();		/* waitting for enable	*/
	}

void wtcom(void)
	{unsigned char Datalcm1;
	Dilcm = 0;		/*CLR	DI		*/
	Rwlcm = 1;		/*SETB	RW		*/
   
	Elcm  = 1;
	_nop_();		
	Datalcm1=P2;
 
    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 0x40:	{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);

		WrcmdR(cbyte);
		cbyte = DISPON;		/*打开显示屏	*/
		WrcmdL(cbyte);

		WrcmdR(cbyte);
		cbyte = DISPFIRST;	/*定义显示起始行为零	*/

		WrcmdR(cbyte);
		Lcmcls();
		col=0;		/*清屏		*/
		row=0;
		Locatexy();
	}
/********************************/
/* 延时				*/
/********************************/
void Delay(Uchar MS)
	{
		Uchar us,usn;
		while(MS!=0)
			{ usn = 4;
				while(usn!=0)
					{
						us=0xf0;
						while (us!=0){us--;};
						usn--;
					}
				MS--;
			}
	}





	

	





void Display(Uchar hang,Uchar lie,Uchar *chuan,Uchar shu )
  
     {row =hang;
      col=lie;
      Putstr(chuan,shu);
     }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -