www.pudn.com > DPS2812_LCD.rar > LCD.C


/************************************************************************* 
	filename	LCD.c 
	designer	戴展波 
	date		2004/12/31 
*************************************************************************/ 
#include "DSP28_Device.h" 
#include "LCD.h" 
 
#ifndef bool 
#define bool unsigned short 
#define FALSE 0 
#define TRUE  1 
#endif 
 
/*************************************************************************** 
*	函数:	void wr_data(unsigned int data) 
*	目的:	写LCD数据参数,判断0和1位 
*	输入:	dat1 参数单元 
*	输出:	无 
*	参数:	status局部变量,用来存储LCD的状态量 
***************************************************************************/ 
 
void wr_data(unsigned int dat1) 
{ 
	unsigned int status; 
	do 
	{	 
		status = *c_addr & 0x03;		/* 屏蔽status的2~15位为0 */ 
	}while(status != 0x03); 
	*d_addr = dat1; 
} 
 
/*************************************************************************** 
*	函数:	void wr_data1(unsigned int dat1) 
*	目的:	写LCD数据参数,判断3位 
*	输入:	dat1 参数单元 
*	输出:	无 
*	参数:	status局部变量,用来存储LCD的状态量 
***************************************************************************/ 
 
void wr_data1(unsigned int dat1) 
{ 
	unsigned int status; 
	do 
	{ 
		status = *c_addr & 0x08;		/* 屏蔽status的0~2和3~15位为0 */ 
	}while(status != 0x08); 
	*d_addr = dat1; 
} 
 
/*************************************************************************** 
*	函数:	void wr_com(WORD com) 
*	目的:	写LCD指令参数 
*	输入:	com 指令单元 
*	输出:	无 
*	参数:	status局部变量,用来存储LCD的状态量 
***************************************************************************/ 
 
void wr_com(unsigned int com) 
{ 
	unsigned int status; 
	do 
	{	 
		status = *c_addr & 0x03; 
	}while(status != 0x03); 
	*c_addr = com; 
} 
 
/*************************************************************************** 
*	函数:	extern void GUILCD_init(void) 
 
*	目的:	初始化LCD显示,设置显示方式为图形方式,开显示 
 
*	输入:	无 
 
*	输出:	无 
****************************************************************************/ 
 
extern void GUILCD_init(void) 
{ 
	wr_data(0x00);		/*设置图形显示区域首地址*/	 
	wr_data(0x00);		/*或为文本属性区域首地址*/ 
	wr_com(0x42); 
	 
	wr_data(0x20);		/*设置图形显示区域宽度*/ 
	wr_data(0x00);		/*或为文本属性区域宽度*/ 
	wr_com(0x43); 
	 
	wr_com(0xa0);		/*光标形状设置*/ 
	 
	wr_com(0x81);		/*显示方式设置,逻辑或合成*/ 
	 
	wr_com(0x9b);		/*显示开关设置,仅文本开显示*/ 
	 
} 
 
/*************************************************************************** 
*	函数:	extern void GUILCD_clear(void) 
 
*	目的:	清LCD屏,用自动方式,将LCD屏清为白屏 
 
*	输入:	无 
 
*	输出:	无 
 
	参数:	page0局部变量 
***************************************************************************/ 
 
extern void GUILCD_clear(void) 
{ 
	int page0; 
 
	wr_data(0x00);		/*设置显示RAM首地址*/	 
	wr_data(0x00); 
	wr_com(0x24); 
	 
	wr_com(0xb0);		/*设置自动写方式*/ 
	 
	for(page0 = 0x2000; page0 >= 0; page0--) 
	{ 
		wr_data1(0x00);		/* 清0 */ 
	} 
	 
	wr_com(0xb2);		/* 自动写结束 */ 
} 
 
 
/*************************************************************************** 
*	函数:	void wr_letter(unsigned int code,unsigned int o_y,unsigned int o_x,bool fanxian) 
*	目的:	写字母,根据字母代码,将查找到的字母写到LCD的Y和X坐标处 
*	输入:	code	字母代码,字母为16×16点阵 
		o_y	y坐标,范围0~7 
		o_x	x坐标,范围0~14 
		fanxian 字母是否需要反显,0不需要反显,1需要反显 
*	输出:	无 
	参数:   
***************************************************************************/ 
 
