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

📄 12864a.h

📁 液晶模块12864显示驱动程序
💻 H
字号:
#ifndef LCD_12864
#define	LCD_12864

#include <intrins.h>
#include <string.h>

/*****************************I/O口定义****************************
	1<------>GND		2<------>VCC
	3<------>VO			4<------>D/I
	5<------>R/W		6<------>E
	7--14<------>D0--D7
	15<----->CS2		16<----->CS1
	17<----->RES		18<----->VEE
	19<----->A			20<----->K
********************************************************************/

/*******************************************************************
	CS1			CS2			GDM12864A
	0			0			禁止使用
	0			1			左区
	1			0			右区
	1			1			未选
********************************************************************/
	#define COMMAND		0											//指令
	#define DATA		1											//数据

	sbit  BUSY	=	ACC^7;											//忙信号

	#define LCD_data	P3											//数据口
	sbit	RS	=		P1^0;										//控制口,H:数据,L:指令
	sbit	RW	=		P1^1;										//读写控制,H:读,L:写
	sbit	EN	=		P1^2;										//使能,下降沿处理任务
	sbit 	RST = 		P1^3;
	sbit	CS2	=		P1^4;										//左区
	sbit	CS1	=		P1^5;										//右区

	void display_on(unsigned char);
				/* L L H H H H H D *********/
		#define 		D			0x01							//显示开,状态字ON/OFF为L
		#define 		NO_D		0x00							//显示关,状态字ON/OFF为H
																	
	void home(unsigned char);										//显示起始地址设置
				/* H H L5 L4 L3 L2 L1 L0 ***/
	
	void page(unsigned char);										//页面地址设置
				/* H L H H H P2 P1 P0 ******/
		
	void address(unsigned char);									//列地址设置
				/* L H C5 C4 C3 C2 C1 C0 ***/

	void display_picture(unsigned char,unsigned char,unsigned char  *);		//写显示数据
	unsigned char wait();											//忙信号处理
	//void read();												   	//读显示数据
	void writelcd(unsigned char,unsigned char);						//写指令或数据
	void intital();													//液晶初始化函数
	void delay1ms(unsigned char);									//延时函数
	void display_hanzi(unsigned char,unsigned char,unsigned char *);
										
/////////////////////////////////////具体函数如下////////////////////////////////////
/****************数据会跨区显示可能是下载线原因,把下载线拔掉就不会重叠显示了*******/
	
/*****************************延时函数********************************************/

	void delay1ms(unsigned char count)
		{
			unsigned int i,j;
			for(i=0;i<count;i++)
			for(j=0;j<1000;j++);									//不能用自加形式
		}
	
/*****************************写函数**********************************************/

	void writelcd(unsigned char style,unsigned char input)
		{	
	  	//	delay1ms(1);											//延时不能太长,液晶处理是ns级																
			RS=style;
			RW=0;
			EN=0;								
			LCD_data=input;	_nop_(); _nop_();
			EN=1;	_nop_();_nop_();
			EN=0;
			wait();	
		}		

/*****************************忙处理函数*******************************************/
 
	unsigned char wait()
		{
			RW=1;
			RS=0;		_nop_();
			EN=1;		_nop_();
			do
				{
					ACC=LCD_data;	
				}
			while(BUSY==1);
			EN=0;
			return ACC;
		}
						 
/******************************显示开启函数****************************************/

	void display_on(unsigned char show)
		{
			CS1=1;CS2=1;
			writelcd(COMMAND,0x3e | show);
		}

/*******************************显示起始行设置函数*********************************/

	void home(unsigned char back)
		{
			writelcd(COMMAND,0xc0 | back);
		}

/*******************************页地址函数******************************************/

	void page(unsigned char page)
		{
			writelcd(COMMAND,0xb8 | page);
		}

/*******************************列地址函数*******************************************/

	void address(unsigned char add)
		
		{
		 	writelcd(COMMAND,0x40 | add);
		}

/*******************************清屏函数**********************************************/
 
	void clearscreen()
	 	{
			unsigned char i,j;
			CS1=1;CS2=1;			
  			for(i=0;i<8;i++)
				{
					page(i);
					address(0);
					for(j=0;j<64;j++)
						{	
							writelcd(DATA,0);
						}
				}
			//CS1=0;CS2=0;  
		}

