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

📄 sed1335.c

📁 C8051F020的SED1335驱动程序
💻 C
字号:
//============================================================================
// Header:   SED1335驱动320x240图形液晶驱动程序
// Author:   wjxiao 
// Date:     2005-08-15 
//============================================================================
#include <C8051F020.h>
//#include <CharInt.h>
#include <intrins.h>
#include <string.h>
#include <font.c>
#include <Asc16x24.c>
#include <ASc16x16.c>
#include <ASc8x16.c>
//============================================================================
// 	地址定义
//----------------------------------------------------------------------------
uchar	bdata	lcd_cbus;
sbit	WR	=	lcd_cbus^3;
sbit	RD	=	lcd_cbus^4;
sbit	CS	=	lcd_cbus^5;
sbit	A0	=	lcd_cbus^6;
sbit	RES	=	lcd_cbus^7;
//============================================================================
#define SystemSet	0x40	// 	初始化设置,后续8字节参数串ParaSysTable8[]
	uchar code ParaSysTable8[] = // P1-P8参数
	{	
		0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00	
	};	
//----------------------------------------------------------------------------  		
#define Scroll		0x44	// 	 显示域设置,后续10字节参数串ParaScrTableA[]
	#define BasePart1	0x00
	#define BasePart2	0x28
	#define BasePart3	0x28*2
	#define BasePart4	0x00
	uchar code ParaScrTableA[] = 
	{	
		0x00,BasePart1,0xF0,0x00,BasePart2,0xF0,0x00,BasePart3,0x00,BasePart4 
	};
//----------------------------------------------------------------------------
#define SleepIn		0x53	//	休闲模式设置  	 后续参数:无 

#define DispOn		0x59	//	显示状态设置  	 后续参数1字节
#define	DispOff		0x58

#define HdotScr		0x5a	//	点位移设置		 后续参数1字节 
#define	Ovlay		0x5b	//	显示合成方式设置 后续参数1字节
#define CgramAdr	0x5c	//	Cgram首地址设置	 后续参数2字节
#define	CsrForm		0x5d	//	光标形状设置	 后续参数2字节



#define CsrDirR		0x4c	//	光标移动方向设置  后续参数:无
#define CsrDirL		0x4d
#define CsrDirU		0x4e
#define CsrDirD		0x4f