void wr_letter(unsigned int code,unsigned int o_y,unsigned int o_x,unsigned short fanxian) 
{ 
	unsigned int i1,dat1_temp,dat2_temp; 
	unsigned int asc_code[8]; 
	int i2; 
	i1 = o_y * 0x20; 
	i1 = i1 + o_x; 
	dat1_temp = i1 & 0xff; 
	dat2_temp = (i1>>8) & 0xff; 
	 
	//getasc(code,&asc_code[0]);	/* 从FLASH中读取字母点阵 */ 
	for(i2 = 0; i2 <8; i2++) 
	{ 
		asc_code[i2] = zimu[8*code + i2]; 
	} 
	 
	if(fanxian == TRUE)		/* 是否反显 */ 
	{ 
		for(i2 = 0; i2 < 8; i2++) 
		{ 
			asc_code[i2] = (~asc_code[i2]) & 0xff; 
		} 
	} 
	 
	for(i2 = 0; i2 < 8; i2++) 
	{ 
		wr_data(dat1_temp); 
		wr_data(dat2_temp); 
		wr_com(0x24);		/* 字母在LCD的位置 */ 
	 
		 
		wr_data(asc_code[i2]);	/* 写字母点阵 */ 
		wr_com(0xc0); 
		 
		//wr_data(asc_code[2*i2+1]);	/* 写字母点阵 */ 
		//wr_com(0xc0); 
		 
		i1 = i1 + 0x20; 
		dat1_temp = i1 & 0xff; 
		dat2_temp = (i1>>8) & 0xff;	/* 写完后,修改在LCD的位置 */ 
	} 
} 
 
/*************************************************************************** 
*	函数:	void wr_hex(unsigned int code,unsigned int o_y,unsigned int o_x,bool fanxian) 
*	目的:	写汉字,将汉字区位代码中的字写入X和Y位置,可以设置为反显 
*	输入:	code	汉字区位代码 
		o_y	y坐标,范围0~7 
		o_x	x坐标,范围0~14 
		fanxian 反显 0:无 1:反显 
*	输出:	无 
***************************************************************************/ 
void wr_hex(unsigned int code,unsigned int o_y,unsigned int o_x,unsigned short fanxian) 
{ 
	unsigned int dat1_temp,dat2_temp; 
	unsigned int *code_temp; 
	int i1,i2,code_temp1; 
	unsigned int hanzi_conv[32]; 
	unsigned int hex_code[32]; 
	 
/*	code_temp1 = (code >> 8) & 0xff; 
	code_temp1 = code_temp1 - 0xa1; 
	code_temp1= code_temp1 * 94; 
	code_temp1 = code_temp1 + (code & 0xff); 
	code_temp1 = code_temp1 - 0xa1;			 
	 
	//gethz(code_temp1,&hanzi_conv[0]);		 
*/	 
	for(i1 = 0; i1 <32; i1++) 
	{ 
		hanzi_conv[i1] = hanzi[32*code + i1]; 
	} 
	 
	for(i2 = 0; i2 < 32; i2++) 
	{ 
		if(fanxian == FALSE)			/* 是否反显 */ 
		{ 
			hex_code[i2] = hanzi_conv[i2]; 
		} 
		else 
		{ 
			hex_code[i2] = (~hanzi_conv[i2]) & 0xff; 
		} 
	} 
	 
	i1 = o_y * 0x20; 
	i1 = i1 + o_x; 
	dat1_temp = i1 & 0xff; 
	dat1_temp = dat1_temp ; 
	dat2_temp = (i1>>8) & 0xff; 
	dat2_temp = dat2_temp; 
	code_temp = &hex_code[0]; 
	 
	for(i2 = 0; i2 < 16 ; i2++) 
	{ 
		wr_data(dat1_temp);			/* 汉字点阵在LCD中的位置 */ 
		wr_data(dat2_temp); 
		wr_com(0x24); 
			 
		wr_data(*(code_temp+i2*2));			/* 写入汉字点阵 */ 
		wr_com(0xc0); 
		 
		wr_data(*(code_temp+i2*2+1)); 
		wr_com(0xc0); 
		 
		//code_temp++; 
		i1 = i1 + 0x20; 
		dat1_temp = i1 & 0xff; 
		dat2_temp = (i1>>8) & 0xff;		/* 修改汉字点阵在LCD中的位置 */ 
	} 
} 
 
