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

📄 lcd.c

📁 使用51系列单片机(AT89S52)控制LCD(12864),全菜单化操作控制初始时间输入
💻 C
字号:
/*********************************************************************************************************                  
*                                     		lcd drivers
*                                       	QZhao,2007
*                                       	All Rights Reserved  
* File : lcd.c
* By   : QZhao
* Contact : zq1987731@163.com
*********************************************************************************************************/

/*★★★可调用函数:	LCD_initial();->初始化  W_LCD(写入值,方式C1/D2)	DIS_LCD(行,列,首址)->中/英文显示
					GRAPH_BMP(图像首址)->绘图	LCDLineXy(原始XY,目标XY)->画线	 
					备用:	DIS_C_LCD(行,列,字符ASC)->将相应字符送入LCD显示	DIS_Z(x)->数值转换*/

/*********************************************************************************************************     
*             
*                                     		LCD初始化
*
*********************************************************************************************************/

	bool LCD_initial(void)
	{
		W_LCD(0x30,1);	//基本指令集操作
		W_LCD(0x06,1);	//移动方向,指定显示移位
		W_LCD(0x0C,1);	//整体显示ON
		W_LCD(0x01,1);	//清屏
		delayms(10);
		return TRUE;
	}

/*********************************************************************************************************   
*               
*                                     		lcd端口写入子函数
*			人口参数:(写入值,写入类型1控制字 OR 2数据)
*			返回值:成功则TRUE
*			功能:写入相应lcd控制字或数据
*
*********************************************************************************************************/

	bool W_LCD(uchar x,uchar y)
	{		
		uchar i;
		switch(y)
		{
			case 1: LCD_RS=0; break;	//指令
			case 2: LCD_RS=1; break;	//数据
			default: return FALSE;
		}
		W_8255(0x04,1);		//RW拉低
		W_8255(x,2);
		_nop_();
		_nop_();
		LCD_E=1;
		_nop_();
		_nop_();
		LCD_E=0;
		for(i=200;i>0;i--);
		return TRUE;
	}

/********************************************************************************************************* 
*
*		    								点阵液晶显示函数
*    		入口参数:DIS_LCD(行,列,首址)
*			返回值:TRUE
*			功能:将相应内容送入LCD显示
*
*********************************************************************************************************/

	bool DIS_LCD(uchar x,uchar y,char *str,uchar z)
	{
		uchar addr;
		char temp;
		
		W_LCD(0x30,1);
		switch(x)
		{
			case 1:
				addr=(0x7F+y);
				break;
			case 2:
				addr=(0x8F+y);
				break;
			case 3:
				addr=(0x87+y);
				break;
			case 4:
				addr=(0x97+y);
				break;
		}
		W_LCD(addr,1);
	
		for(;z>0;z--)
		{
			temp=*str;
			str++;
			W_LCD(temp,2);
		}

		return TRUE;
	}

/********************************************************************************************************* 
*
*		    								点阵液晶画点函数
*    		入口参数:GRAPH_POINT(0~127,0~63)
*			返回值:TRUE
*			功能:LCD任意位置画点
*
*********************************************************************************************************/

	static bool Sendint(uint dd)
	{
		W_LCD(dd>>8,2);
		W_LCD(dd,2);
		return TRUE;
	}

	bool GRAPH_POINT(uchar x,uchar y)
	{
		uchar xx,yy;
		W_LCD(0x34,1);
		W_LCD(0x36,1);
		xx=x/16;
		yy=63-y;
		if(yy>=32){xx=xx+8;yy-=32;}
		W_LCD(0x80+yy,1);
		W_LCD(0x80+xx,1);
		Sendint(0x8000>>(x%16));
		return TRUE;
	}


/********************************************************************************************************* 
*
*		    								点阵液晶绘图函数
*    		入口参数:GRAPH_BMP(图像首址)
*			返回值:TRUE
*			功能:将相应图像送入LCD显示
*
*********************************************************************************************************/

	bool GRAPH_BMP(uchar *str)
	{
		uint x=0;
     	uchar i,j;
     	W_LCD(0x34,1);
		W_LCD(0x36,1);
	    for(i=0;i<32;i++)
	    {
			W_LCD(0x80|i,1);		//行
			W_LCD(0x80,1);     		//列
			for(j=0;j<32;j++)
			{            			//列位置每行++
				W_LCD(str[x],2); 
				x++;
	        }
		}
		return TRUE;
	}

