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

📄 sed1335.c

📁 这是一整套USB2.0试验程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************************************************
文件名:SED1335.C
日期:2006-4-25 10:27 
作者:李升义
说明:SED1335驱动的320*240LCD操作文件。所用LCM为台湾华凌光电的WG320240B。
硬件接口:
        WG320240B引脚序号                       连接方式
        
		1...Vss.....Ground  					接地
		2...Vdd.....Power supply for logic		LCM电源,+5V
        3...VO......Driving voltage for LCD		LCM对比度调节
    	4...AO......P3^0                		数据/命令方式选择
    	5.../WR.....P3.1						写有效(低电平)
    	6.../RD.....P3.2						读有效(低电平)
    	7...D0 .....P5.0						数据总线 D0
		8...-D1 .....P5.1						数据总线 D1
		9...D2 .....P5.2						数据总线 D2
		10..D3 .....P5.3						数据总线 D3
		11..D4 .....P5.4						数据总线 D4
		12..D5 .....P5.5						数据总线 D5
		13..D6 .....P5.6						数据总线 D6
		14..D7 .....P5.7						数据总线 D7
    	15../CS.....P3.3                		LCM片选(低电平)
    	16../RES....P3.4                		LCM复位(低电平)
    	17..VEE.....-V out               		逆变-23.5V 负电压输出
    	18..NC			
    	19..NC
    	20..NC
******************************************************************************/
#include <stdlib.h>
#include <intrins.h>
#include <C8051F020.H>
#include <stdio.h>

#define	uchar unsigned char
#define uint unsigned int
//============================ SED1335 常用指令列表 ===============================
#define SystemSet	0x40									//软件初始化指令,8个参数
	
uchar code SysParaTable[]=
{
	0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00		  			//软件初始化指令参数表P1-P8
};

#define Scroll		0x44									//设置显示区域,卷动,10个参数	
#define BasePart1	0x00									//显示一区起始地址
#define BasePart2	0x40									//显示二区起始地址
#define BasePart3	0x80									//显示三区起始地址
#define BasePart4	0x00									//显示四区起始地址

uchar code ScrParaTable[]=									//Scroll命令参数表
{
	0x00,BasePart1,0xF0,0x00,BasePart2,0xF0,0x00,BasePart3,0x00,BasePart4
};

#define SleepIn		0x53									//空闲状态设置
#define DispOn		0x59									//开显示
#define	DispOff		0x58									//关显示
#define	Ovlay		0x5b									//规定画面重叠显示的合成方式及显示一、三区的显示属性,指令带有一个参数。
#define HdotScr		0x5a									//设置点单元卷动位置

#define CsrForm		0x5d                                    //设置光标形状
															
#define CsrDirR		0x4c									//光标右移
#define CsrDirL		0x4d									//光标左移
#define CsrDirU		0x4e									//光标上移
#define CsrDirD		0x4f								    //光标下移

#define	CsrW		0x46									//设置光标地址
#define	CsrR		0x47									//读出光标地址

#define	mWrite		0x42									//数据写入显示缓冲区
#define	mRead		0x43									//从显示缓冲区读数据
		
#define	paraP9		0x28		

/*
sbit A0 =  P3^0;                                            //命令数据方式选择
sbit WR =  P3^1;                                            //写信号
sbit RD =  P3^2;                                            //读信号
sbit CS =  P3^3;                                            //片选信号
sbit RST = P3^4;                                            //复位信号
*/
/*LCM控制信号连接改为
A0:P6.0
WR:P6.1
RD:P6.2
CS:P6.3
RST:Unconnected
*/

extern char code ASC_MSK[96*16];                            /*asc码库*/
extern char code HZ16_16[];                                 /*16*16汉字库(宋体)*/
extern char code HZ32_32[];                                 /*32*32汉字库(楷体)*/
extern char code HZ24_24[];									/*24*24汉字库(隶体)*/
//extern char code HZ12_12[];									/*12*12汉字库(宋体)*/
extern char code Logo[];                                    /*32*32公司标志*/



//===============LCM操作函数声明======================================================
void LcmInitialize( void );				                    /*液晶显示初始化*/
void WriteCommand( uchar CommandByte );                     /*写指令*/
void WriteData( uchar dataW );                              /*写参数及显示数据*/
void LcmClear( void );                                      /*清屏函数*/
void Delay( uint tt );                                      /*不精确延时函数*/