/********************************词组显示函数****************************************/

	void display_hanzizu(unsigned char X ,unsigned char Y,unsigned char  *tab)
		{
			unsigned char i=0,j=0;
					
			unsigned char flat1,flat2,hang,lie;
			
			flat1=tab[0];											//列宽
			flat2=tab[1]/8;											
				if(tab[1]%8) flat2++;								//行数
							
			for(hang=X;hang<X+flat2;hang+=2)						//写行
				{ 		
					if(Y<=63)										//列显示处理
						{
							CS1=1;CS2=0;			
							for(i=0;i<flat1;i++)
								{	
									page(hang);
										if((Y+i)>63)
											{CS1=0;CS2=1;address(Y+i-64);}
							 			else
											address(Y+i);
										writelcd(DATA,tab[i*2+2]);
									page(hang+1);
										if((Y+i)>63)
											{CS1=0;CS2=1;address(Y+i-64);}
							 			else
											address(Y+i);
										writelcd(DATA,tab[i*2+1+2]);						
					 			}
						}
					else
						{
			 				lie=Y-64;
							CS1=0;CS2=1;								
							for(i=0;i<flat1;i++)
								{	
									page(hang);
										if((lie+i)>63)
											{CS1=1;CS2=0;address(lie+i-64);}
										else
											address(lie+i);
										writelcd(DATA,tab[i*2+2]);
									page(hang+1);
										if((lie+i)>63)
											{CS1=1;CS2=0;address(lie+i-64);}
										else
											address(lie+i);
									writelcd(DATA,tab[i*2+1+2]);
					 			}
						CS1=0;CS2=0;
						}
				}
			}						
/**********************************图形显示***********************************/
	
	void display_picture(unsigned char X,unsigned char Y,unsigned char *tab)
		{	
			unsigned char i,j;
			unsigned char flat1,flat2,hang,lie;

			flat1=tab[0];											//列宽
			flat2=tab[1]/8;											
				if(tab[1]%8) flat2++;								//行数
			for(i=Y;i<Y+flat1;i++)									//写列			
				{
					 if(i<=63)										//行显示处理
						{
							lie=i;
							CS1=1;CS2=0;			
							for(j=X;j<flat2+X;j++)
								{	
									hang=j%8;
									page(hang);
									address(lie);
										writelcd(DATA,tab[(i-Y)*flat2+j-X+2]);															
					 			}
						}
					else if(i>63&&i<=127)
						{
			 				lie=i-64;
							CS1=0;CS2=1;			
							for(j=X;j<flat2+X;j++)
								{	
									hang=j%8;
									page(hang);
									address(lie);
										writelcd(DATA,tab[(i-Y)*flat2+j-X+2]);
					 			}
						}
					else if(i>127)
						{
							lie=i-128;
							CS1=1;CS2=0;			
							for(j=X;j<flat2+X;j++)
								{	
									hang=j%8;
									page(hang);
									address(lie);
										writelcd(DATA,tab[(i-Y)*flat2+j-X+2]);
								}						
						}					
				 }
			CS1=0;CS2=0;							 
		}											   

/*********************************汉字显示函数****************************************/
/*****************************屏幕的左右与正面对自己的左右相反************************/
/*****************************调试时程序下载完,要拔下载线,单片机复位,否则可能双屏或重叠显示*/

	void display_hanzi(unsigned char X,unsigned char Y,unsigned char *tab)
		{
			unsigned char i;
			if(Y<63)
				{
					CS1=1;CS2=0;			
					for(i=0;i<16;i++)
						{	
							page(X);
							address(Y+i);
								writelcd(DATA,tab[i*2]);
							page(X+1);
							address(Y+i);
								writelcd(DATA,tab[i*2+1]);						
					 	}
				}
			else
				{
			 		Y=Y-64;
					CS1=0;CS2=1;								
					for(i=0;i<16;i++)
						{	
							
							page(X);
							address(Y+i);
								writelcd(DATA,tab[i*2]);
							page(X+1);
							address(Y+i);
								writelcd(DATA,tab[i*2+1]);
					 	}
					CS1=0;CS2=0;
				}
		}																	  

/***********************************初始化函数*****************************************/

	void intital()
		{	
			RST=0;
			delay1ms(1);
			RST=1;
			delay1ms(1);
			display_on(D);
			clearscreen();
			CS1=0;CS2=0;	
		}
#endif




⌨️ 快捷键说明

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