/*************************************************************************** 
*	函数:	void wr_dot(unsigned int o_y,unsigned int o_x,unsigned short flag) 
 
*	目的:	描点,根据flag的状态,在LCD显示器的指定在o_y和o_x处描点,如果flag=1, 
		描点;如果flag=0,清除点 
		 
*	输入:	o_y	Y轴,范围0~127 
		o_x	Y轴,范围0~239 
		flag	是否描点,flag=1,描点;flag=0,清点 
		 
*	输出:	无返回 
 
***************************************************************************/ 
void wr_dot(unsigned int o_y,unsigned int o_x,unsigned short flag) 
{ 
	int i,dat1_temp,dat2_temp,temp,temp1; 
//	i = o_y & 0x7f; 
	i = o_y * 0x20; 
	dat1_temp = i & 0xff; 
	dat2_temp = (i >> 8) & 0xff; 
	temp = o_x / 8; 
	dat1_temp = dat1_temp + temp; 
	temp1 = o_x - (temp * 8); 
	temp1 = 7 - temp1;			/* 设定描点的位置 */ 
	 
	wr_data(dat1_temp); 
	wr_data(dat2_temp); 
	wr_com(0x24); 
	 
	if(flag == 1) 
	{ 
		wr_com(0xf8 | temp1); 
	} 
	else 
	{ 
		wr_com(0xf0 | temp1); 
	} 
} 
 
/*************************************************************************** 
*	函数:	extern void GUILCD_writeCharStr(unsigned int Row, unsigned int Column, unsigned char *cString ,bool fanxian) 
*	目的:	写汉字字符串,将函数传递的字符串放在LCD屏的ROW行和COLUMN列的位置显示 
			自动写屏,直到字符串尾,判断为0停止。根据变量fanxi是否为0, 
			决定当前字符串是否反显。显示位置从LCD屏的ROW行和COLUMN列的位置开始, 
			为行显示,既ROW不变,COLUMN加1变化。 
*	输入:	//string	代码字符串 
		location	汉字在hanzi[]中的位置 
		ROW	汉字行,范围(0到7),代表字符串起始Y位置 
		COLUMN	汉字列,范围(0到14),代表字符串起始X位置 
		fanxian 反显 0:无 非0:反显 
*	输出:	无 
***************************************************************************/ 
extern void GUILCD_writeCharStr(unsigned int Row, unsigned int Column, unsigned int location ,unsigned short fanxian) 
{ 
	unsigned int ii1,ii4; 
	ii4 = 0; 
	//ii1 = *cString; 
	//while(ii1 != 0)				/* 判断字符串是否结束 */ 
	{ 
		wr_hex(location,Row*0x10,Column*2,fanxian);	/* 写汉字 */ 
		//Column++;				/* 列位置+1 */ 
		//ii4++; 
		//ii1 = *(cString + ii4);		/* 读字符串内的值 */ 
	} 
} 
 
