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

📄 lcd12864.c

📁 0-30v
💻 C
字号:
#include"reg52.h"
#include"IOCfg.c"
#include"Config.h"
#include"LCD12864.h"
#include"delay.h"


/*********************************************************************************

管脚号	管脚名称	电平	管脚功能描述

1	    VSS			0V		电源地
2		VCC			+5V		电源正
3		V0			-		对比度(亮度)调整
4		RS(CS)		H/L		RS="H",表示DB7--DB0为显示数据
4		RS(CS)		H/L		RS="L",表示DB7--DB0为显示指令数据
5		R/W(SID) 	H/L		R/W="H",E="H",数据被读到DB7--DB0
5		R/W(SID)	H/L		R/W="L",E="H→L", DB7--DB0的数据被写到IR或DR
6		E(SCLK)		H/L		使能信号
7		DB0			H/L		三态数据线
8		DB1			H/L		三态数据线
9		DB2			H/L		三态数据线
10		DB3			H/L		三态数据线
11		DB4			H/L		三态数据线
12		DB5			H/L		三态数据线
13		DB6			H/L		三态数据线
14		DB7			H/L		三态数据线
15		PSB			H/L		H:8位或4位并口方式,L:串口方式(见注释1)
16		NC			-		空脚
17		/RESET		H/L		复位端,低电平有效(见注释2)
18		VOUT		-		LCD驱动电压输出端
19		A			VDD		背光源正端,要加限流电阻(+5V)(见注释3)
20		K			VSS		背光源负端(见注释3)
------------------------------------------------------------------------------
  点阵和字符重合显示的时候不会覆盖,要先清除 
	  字符和点阵重合显示的时候,要分别清除掉  

	1.上电时先复位端口  

	2.设置屏内部  

	3.显示点阵时设置点阵模式,显示字符时设置字符模式,图像有重合时要清掉先前送的不同类显示数据

	4.最少要零点几秒就刷新整屏数据,以免有干扰出现数据乱码显示 

	5.屏幕的刷新频率不能太高,10HZ时屏幕没出现干扰线或噪点    

	6.12864屏在读数据的时候要空读一次才能正确读出数据  

	7.想用8*16的点阵显示,程序还不太复杂,单独操作每个点就以后再弄,先弄到能正常显示参数和菜单  



************************************************************************************/

//----------------------------------------------------------------------
//定义MCU与LCD的接口

   

//----------------------------------------------------------------------





/******************************************************************
//	函数名:lcd_delayms
//	功  能:精确延时1mS
//	参  数:输入延时毫秒数(0-65535) 
//	返回值:无
  晶振频率:22.1184MHz  ,循环次数是229  ;
******************************************************************/
void lcd_delayms(unsigned int i)	//使用22.1184M时的延时循环次数  
{
	unsigned int j;

	for(;i!=0;i--)
	{
		for(j = 0; j < 229; j++);
	}
}

/************************************************************************************

                   查忙函数    
	//RS=0;RW=1;wait=0闲;wait!=0忙 			         
************************************************************************************/
void busy(void)
{
    uchar wait;
    RS = 0;
    RW = 1;
    E = 1;
    for(;;)
    {
        wait = DB;
        wait &= 0x80;
        if(wait == 0)break;
    }
    E = 0;
	DB = 0XFF;
}

/************************************************************************************

                   写指令函数   
				   //RS=0;RW=0;E下降沿      
************************************************************************************/
 void w_code(uchar c)
{
    busy();
    RS=0;
    RW=0;
    DB=c;
    E=1;
    E=0;
    DB=0xff;
}
/************************************************************************************

                   写数据函数   
				  //RS=1;RW=0;E下降沿      
				   
************************************************************************************/
void w_data(uchar d)
{
    busy();
    RS = 1;
    RW = 0;
    DB = d;
    E = 1;
    E = 0;
    DB = 0xff;
}