void Locatexy(uchar x,uchar y, uchar attribs);              /*定位光标*/
void Point(uint Px, uchar Py, uchar attr );                 /*描点*/
void Linexy(uint x0,uchar y0,uint xt,uchar yt,uchar att);   /*划线*/
void Putstr(uchar x,uchar y, uchar *pstr,uchar flag,bit inverse); /*输出16*16汉字字符串*/
void PutHz_32(uchar x,uchar y, uchar *pstr,uchar flag);     /*输出32*32汉字字符串*/
void PutHz_24(uchar x,uchar y, uchar *pstr,uchar flag);     /*输出24*24汉字字符串*/
//void PutHz_12(uchar x,uchar y, uchar *pstr,uchar flag);     /*输出12*12汉字字符串*/
void PutLogo(uchar x,uchar y, uchar flag);                  /*输出公司标志*/
void Circle(uint Ox,uchar Oy,uchar Rx,uchar attr);          /*画圆*/

void Send_int(uchar wei,uchar *str,uint shu);               /*整数输出到字符串*/
void SPutf(uchar *format,uchar *str,float fvar);            /*浮点数输出到字符串*/
void Put_uint(uchar x,uchar y,uchar weishu,uint shu,uchar attribte,bit inverse);/*显示整数*/
void Putf(uchar x,uchar y,uchar *p,float fbuf,uchar attribte);/*显示浮点数*/
uchar ReadDataLcm( void );                                  /*从LCM读数据*/

void EnableCursor(uchar flag);								/*显示光标并闪烁*/

/*----------------------------------
函数说明:LCM初始化
-----------------------------------*/
void LcmInitialize( void ) 
{
	uchar i;
//	RST = 0;
//	RST = 1;	
	WriteCommand( SystemSet );			                               // 系统参数设置
	for (i=0;i<8;i++) 				
		WriteData( SysParaTable[i] );	       
	WriteCommand( Scroll ); 			                               //设定显示区域起始地址
	for (i=0;i<10;i++)
		WriteData( ScrParaTable[i] );
	WriteCommand( HdotScr );		                                   // 写入点位移指令代码
	WriteData( 0 );					
	WriteCommand( Ovlay );			                                   // 显示合成方式设置
	WriteData( 4 );					                                   // 0000 0100 显示一区图形,三区文本属性,二重"或"合成
	WriteCommand( CsrForm );			                               // 设置光标形状
	WriteData( 0x07 );
	WriteData( 0x87 );
	WriteCommand( DispOn );			                                   // 开显示
	WriteData( 0x54 );												   // 显示 1~4 区开显示,光标关显示  
}
/*---------------------------
// 写指令代码子程序pr
______________________________*/
void WriteCommand( uchar CommandByte ) 
{  
	P74OUT |= 0x3c; 
//	CS=0;
//	A0=1;
//   WR=0;
	P6 = 0xF5;
    P5=CommandByte;
	P6 = 0xFf;
//    WR=1;
//    CS=1;  
}