/*************************************************************************** 
*	函数:	extern void GUILCD_writeLetterStr(unsigned int Row, unsigned int Column, unsigned char *cString,unsigned short fanxian ) 
 
*	目的:	写ASC码字符串,16*16点阵格式,将字符串string中的ASC码在LCD屏的 
		ROW和COLUMN坐标处显示,连续显示,直到字符串string串尾为0,ROW保持 
		不变,COLUMN加1。 
*	输入:	string	ASC代码字符串 
		ROW	y坐标,范围(0到7),代表字符串起始Y位置 
		COLUMN	x坐标,范围(0到14),代表字符串起始X位置 
		fanxian 反显 0:无 非0:反显 
*	输出:	无 
***************************************************************************/ 
extern void GUILCD_writeLetterStr(unsigned int Row, unsigned int Column, unsigned int location,unsigned short fanxian ) 
{ 
	unsigned int iii1,iii2;	 
	//iii2 = 0; 
	//iii1 = *cString; 
	//while(iii1 != 0)			/* 判断字符串是否结束 */ 
	{ 
		//iii2++; 
		wr_letter(location,Row*0x08,Column,fanxian); 
		//Column++; 
		//iii1 = *(cString + iii2); 
	} 
} 
/*************************************************************************** 
*	函数:	extern void GUILCD_writeCurse(unsigned int Row, unsigned int Column) 
*	目的:	显示光标,光标地址为Row(y轴),Column(x轴) 
			 
*	输入:	Row	y坐标(范围:0到7,代表8行汉字) 
		Column	x坐标(范围:0到14,代表15列汉字) 
			 
*	输出:	无 
*	参数:	无全局变量 
***************************************************************************/ 
extern void GUILCD_writeCurse(unsigned int Row, unsigned int Column) 
{ 
	unsigned int i1,dat1_temp,dat2_temp; 
	Row = Row * 0x10; 
	Column = Column * 2; 
	i1 = Row * 0x20; 
	i1 = i1 + Column + 0x1e0; 
	dat1_temp = i1 & 0xff; 
	dat2_temp = (i1>>8) & 0xff; 
	 
	wr_data(dat1_temp); 
	wr_data(dat2_temp); 
	wr_com(0x24); 
		 
	wr_data(0xff); 
	wr_com(0xc0); 
		 
	wr_data(0xff); 
	wr_com(0xc0);	 
} 
 
/*************************************************************************** 
*	函数:	extern void GUILCD_clearCurse(unsigned int Row, unsigned int Column) 
*	目的:	清光标,光标地址为ROW(y轴),COLUMN(x轴) 
			 
*	输入:	ROW	y坐标(范围:0到7,代表8行汉字) 
		COLUMN	x坐标(范围:0到14,代表15列汉字) 
			 
*	输出:	无 
*	参数:	无全局变量 
***************************************************************************/ 
 
extern void GUILCD_clearCurse(unsigned int Row, unsigned int Column) 
{ 
	unsigned int i1,dat1_temp,dat2_temp; 
	Row = Row * 0x10; 
	Column = Column * 2; 
	i1 = Row * 0x20; 
	i1 = i1 + Column + 0x1e0; 
	dat1_temp = i1 & 0xff; 
	dat2_temp = (i1>>8) & 0xff; 
	 
	wr_data(dat1_temp); 
	wr_data(dat2_temp); 
	wr_com(0x24); 
		 
	wr_data(0x00); 
	wr_com(0xc0); 
		 
	wr_data(0x00); 
	wr_com(0xc0); 
		 
} 
 
/*************************************************************************** 
*	函数:	extern void GUILCD_drawChart(unsigned int Row, unsigned int Column, int *Data, unsigned short flag) 
*	目的:	描点,从原点ROW和COLUMN处起始画一条线,线上每个点的位置根据*DATA定,FLAG来判断是否显示这条线。 
			 
*	输入:	Column	y坐标原点(范围:0到127,代表128行点) 
		Row	x坐标(范围:0到239,代表240列点) 
		*Data	数据,函数表达式为y=f(x),y为y轴,x为x轴 
		flag	显示	1:显示	0:不显示 
*	输出:	无 
*	参数:	无全局变量 
***************************************************************************/ 
extern void GUILCD_drawChart(unsigned int Row, unsigned int Column, int *Data, unsigned short flag) 
{ 
	int i,x,y; 
	for(i = 0; i < 240 - Column; i++) 
	{ 
		x = Column + i; 
		y = Row - *(Data + i); 
		wr_dot(y,x,flag); 
	} 
} 
 
/*************************************************************************** 
*	函数:	extern void GUILCD_onLed(void) 
*	目的:	开背光灯 
			 
*	输入:	无 
			 
*	输出:	无 
*	参数:	无全局变量 
***************************************************************************/ 
extern void GUILCD_onLed(void) 
{ 
//	asm(" ssbx XF"); 
} 
 
/*************************************************************************** 
*	函数:	extern void GUILCD_offLed(void) 
*	目的:	关背光灯 
			 
*	输入:	无 
			 
*	输出:	无 
*	参数:	无全局变量 
***************************************************************************/ 
extern void GUILCD_offLed(void) 
{ 
//	asm(" rsbx XF"); 
}