/************************************************************************************
                   指定地址写数据函数  
				   x:
				   y:
				   i: 数据        
************************************************************************************/
void w_data_addr(uchar x,uchar y,uchar i)
{
	w_code(y);
	w_code(x);
	w_data(i);
}

/************************************************************************************

                         读数据函数 
			12864屏在读数据的时候要空读一次才能正确读出数据  
			     
************************************************************************************/
uchar r_data(void)//RS=1;RW=1;E下降沿
{
    uchar rd_lcd;
    busy();
    RS=1;
    RW=1;
    E=1;
    E=0;

	busy();
    RS=1;
    RW=1;
    E=1;
    rd_lcd=DB;
    E=0;
 return rd_lcd;
}

/************************************************************************************

                         读指定地址的数据函数 
			     		 x:   x轴地址
						 y:  y轴地址
************************************************************************************/
uchar r_data_addr(uchar x,uchar y)
{
	uchar i;
	w_code(y);
	w_code(x);
	i = r_data();
	return i;
}


/************************************************************************************
             
                   初始化液晶屏 
				
				  上电复位液晶屏  
************************************************************************************/
void  lcd_rst(void)
{  								   
	/*********上电复位,大于40毫秒***********************/
	LCD_RST = 0;
	lcd_delayms(50);
	LCD_RST = 1;
	w_code(0x30);//   功能设置---8BIT控制界面,绘图显示ON  
	lcd_delayms(1); 
	w_code(0x01);//   清屏  
	lcd_delayms(1);
	w_code(0x0c);//   功能设置---8BIT控制界面,扩充指令集 
	lcd_delayms(15);
	w_code(0x32);//32
	w_code(0x36);//36
}

/************************************************************************************

---------------------------写8*16阵数据 
************************************************************************************/
void  write_lcd_0816(uchar x1,uchar y1,uchar * zz,bit fanbai)
{
	uchar a,y,x,z,i = 0;
	if((x1 % 2) == 0) 
	{
		x1 = x1 / 2;
		for(a = 0;a < 16;a++)
		{
			y = y1;
    		x = x1;
			/**/
			if(y < 16) 
			{
				x = x + 0x80;
				y = y + 0x80;
			}
			if((y >= 16) && (y < 32))
			{
				x = x  + 0x90;
				y = y + 0x80;
			}
			if((y >= 32) && (y < 48))
			{
				x = x + 0x88;
				y = (y - 32) + 0x80;
			}
			if((y >= 48) && (y < 64))
			{
				x = x + 0x98;
				y = (y - 32) + 0x80;
			}

			w_code(y);
			y1++;
			w_code(x);      
			if(fanbai == 0)
			{
				w_data(zz[i]);
			}
			else
			{
				w_data(~zz[i]);
			}
			i++;
		
		}
	}
	else 	
	{
		x1 = x1 / 2;
		for(a = 0;a < 16;a++)
		{
			y = y1;
    		x = x1;
			/**/
			if(y < 16) 
			{
				x = x + 0x80;
				y = y + 0x80;
			}
			if((y >= 16) && (y < 32))
			{
				x = x  + 0x90;
				y = y + 0x80;
			}
			if((y >= 32) && (y < 48))
			{
				x = x + 0x88;
				y = (y - 32) + 0x80;
			}
			if((y >= 48) && (y < 64))
			{
				x = x + 0x98;
				y = (y - 32) + 0x80;
			}

			w_code(y);
			w_code(x);
			z = r_data(); 
			w_code(y);
			w_code(x);
			w_data(z);	  
			if(fanbai == 0)
			{
				w_data(zz[i]);
			}
			else
			{
				w_data(~zz[i]);
			}
			y1++;
			i++;
		}
	}
}
/************************************************************************************
/************************************************************************************
---------------------------写16*16阵数据 
************************************************************************************/
void  write_lcd_1616(uchar x1,uchar y1,uchar code * zz,bit fanbai)
{
	data uchar a,y,x,i = 0;

	for(a = 0;a < 16;a++)
	{
		y = y1;
    	x = x1;
		/**/
		if(y < 16) 
		{
			x = x + 0x80;
			y = y + 0x80;
		}
		if((y >= 16) && (y < 32))
		{
			x = x  + 0x90;
			y = y + 0x80;
		}
		if((y >= 32) && (y < 48))
		{
			x = x + 0x88;
			y = (y - 32) + 0x80;
		}
		if((y >= 48) && (y < 64))
		{
			x = x + 0x98;
			y = (y - 32) + 0x80;
		}

		w_code(y);
		y1++;
		w_code(x);      
		if(fanbai == 0)	 
		{
				w_data(zz[i]);
				i++;
				w_data(zz[i]);
				i++;
			}
			else
			{
				w_data(~zz[i]);
				i++;
				w_data(~zz[i]);
				i++;
			}
		
	}
}
/************************************************************************************
---------------------------清0 16*16阵数据       
************************************************************************************/
void  write_lcd_1616_clr(uchar x1,uchar y1)
{
	data uchar a,y,x,i = 0;

	for(a = 0;a < 16;a++)
	{
		y = y1;
    	x = x1;
		if(y < 16) 
		{
			x = x + 0x80;
			y = y + 0x80;
		}

		if((y >= 16) && (y < 32))
		{
			x = x  + 0x90;
			y = y + 0x80;
		}

		if((y >= 32) && (y < 48))
		{
			x = x + 0x88;
			y = (y - 32) + 0x80;
		}

		if((y >= 48) && (y < 64))
		{
			x = x + 0x98;
			y = (y - 32) + 0x80;
		}

		w_code(y);
		y1++;
		w_code(x);     
		w_data(0);
		i++;
		w_data(0);
		i++;
	}

}
/************************************************************************************

                             写整屏点阵数据  
      
************************************************************************************/