/*---------------------------
// 写参数及显示数据子程序
-----------------------------*/
void WriteData( uchar dataW ) 
{ 
	P74OUT |= 0x3c;
//    CS=0;
//    A0=0;
//    WR=0;
	P6 = 0xF4;
    P5 = dataW;
	P6 = 0xFf;  
//    WR=1;
//    CS=1;  
}
/*---------------------------
// 读参数及显示数据子程序
-----------------------------*/
uchar ReadDataLcm( void ) 
{
	uchar cbuf;
    P74OUT |= 0x30;
	P74OUT &= 0xf3;
    P5=0xff;
//    CS=0;
//    A0=1;
//    RD=0;
	P6 = 0xF3;
    cbuf=P5;
//    RD=1;
//    CS=1;
	P6 = 0xFf;
    return cbuf;
}
/*======================== 清显示 32K RAM区(清屏)子程序 ======================*/
void LcmClear( void )
{
	uint i=32768;
	WriteCommand( CsrDirR ); 			// 光标移动方向定义:自动右移
	WriteCommand( CsrW );				// 光标Locate,定位
	WriteData( 0 );					    // 写入参数CSRL设置参数光标指针低8位
	WriteData( 0 );					    // 写入参数CSRH设置参数光标指针高8位
	WriteCommand( mWrite );				// 数据写入指令,代码0x42
	while(i--)
		WriteData(0x00);	            // 写入数据0	
}
//--------延时程序--------------------------
void Delay( uint tt ) 
{	
	while( tt-- );
}
/*---------------------------------------------------------------------------
 光标位定位,用于在1区图形方式下。
 输入参数约定:	x...水平方向字节单位坐标,即可以以半个汉字宽度设定水平坐标。
 				y...垂直方向以行线定位的坐标,可以定位到点单位。
				左上角约定坐标为( 0, 0 )
----------------------------------------------------------------------------*/
void Locatexy(uchar x,uchar y, uchar attribs) 
{
	uint temp;
	temp = (uint)y*paraP9+x;
	if(attribs)
		temp += BasePart2*256;	// 如果需要就指向第二区,加上第二区首地址
	WriteCommand( CsrW );				// 光标Locate,定位
	WriteData( (uchar)(temp & 0xff) );	// 写入参数CSRL设置参数光标指针低8位
	WriteData( (uchar)(temp /256 ) );	// 写入参数CSRH设置参数光标指针高8位
}
/********************************************/
/*画线。任意方向的斜线,直线数学方程	aX+bY=1	*/
/********************************************/
// 参数类型有待修改
void Linexy(uint x0,uchar y0,uint xt,uchar yt,uchar att)
{
	int t;
	int xerr=0,yerr=0,delta_x,delta_y,distance;
	int 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((uint)col,row,att);		       //画点
		xerr +=	delta_x	;
		yerr +=	delta_y	;
		
		if(xerr > distance)
		{
			xerr-=distance;
			col+=incx;
		}
		if(yerr > distance)
		{
			yerr-=distance;
			row+=incy;
		}
	}
}
/*====================================================
;  绘点子程序,携入参数X坐标的最高位决定写或擦点
 ====================================================*/
void Point(uint Px, uchar Py, uchar attr ) 
{
	uint tempPtr;
	uchar tempD,tempP;
		
	tempPtr = (uint)Py * paraP9 + (Px & 0x7fff)/8;	       // 去除最高位(显示属性)
	WriteCommand( CsrDirD );			       // CSRDIR 代码(光标自动下移)
	WriteCommand( CsrW );				       // 设置光标地址
	WriteData( (uchar)(tempPtr & 0xff) );
	WriteData( (uchar)(tempPtr /256) );
	WriteCommand( mRead );				       // 读显示ram指令
	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) );
	WriteCommand( mWrite );				       // 代码0x42,数据写入指令
	WriteData( tempD );				       // 写入合成数据
}
/************************************************/
/*画圆。数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2		*/
/************************************************/
void Circle(uint Ox,uchar Oy,uchar Rx,uchar attr)
{
	uint xx,rr,xt,yt,rs,col,row;
	yt=Rx;
	rr=Rx*Rx+1;			                       //补偿 1 修正方形
	rs=(yt+(yt>>1))>>1;		                       //(*0.75)分开1/8圆弧来画
	for (xt=0;xt<=rs;xt++)
	{
		xx=xt*xt;
		while ((yt*yt)>(rr-xx))yt--;
		col=Ox+xt;		                       //第一象限
		row=Oy-yt;
		Point(col,row,attr);
		col=Ox-xt;		                       //第二象限
		Point(col,row,attr);
		row=Oy+yt;		                       //第三象限
		Point(col,row,attr);
		col=Ox+xt;		                       //第四象限
		Point(col,row,attr);

/***************45度镜象画另一半***************/

		col=Ox+yt;		                       //第一象限
		row=Oy-xt;
		Point(col,row,attr);
		col=Ox-yt;		                       //第二象限
		Point(col,row,attr);
		row=Oy+xt;		                       //第三象限
		Point(col,row,attr);
		col=Ox+yt;		                       //第四象限
		Point(col,row,attr);
	}
}
/**********************************************
 ASCII(8*16) 及 汉字(16*16) 混合字符串显示函数	
 x,y显示字符串的左上角xy坐标.x..8点一字节位置; y..一条扫描线定位							
 *ptr...字符串指针,本函数所指的是flash字串
 att....显示区标志,0...第一区;1...第二区
***********************************************/
void Putstr(uchar x,uchar y,uchar  *pstr,uchar flag,bit inverse)

⌨️ 快捷键说明

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