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

📄 st7529.c

📁 St7529液晶模块在LPC2368下的驱动程序及基本显示
💻 C
📖 第 1 页 / 共 2 页
字号:
	}
	
	SetLcdReg(LineAddSet); // line address set
	WriteLcdData(TITLEHIGH+(MAXLINE-1)*LINEHIGH+12); 
	WriteLcdData(160-BOOMHIGH);
	h=160-BOOMHIGH-(TITLEHIGH+(MAXLINE-1)*LINEHIGH+12)+1;
	SetLcdReg(MemWrite);//DATA WRITE 	
	for(i=0;i<h;i++)
	{
		for(j=0;j<54;j++)	Dis_Drv2B3P(0);
	}
	DrowLine(TITLEHIGH-5);
	DrowLine(160-BOOMHIGH);
}



void  StateClear(void)	//清除状态拦
{
	int32 i,j;
	SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS 
	WriteLcdData(0x1f);// START COLUMN
	WriteLcdData(0x54);// ENDCOLUMN
	
	SetLcdReg(LineAddSet); // line address set
	WriteLcdData(0); 
	WriteLcdData(TITLEHIGH-4);
	
	SetLcdReg(MemWrite);//DATA WRITE 	
	for(i=0;i<TITLEHIGH-5;i++)
	{
		for(j=0;j<54;j++)	Dis_Drv2B3P(0);
	}
	
	SetLcdReg(LineAddSet); // line address set
	WriteLcdData(160-BOOMHIGH+1); 
	WriteLcdData(159);
	
	SetLcdReg(MemWrite);//DATA WRITE 	
	for(i=0;i<BOOMHIGH;i++)
	{
		for(j=0;j<54;j++)	Dis_Drv2B3P(0);
	}
}


void Display61(uint8 x,uint8 y,const uint8 *pic)	//在(x,y)处开始的9*12的区域显示pic,主要用于ASCII
{
	uint8 u8t,j;
	SetLcdReg(LineAddSet); // line address set
	WriteLcdData(y); 
	WriteLcdData(y+11); 

	SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS 
	WriteLcdData(32+x/3);// START COLUMN
	WriteLcdData(32+x/3+2);// ENDCOLUMN
	
	SetLcdReg(MemWrite);//DATA WRITE 
	for(j=0;j<12;++j)
	{
		u8t=pic[j]>>5;
		Dis_Drv2B3P(u8t);
		u8t=(pic[j]&0x1C)>>2;
		Dis_Drv2B3P(u8t);
		u8t=(pic[j]&0x03)<<1;
		Dis_Drv2B3P(u8t);
	}
}


void Display6(uint8 x,uint8 y,const uint8 *pic)		//在(x,y)处开始的6*12的区域显示pic,主要用于显示小数字(在SystemState.c中用)
{
	uint8 u8t,j;
	SetLcdReg(LineAddSet); // line address set
	WriteLcdData(y); 
	WriteLcdData(y+11); 

	SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS 
	WriteLcdData(32+x/3);// START COLUMN
	WriteLcdData(32+x/3+1);// ENDCOLUMN
	
	SetLcdReg(MemWrite);//DATA WRITE 
	for(j=0;j<12;++j)
	{
		u8t=pic[j]>>5;
		Dis_Drv2B3P(u8t);
		u8t=(pic[j]&0x1C)>>2;
		Dis_Drv2B3P(u8t);
	}
}


void Display12(uint8 x,uint8 y,const uint8 *pic)	//在(x,y)处开始的12*12的区域显示pic,主要用于汉字
{
	uint8 u8t,j;
	SetLcdReg(LineAddSet); // line address set
	WriteLcdData(y); 
	WriteLcdData(y+15); 

	SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS 
	WriteLcdData(32+x/3);// START COLUMN
	WriteLcdData(32+x/3+3);// ENDCOLUMN
	
	SetLcdReg(MemWrite);//DATA WRITE 
	for(j=0;j<12;++j)
	{
		u8t=pic[j*2]>>5;
		Dis_Drv2B3P(u8t);
		u8t=(pic[j*2]&0x1C)>>2;
		Dis_Drv2B3P(u8t);
		u8t=((pic[j*2]&0x03)<<1)|((pic[j*2+1]&0x80)>>7);
		Dis_Drv2B3P(u8t);
		u8t=(pic[j*2+1]&0x70)>>4;
		Dis_Drv2B3P(u8t);		
	}
}