#define	CsrW		0x46	//	光标指针设置	后续参数2字节
#define	CsrR		0x47	//	读取光标指针	后续参数2字节
#define	mWrite		0x42	//	数据写入设置	后续参数N字节
#define	mRead		0x43	//	数据读取设置	后续参数N字节
//==============================================================================
#define Busy		0x40	 // 忙状态标志位0b0100 0000
#define	paraP9		40		 // 相对于320 X 240
//==============================================================================
void WriteData( uchar dataW );
void WriteCommand( uchar CommandByte );
void LcmClear( uchar port );
void Locatexy(uchar x,uchar y, uchar attribs);
void PutStr24( uchar Port, uchar x, uchar y, char *ptr, uchar len, bit attr );
void PutStr16( uchar Port, uchar x, uchar y, char *ptr, uchar len, bit attr );
void PutStr32( uchar Port, uchar x, uchar y, char *ptr, uchar len, bit attr );
//============================================================================
// 写指令代码子程序 
//----------------------------------------------------------------------------
#define		databus		P7
void WriteCommand( uchar Command )
{	
	P74OUT   = 0xf3;

	CS  = 	0;
	A0	=	1;
	RD	=	1;
	WR	=	0; 
	P6	= lcd_cbus;
	databus	= Command;
	WR	=	1;
	CS = 1;
	P6	= lcd_cbus;
}
//============================================================================
// 写参数及显示数据子程序 
//----------------------------------------------------------------------------
void WriteData( uchar dataW )
{	
	P74OUT   = 0xf3;

	A0	=	0;
	RD	=	1;
	WR	=	0;  
	CS 	=	0;
	P6	= 	lcd_cbus;
	databus	= dataW;
	WR	=	1;
	CS = 1;
	P6	= lcd_cbus;
}
//============================================================================
// 读参数及显示数据子程序
//----------------------------------------------------------------------------
uchar ReadDataLcm( void )
{
	uchar dataD;
	
	P74OUT   = 0x33;
	P7  =	0xff;
	A0	=	1;
	WR	=	1;
	RD	=	0;   
	CS 	= 	0;
	P6	= 	lcd_cbus;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	dataD = databus;

	RD	=	1;
	CS  =   1;
	P6	= 	lcd_cbus;
	return dataD;
}
//============================================================================
// 	初试化
//----------------------------------------------------------------------------
void LcmInition( void ) 
{
	uchar i;
	
	RES = 1;	
	WriteCommand( SystemSet );		// 系统参数设置
	for (i=0;i<8;i++) 
	{				
		WriteData( ParaSysTable8[i] );	
	}

	WriteCommand( Scroll ); 		// 设定显示区域起始地址
	for (i=0;i<10;i++) 
	{
		WriteData( ParaScrTableA[i] );
	}

	WriteCommand( HdotScr );		// 写入点位移指令代码
	WriteData( 0 );					// 写入P1参数
	
	WriteCommand( Ovlay );			// 显示合成方式设置
	WriteData( 0x0d );				// 显示一区图形,三区图形属性,二重"异或"合成

	WriteCommand( DispOn );			// 写入指令代码
	WriteData( 0x14 );				// 显示 1~4 区开显示,光标关显示

   		
}
//============================================================================
// 	光标位定位,图形方式下
//	(1)	x:	水平方向字节单位坐标
//	(2)	y:	垂直方向以行线定位的坐标
//	(3) 左上角约定坐标为( 0, 0 )
//----------------------------------------------------------------------------
void Locatexy(uchar port, uchar x,uchar y)
{
	uint temp;
	
	temp = (uint)y*paraP9 + x;
	WriteCommand( CsrW );				// 光标Locate,定位
	WriteData( (uchar)(temp & 0xff) );	// 写入参数CSRL设置参数光标指针低8位
	WriteData( (uchar)( (temp >>8 ) + 0x28 * port) );	// 写入参数CSRH设置参数光标指针高8位
}													
//============================================================================
// 	清屏  port 区
//----------------------------------------------------------------------------
void LcmClear( uchar port )
{
	uint i = 40*240;

	WriteCommand( CsrDirR ); 			// 光标自动右移
	Locatexy( port,0,0 );
	WriteCommand( mWrite );				// 数据写入指令,代码0x42
	while(i--)	
		WriteData( 0 );
}
//============================================================================
// 	显示中西文混合字符串
//	(1) uchar port		: 	显示区
//	(2)	uchar x			:	水平方向字节单位坐标
//	(3) uchar y			:	垂直方向以行线定位的坐标
//	(4)	uchar * Str		:	字符串指针,以 \0 结尾
//	(5) uchar LibName	:	字库名(指针号)
//	(6)	bit attr		:	0 - 正常
//							1 - 反白
//----------------------------------------------------------------------------
void PutStr( uchar Port,uchar x,uchar y,char * Str,uchar LibName, bit attr)
{
	// 相对于ASCII,汉字为□字
	
	#define	Dot8	 	0 	
	#define	Dot16 		1
	#define	Dot24		2
	#define Dot32		3

	#define	ascii8		1, 16	
	#define	ascii16 	2, 16
	#define	ascii24		2, 24
	#define ascii32		0, 0

	#define	gb8			0, 0	
	#define	gb16	 	2, 16
	#define	gb24		3, 24
	#define gb32		4, 32
	
	uchar i,j,k;
	char  ASC_GB;
	char  code *p;

	struct
	{
	 	uchar byte;
		uchar high;					   
	} lattice[][4] = 
	{
	 	{	// ASCII字库
			ascii8	, 	
			ascii16	, 
			ascii24	, 
			ascii32	,
		},									  
		{
			gb8		,
			gb16 	, 
			gb24	, 
			gb32	,  	
		}
		
	};	
				 
	WriteCommand( CsrDirD );        // 	光标自动下移
 	
	for( i=0;i<strlen(Str);i++)	
	{
		uchar c1,c2;
	
		c1 = Str[i];
        c2 = Str[i+1];
		//--------------------------------------------------------------------
		if(c1 <=128)  // ASCII
		{
			ASC_GB = 0;
			switch(LibName)
			{
				case Dot8:
					j = Str[i]-0x20;
					p = Asc8x16[j];
					break;

				case Dot16:
					for(j=0;j<sizeof(Asc16x16)/sizeof(Asc16x16[0]);j++)   // 查找定位
            			if( c1 == Asc16x16[j].Index[0] ) break;
					p = Asc16x16[j].Msk;
					break;

				case Dot24:
					for(j=0;j<sizeof(Asc16x24)/sizeof(Asc16x24[0]);j++)   // 查找定位
            			if( c1 == Asc16x24[j].Index[0] ) break;
					p = Asc16x24[j].Msk;
					break;
			}
		}	
		else 	// 汉字	
		{
       	  	ASC_GB = 1;
		  	switch(LibName)
			{
				case Dot16:
					for(j=0;j<sizeof(GB16)/sizeof(GB16[0]);j++)   // 查找定位
            			if( c1 == GB16[j].Index[0] &&
							c2 == GB16[j].Index[1] ) 
						break;
				 	p = GB16[j].Msk;
					break;

				case Dot24:
					for(j=0;j<sizeof(GB24)/sizeof(GB24[0]);j++)   // 查找定位
            			if( c1 == GB24[j].Index[0] &&
							c2 == GB24[j].Index[1] ) 
						break;
				 	p = GB24[j].Msk;
					break;

				case Dot32:
					for(j=0;j<sizeof(GB32)/sizeof(GB32[0]);j++)   // 查找定位
            			if( c1 == GB32[j].Index[0] &&
							c2 == GB32[j].Index[1] ) 
						break;
				 	p = GB32[j].Msk;
					break;
			}
		}
		
		for(j=0;j<lattice[ASC_GB][LibName].byte;j++)  // 分列输出
        {
        	Locatexy(Port,x,y);
            WriteCommand( mWrite );     // 写数据(命令)
            for(k=0;k<lattice[ASC_GB][LibName].high;k++) 
			{					
				uchar dat;

				dat = *p++;
				if(attr) dat = ~dat;
				WriteData(dat);
			}
			x++;  // 列数加1 
        }
		if(ASC_GB) i++;
	}
}
//============================================================================
// 显示 显示光标
//----------------------------------------------------------------------------
void DispCursor(uchar x, uchar y, uchar byte, uchar High, bit attr )
{
	uchar i,j;

	WriteCommand( CsrDirD ); 
	
	for(i=0;i<byte;i++)             // 分列输出
    {
    	Locatexy(1,x+i,y);
        WriteCommand( mWrite );     // 写数据(命令)
        for(j=0;j<High;j++) 
			if(attr) WriteData( 0xff );
			else     WriteData( 0x00 );
    }	
}