void  write_lcd_full(uchar  * img )
{
		uint x2 = 0;
    	idata uchar  i,j,a;
	  	j = 0x80;          
	  	for(a = 0;a < 32;a++)
	  	{
			w_code(j);
			j++;
			w_code(0x80);   
	  		for(i = 0;i < 16;i ++)
	  		{ 
				w_data(img[x2]);
				x2++;
			}
		}

	  	j = 0x80;  
	  	for(a = 0;a < 32;a++)
	  	{
			w_code(j);
			j++;
			w_code(0x88);
	  		for(i = 0;i < 16;i ++)
	  		{
				w_data(img[x2]);
				x2++;
			}
		}
}
/************************************************************************************
---------------------------清屏函数  
---------------------------把所有的点都写0         
************************************************************************************/

void  lcd_clr()
{
	idata uchar  i,j,a;
	j = 0x80;  
	for(a = 0;a < 32;a++)
	{
		w_code(j);
		j++;
		w_code(0x80);
	  	for(i = 0;i < 16;i ++)
	  	{ 
			w_data(0x00);
		}
	}

	j = 0x80; 
	for(a = 0;a < 32;a++)
	{
		w_code(j);
		j++;
		w_code(0x88);
	  	for(i = 0;i < 16;i ++)
	  	{
			w_data(0x00);
		}
	}
}
/************************************************************************************

                             设置绘图模式    
																		 
************************************************************************************/
void set_huitu(void)
{
	w_code(0x32);//32 
	w_code(0x36);//36
}

/************************************************************************************

                             设置字符模式    
																		 
************************************************************************************/
void set_zifu(void)
{
	w_code(0x30);//30
}

/************************************************************************************

//向LCM发送一个字符串,长度64字符之内。  

************************************************************************************/
void lcm_w_word(uchar x,uchar y,uchar *str)
{
	x = x+y;
	w_code(x);
	while(*str != '\0')
	{
		w_data(*str++);
	}
	*str = 0;
}

⌨️ 快捷键说明

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