/********************************************************************************************************* 
*
*		    								点阵液晶画线函数
*    		入口参数:LCDLineXy(原始XY,目标XY)
*			返回值:TRUE
*			功能:画一条任意两点间的直线
*
*********************************************************************************************************/

	bool LCDLineXy(uchar x,uchar y,uchar x1,uchar y1)
	{
		uchar 	i;
		uchar 	a;
		uchar 	b;
		uchar 	c;		//中间值
		uint 	a1;
		uint 	b1;
		char 	d=1;	//标志位,1表示x大,-1表示x1大
		char 	e=1;	//标志位,1表示y大,-1表示y1大
		bit 	f=0;	//标志位,0表示a大,1表示b大
		
		if (x1>x)
			{a=(x1-x);d=-1;}
		else 
			a=(x-x1);
		if (y1>y)
			{b=(y1-y);e=-1;}
		else 
			b=(y-y1);
			
		a1=a;
		b1=b;
		
		if (b>a) 
			{c=b;b=a;b=c;f=1;}  			//保证a>b容易对数进行操作
			
		if(f==0)
		{                      				//分为两种情况  a>b的时候
    		for (i=0;i<=a;i++)
        	{
   				x1=x;
   				y1=y;
         		x=x-d*i;
         		y=y-(b1*i/a1)*e;
         		GRAPH_POINT(x,y);
   				x=x1;
   				y=y1;
         	}
		}
		
		if(f==1)
		{                      				//a<b的时候;以空间换时间算法
         	for (i=0;i<=b;i++)   
         	{
   				x1=x;
   				y1=y;
         		y=y-e*i;
         		x=x-(a1*i/b1)*d;
         		GRAPH_POINT(x,y);
   				x=x1;
   				y=y1;
         	}
		}
		return TRUE;
	}

/********************************************************************************************************* 
*
*		    									左半屏CGRAM清除函数
*    		入口参数:无
*			返回值:TRUE
*			功能:清除左半屏图形区内容
*
*********************************************************************************************************/

	bool CLEAR_HALF(void)
	{
		uchar i,j;

		W_LCD(0x34,1);
		W_LCD(0x36,1);
		for(i=0;i<32;i++)
		{
			W_LCD(0x80|i,1);
			W_LCD(0x80,1);
			for(j=0;j<8;j++)
			{
				W_LCD(0,2);
		 	}
		}

		for(i=0;i<32;i++)
		{
			W_LCD(0x80|i,1);
			W_LCD(0x80|0x08,1);
			for(j=0;j<8;j++)
			{
				W_LCD(0,2); 
			}
		}
		return TRUE;
	}

/********************************************************************************************************* 
*
*		    									全屏CGRAM清除函数
*    		入口参数:无
*			返回值:TRUE
*			功能:清除左全屏图形区内容
*
*********************************************************************************************************/	

	bool CLEAR_SCREEN(void)
	{   
		uchar i,j,x,y;    
		W_LCD(0x34,1);
	   	W_LCD(0x36,1);
		x=0x80;
		y=0x80;
		for(j=0;j<64;j++)
		{
			y=0x80;
			W_LCD(x,1);
	     	W_LCD(y,1);
	       	for(i=0;i<32;i++)
	      	{
	       		W_LCD(0,2);
	      	}
	      	x=x+1;
		}  
 	    return TRUE;
	}

/*************************************************以下备用***********************************************/


/********************************************************************************************************* 
*
*		    								点阵液晶字符显示函数
*    		入口参数:DIS_C_LCD(行,列,字符ASC)
*			返回值:无
*			功能:将相应字符送入LCD显示
*
*********************************************************************************************************

	bool DIS_C_LCD(uchar x,uchar y,char z)
	{
		uchar addr;
			
		switch(x)
		{
			case 1:
				addr=(0x7F+y);
				break;
			case 2:
				addr=(0x8F+y);
				break;
			case 3:
				addr=(0x87+y);
				break;
			case 4:
				addr=(0x97+y);
				break;
		}

		W_LCD(addr,1);	
		W_LCD(z,2);

		return TRUE;
	}	

/********************************************************************************************************* 
*
*		    								字符转换函数
*    		入口参数:DIS_Z(待转无符号数据)
*			返回值:送入DIS_BUF内,TRUE or FALSE
*			功能:将相应无符号数据转换成3位ASC码
*
*********************************************************************************************************

	bool DIS_Z(uchar x)
	{
		uchar a,b,c;
		a=x%10;
		b=(x%100-a)/10;
		c=(x-x%100)/100;
		
		DIS_BUF[0]=toascii((char)c);
		DIS_BUF[1]=toascii((char)b);
		DIS_BUF[2]=toascii((char)a);

		return TRUE;
	}		*/

⌨️ 快捷键说明

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