void Display9(uint8 x,uint8 y,const uint8 *pic)		//在(x,y)处开始的9*12的区域显示pic 用于显示大数字
{
	uint8 u8t,j;
	SetLcdReg(LineAddSet); // line address set
	WriteLcdData(y); 
	WriteLcdData(y+15); 

	SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS 
	WriteLcdData(32+x/3);// START COLUMN
	WriteLcdData(32+x/3+2);// ENDCOLUMN
	
	SetLcdReg(MemWrite);//DATA WRITE 
	for(j=0;j<12;++j)
	{
		u8t=pic[j*2]>>5;
		Dis_Drv2B3P(u8t);
		u8t=(pic[j*2]&0x1C)>>2;
		Dis_Drv2B3P(u8t);
		u8t=((pic[j*2]&0x03)<<1)|((pic[j*2+1]&0x80)>>7);
		Dis_Drv2B3P(u8t);		
	}
}


void Display18(uint8 x,uint8 y,const uint8 *pic)		//在(x,y)处开始的18*18的区域显示pic 用于显示工作象限
{
	uint8 u8t,j;
	SetLcdReg(LineAddSet); // line address set
	WriteLcdData(y); 
	WriteLcdData(y+17); 

	SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS 
	WriteLcdData(32+x/3);// START COLUMN
	WriteLcdData(32+x/3+5);// ENDCOLUMN
	
	SetLcdReg(MemWrite);//DATA WRITE 
	for(j=0;j<18;++j)
	{
		u8t=pic[j*3]>>5;
		Dis_Drv2B3P(u8t);
		u8t=(pic[j*3]&0x1C)>>2;
		Dis_Drv2B3P(u8t);
		u8t=((pic[j*3]&0x03)<<1)|((pic[j*3+1]&0x80)>>7);
		Dis_Drv2B3P(u8t);
		u8t=(pic[j*3+1]&0x70)>>4;
		Dis_Drv2B3P(u8t);
		u8t=(pic[j*3+1]&0x0E)>>1;
		Dis_Drv2B3P(u8t);
		u8t=((pic[j*3+1]&0x01)<<2)|((pic[j*3+2]&0xC0)>>6);
		Dis_Drv2B3P(u8t);		
	}
}


void Dis_ASCII(uint8 x,uint8 y,uint8 c)		//显示ASCII(32~126)
{
	Display61(x,y,ASCII612+(c-32)*12);	//因为所取字库是从32开始取的,所以从(c-32)处取字库
}

void ReadGBToBuf(uint8 *ToBuf,uint8 *GbBuf)	//读取国标码汉字GbBuf字库到ToBuf
{
	int i,j;
	i=*GbBuf-0xa0;j=GbBuf[1]-0xa0;
	fnAT45DBXXX_Read(ToBuf,(HZK12+(94*(i-1)+(j-1))*24l),24);
}

void Dis_GB(uint8 x,uint8 y,uint8 *GbBuf)	//显示汉字
{
	ReadGBToBuf(Dis_HZK12Buf,GbBuf);
	Display12(x,y,Dis_HZK12Buf);
}