//=====================================================================================
//  绘点子程序,携入参数X坐标的最高位决定写或擦点
// ====================================================
void Point(uchar port, uint Px, uchar Py, bit attr )
{
	uint tempPtr;
	uchar tempD,tempP;
		
	tempPtr = (uint)Py * paraP9 + Px / 8;		
	WriteCommand( CsrDirD );						// CSRDIR 代码(光标自动下移)
	WriteCommand( CsrW );							// 设置光标地址
	WriteData( (uchar)(tempPtr & 0xff) );
	WriteData( (uchar)(tempPtr /256) + 0x28 * port );
	WriteCommand( mRead );							// 读显示ram指令
	//Delay(50);
	tempD = ReadDataLcm();							// 读取当前显示数据
	tempP = 1<<(uchar)(7-Px & 0x0007);

// 根据预定属性决定写点或擦除
	if( attr )tempD |= tempP;	// 画点
	else tempD &= ~tempP;				// 消点

	WriteCommand( CsrW );						// 重新设置光标地址
	WriteData( (uchar)(tempPtr & 0xff) );
	WriteData( (uchar)(tempPtr /256) + 0x28 * port );
	WriteCommand( mWrite );						// 代码0x42,数据写入指令
	WriteData( tempD );							// 写入合成数据

}
/********************************************/
/*画线。任意方向的斜线,直线数学方程	aX+bY=1	*/
/********************************************/
// 参数类型有待修改
void Linexy(uchar port, uint x0,uchar y0,uint xt,uchar yt,bit att)
{
	register uint t;
	int xdata 	xerr=0,yerr=0,delta_x,delta_y,distance;
	int	xdata incx,incy;
	uint row,col;
	delta_x	= xt-x0;							//计算坐标增量
	delta_y	= yt-y0;
	col	= x0;
	row	= y0;
	if(delta_x>0) incx=1;						//设置单步方向
	else 
    {
    	if( delta_x==0	) incx=0;				//垂直线
		else {incx=-1;delta_x=-delta_x;}
	}
	if(delta_y>0) incy=1;
	else
    {
    	if( delta_y==0	) incy=0;				//水平线
		else {incy=-1;delta_y=-delta_y;}
	}
	if(	delta_x	> delta_y )	distance=delta_x;	//选取基本增量坐标轴
	else distance=delta_y;

	for( t=0;t <= distance+1; t++ )
	{											//画线输出
		Point(port,(uint)col,row,att);				//画点
		xerr +=	delta_x	;
		yerr +=	delta_y	;
		
		if(	xerr > distance	)
		{
			xerr-=distance;
			col+=incx;
		}
		if(	yerr > distance	)
		{
			yerr-=distance;
			row+=incy;
		}
	}
}
//======================================================================
//	矩形

void Rectangle(uchar port, uint x0, uchar y0, uint x1, uchar y1, bit attr)
{
	Linexy(port, x0, y0, x1, y0, attr);
	Linexy(port, x1, y0, x1, y1, attr);
	Linexy(port, x1, y1, x0, y1, attr);
	Linexy(port, x0, y1, x0, y0, attr);
}

void PortXCH(bit XCH) //	交换1、3显示区
{
	uchar i;
	uchar code ParaScrTableA[][10] = 
	{	
		0x00,0x00,  0xF0,0x00,0x28,0xF0,0x00,0x28*2,0x00,0 ,
		0x00,0x28*2,0xF0,0x00,0x28,0xF0,0x00,0x00,  0x00,0 ,		
	};
		
	WriteCommand( 0x44 ); 			//设定显示区域起始地址
	for (i=0;i<10;i++) 
		WriteData( ParaScrTableA[XCH][i] );
}

⌨️ 快捷键说明

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