/*****************显示第y行显示缓冲的内容,该屏内容的起始显示行为start**************/
void DisplayLin(int32 y,int32 start)
{
	uint8 u8t;
	uint32 i,j,line;
	line=(y-start+3*MAXLINE)%MAXLINE*LINEHIGH+TITLEHIGH;	//y换算为起始点纵坐标
	y%=MAXLINE;
	
	/**************画定显示区域**********************/
	SetLcdReg(LineAddSet); // line address set
	WriteLcdData( line-1 );
	WriteLcdData( line+12 );
	SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS 
	WriteLcdData(0x1f);// START COLUMN
	WriteLcdData(0x54);// ENDCOLUMN
	
	y*=12;		//数据存储的启始行
	SetLcdReg( MemWrite ); // Entry Memory     Write Mode
	for(j=0;j<54;j++)	Dis_Drv2B3P(0);
	for( j = 0; j < 12 ; j++ )	//向指定显示区域中填入显示数据
	{
		u8t=0;
		for( i = 0 ; i < 6 ; i++ )
		{	
			u8t|=(Dis_ScrBuf[y+j][i*3]&0x80)>>7;
			Dis_Drv2B3P(u8t);
			u8t=(Dis_ScrBuf[y+j][i*3]&0x70)>>4;
			Dis_Drv2B3P(u8t);
			u8t=((Dis_ScrBuf[y+j][i*3]&0x0E)>>1);
			Dis_Drv2B3P(u8t);
			u8t=((Dis_ScrBuf[y+j][i*3]&0x01)<<2)|((Dis_ScrBuf[y+j][i*3+1]&0xC0)>>6);
			Dis_Drv2B3P(u8t);
			u8t=(Dis_ScrBuf[y+j][i*3+1]&0x38)>>3;
			Dis_Drv2B3P(u8t);
			u8t=(Dis_ScrBuf[y+j][i*3+1]&0x07);
			Dis_Drv2B3P(u8t);
			u8t=Dis_ScrBuf[y+j][i*3+2]>>5;
			Dis_Drv2B3P(u8t);
			u8t=(Dis_ScrBuf[y+j][i*3+2]&0x1C)>>2;
			Dis_Drv2B3P(u8t);
			u8t=((Dis_ScrBuf[y+j][i*3+2]&0x03)<<1);
		}
		u8t|=(Dis_ScrBuf[y+j][18]&0x80)>>7;
		Dis_Drv2B3P(u8t);
		u8t=(Dis_ScrBuf[y+j][18]&0x70)>>4;
		Dis_Drv2B3P(u8t);
		u8t=((Dis_ScrBuf[y+j][18]&0x0E)>>1);
		Dis_Drv2B3P(u8t);
		u8t=((Dis_ScrBuf[y+j][18]&0x01)<<2)|((Dis_ScrBuf[y+j][19]&0xC0)>>6);
		Dis_Drv2B3P(u8t);
		u8t=(Dis_ScrBuf[y+j][19]&0x38)>>3;
		Dis_Drv2B3P(u8t);
		u8t=(Dis_ScrBuf[y+j][19]&0x07);
		Dis_Drv2B3P(u8t);
	}
	for(j=0;j<54;j++)	Dis_Drv2B3P(0);
}

/*****************显示缓冲的内容,该屏内容的起始显示行为start**************/
void DisPlayBuf(int32 start)
{
	int32 i;
	for(i=0;i<MAXLINE;i++)
	{
		DisplayLin(i,start);
	}
}

/*****************在(x,y)处显示n个像素的数据缓冲的内容**************/
void DisPlay_DatBuf(int32 x,int32 y,int32 n)
{
	uint8 u8t;
	int32 s32t1,s32t2,i,j,k=0;
	SetLcdReg(LineAddSet); // line address set
	WriteLcdData( y );
	WriteLcdData( y+11 );
	u8t=0;
	
	x/=3;	//计算起始列,由于模块3像素为一列,显示以3像素下对齐,即显示实际横坐标为(x/3)*3
	if(n%3!=0)	//计算一共显示的列数,3像素上对齐,即n=7时为3列,n=12时为4列
	{	s32t1=n/3+1;}
	else
	{	s32t1=n/3;	}
	
	SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS 
	WriteLcdData(32+x);	// START COLUMN
	WriteLcdData(31+x+s32t1);	// END COLUMN  32+x+s32t1-1
	
	s32t2=n%8;	//计算最后一个缓冲字节中有多少像素
	n/=8;
	
	SetLcdReg( MemWrite );
	for( j = 0; j < 12 ; j++ )	//向指定显示区域中填入显示数据
	{
		for( i = 0 ; i < n ; i++ )
		{	
			u8t=Dis_DatLineBuf[j][i]>>5;
			Dis_Drv2B3P(u8t);
			u8t=(Dis_DatLineBuf[j][i]&0x1C)>>2;
			Dis_Drv2B3P(u8t);
			u8t=((Dis_DatLineBuf[j][i]&0x03)<<1);
			if(!(++i<n))
			{k=1;break;}	//k记最后一个缓冲整字节后中留下几个像素还没显示
			u8t|=(Dis_DatLineBuf[j][i]&0x80)>>7;
			Dis_Drv2B3P(u8t);
			u8t=(Dis_DatLineBuf[j][i]&0x70)>>4;
			Dis_Drv2B3P(u8t);
			u8t=((Dis_DatLineBuf[j][i]&0x0E)>>1);
			Dis_Drv2B3P(u8t);
			u8t=((Dis_DatLineBuf[j][i]&0x01)<<2);
			if(!(++i<n))
			{k=2;break;}
			u8t|=((Dis_DatLineBuf[j][i]&0xC0)>>6);
			Dis_Drv2B3P(u8t);
			u8t=(Dis_DatLineBuf[j][i]&0x38)>>3;
			Dis_Drv2B3P(u8t);
			u8t=(Dis_DatLineBuf[j][i]&0x07);
			Dis_Drv2B3P(u8t);
			u8t=0; k=0;
		}
		if(s32t2)	//如果最后一个整字节后还有需要显示的像素
		{
			switch(k)	//结合记最后一个整字节后中还没显示像素进行显示
			{
			case 0:u8t=Dis_DatLineBuf[j][n]>>5;
				Dis_Drv2B3P(u8t);
				if(s32t2<4) break;
				u8t=(Dis_DatLineBuf[j][n]&0x1C)>>2;
				Dis_Drv2B3P(u8t);
				if(s32t2<7) break;
				u8t=(Dis_DatLineBuf[j][n]&0x03)<<1;
				Dis_Drv2B3P(u8t);
				break;
			case 1:u8t|=(Dis_DatLineBuf[j][n]&0x80)>>7;
				Dis_Drv2B3P(u8t);
				if(s32t2<2) break;
				u8t=(Dis_DatLineBuf[j][n]&0x70)>>4;
				Dis_Drv2B3P(u8t);
				if(s32t2<5) break;
				u8t=((Dis_DatLineBuf[j][n]&0x0E)>>1);
				Dis_Drv2B3P(u8t);
				break;
			default:u8t|=((Dis_DatLineBuf[j][n]&0xC0)>>6);
				Dis_Drv2B3P(u8t);
				if(s32t2<3) break;
				u8t=(Dis_DatLineBuf[j][n]&0x38)>>3;
				Dis_Drv2B3P(u8t);
				if(s32t2<6) break;
				u8t=(Dis_DatLineBuf[j][n]&0x07);
				Dis_Drv2B3P(u8t);
			}
		}
		else
		{	if(k)	//送出最后没显示的数据
			{	Dis_Drv2B3P(u8t);	}
		}
	}
}


/*****************显示160*160的点阵图片**************/
void DisplayPic(const uint8 *pic)
{
	uint8 u8t;
	int32 j,i,s32t;
	
	//OSMutexPend(St7529Mutex,0,&err);
	
	/**************画定显示区域**********************/
	SetLcdReg(LineAddSet); // line address set
	WriteLcdData( 0 );
	WriteLcdData( 159 );
	SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS 
	WriteLcdData(0x1f);// START COLUMN
	WriteLcdData(0x54);// ENDCOLUMN
	
	SetLcdReg( MemWrite ); // Entry Memory     Write Mode
	for( j = 0; j < 160 ; j++ )	//向指定显示区域中填入显示数据
	{
		u8t=0;
		s32t=j*20;
		for( i = 0 ; i < 6 ; i++ )
		{	
			u8t|=(pic[s32t+i*3]&0x80)>>7;
			Dis_Drv2B3P(u8t);
			u8t=(pic[s32t+i*3]&0x70)>>4;
			Dis_Drv2B3P(u8t);
			u8t=((pic[s32t+i*3]&0x0E)>>1);
			Dis_Drv2B3P(u8t);
			u8t=((pic[s32t+i*3]&0x01)<<2)|((pic[s32t+i*3+1]&0xC0)>>6);
			Dis_Drv2B3P(u8t);
			u8t=(pic[s32t+i*3+1]&0x38)>>3;
			Dis_Drv2B3P(u8t);
			u8t=(pic[s32t+i*3+1]&0x07);
			Dis_Drv2B3P(u8t);
			u8t=pic[s32t+i*3+2]>>5;
			Dis_Drv2B3P(u8t);
			u8t=(pic[s32t+i*3+2]&0x1C)>>2;
			Dis_Drv2B3P(u8t);
			u8t=((pic[s32t+i*3+2]&0x03)<<1);
		}
		u8t|=(pic[s32t+18]&0x80)>>7;
		Dis_Drv2B3P(u8t);
		u8t=(pic[s32t+18]&0x70)>>4;
		Dis_Drv2B3P(u8t);
		u8t=((pic[s32t+18]&0x0E)>>1);
		Dis_Drv2B3P(u8t);
		u8t=((pic[s32t+18]&0x01)<<2)|((pic[s32t+19]&0xC0)>>6);
		Dis_Drv2B3P(u8t);
		u8t=(pic[s32t+19]&0x38)>>3;
		Dis_Drv2B3P(u8t);
		u8t=(pic[s32t+19]&0x07);
		Dis_Drv2B3P(u8t);	
	}
}

void LCD_Reset()	//复位模块
{
	LcdRestSet(0);
	OSTimeDly(OS_TICKS_PER_SEC/2);
	LcdRestSet(1);
	OSTimeDly(OS_TICKS_PER_SEC/2);
}

⌨️ 快捷键说明

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