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

📄 lcdfile.c

📁 用SEED-DTK平台开发的液晶和键盘控制的源码
💻 C
字号:
 /**************************************************************************
*	dat1:		第一参数单元
*	dat2:		第二参数单元
*	com:		指令代码单元
*	com_addr:	指令通道地址
*	data_addr:	数据通道地址
**************************************************************************/
//#include "lcdfile.h"
#ifndef _register
#define _register

ioport unsigned port0019;
#define c_addr	port0019
	
ioport unsigned port0018;
#define d_addr	port0018

#endif

#ifndef bool
#define bool unsigned short
#define FALSE 0
#define TRUE  1
#endif

void wr_data(unsigned int dat1);
void wr_data1(unsigned int dat1);
void wr_com(unsigned int com);
void wr_letter(unsigned int code,unsigned int o_y,unsigned int o_x,bool fanxian);
void wr_hex(unsigned int code,unsigned int o_y,unsigned int o_x,bool fanxian);
void wr_dot(unsigned int o_y,unsigned int o_x,unsigned short flag);
void getASC(unsigned int apcode, unsigned int *ptr);
void getASC(unsigned int apcode, unsigned int *ptr);

extern void GUILCD_init(void);
extern void GUILCD_clear(void);
extern void GUILCD_writeLetterStr(unsigned int Row, unsigned int Column,unsigned char *cString,bool fanxian);
extern void GUILCD_writeCharStr(unsigned int Row, unsigned int Column, unsigned char *cString ,bool fanxian);
extern void GUILCD_writeCurse(unsigned int Row, unsigned int Column);
extern void GUILCD_clearCurse(unsigned int Row, unsigned int Column);
extern void GUILCD_drawChart(unsigned int Row, unsigned int Column, int *Data, unsigned short flag);
extern void GUILCD_onLed(void);
extern void GUILCD_offLed(void);


/***************************************************************************
*	函数:	void wr_data(unsigned int data)
*	目的:	写LCD数据参数,判断0和1位
*	输入:	data 参数单元
*	输出:	无
***************************************************************************/

void wr_data(unsigned int dat1)
{
	unsigned int status;
	do
	{	
		status = c_addr;
		status = status & 0x03;
	}while(status != 0x03);
	d_addr = dat1;
	dat1 = 0;
}

/***************************************************************************
*	函数:	void wr_data1(unsigned int data)
*	目的:	写LCD数据参数,判断3位
*	输入:	data 参数单元
*	输出:	无
***************************************************************************/

void wr_data1(unsigned int dat1)
{
	unsigned int status;
	do
	{
		
		status = c_addr;
		status = status & 0x08;
	}while(status != 0x08);
	d_addr = dat1;
}

/***************************************************************************
*	函数:	void wr_com0(WORD com)
*	目的:	写LCD指令参数
*	输入:	com 指令单元
*	输出:	无
***************************************************************************/

void wr_com(unsigned int com)
{
	unsigned int status;
	do
	{	
		status = c_addr;
		status = status & 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屏清为白屏

*	输入:	无

*	输出:	无
***************************************************************************/

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);
	}
	
	wr_com(0xb2);
}


/***************************************************************************
*	函数:	void wr_letter(WORD code,WORD attr,WORD o_y,WORD o_x)
*	目的:	写字母
*	输入:	code	代码
		attr	属性
		o_y	y坐标
		o_x	x坐标
*	输出:	无
***************************************************************************/

void wr_letter(unsigned int code,unsigned int o_y,unsigned int o_x,bool fanxian)
{
	unsigned int i1,dat1_temp,dat2_temp;
	unsigned int asc_code[32];
	int i2;
	i1 = o_y * 0x20;
	i1 = i1 + o_x;
	dat1_temp = i1 & 0xff;
	dat2_temp = (i1>>8) & 0xff;
	
	getasc(code,&asc_code[0]);
	
	if(fanxian == TRUE)
	{
		for(i2 = 0; i2 < 32; i2++)
		{
			asc_code[i2] = (~asc_code[i2]) & 0xff;
		}
	}
	
	for(i2 = 0; i2 < 16; i2++)
	{
		wr_data(dat1_temp);
		wr_data(dat2_temp);
		wr_com(0x24);
	
		
		wr_data(asc_code[2*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;
	}
}

/***************************************************************************
*	函数:	void wr_hex(WORD code,WORD o_y,WORD o_x,unsigned int fanxian)
*	目的:	写字母
*	输入:	code	代码
			o_y	y坐标
			o_x	x坐标
			fanxian 反显 0:无 1:反显
*	输出:	无
***************************************************************************/
void wr_hex(unsigned int code,unsigned int o_y,unsigned int o_x,bool fanxian)
{
	unsigned int dat1_temp,dat2_temp;
	unsigned int *code_temp;
	int i1,i2,code_temp1;
	unsigned int hanzi_conv[16];
	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;
	
//	code_temp1 = 0x0;
	gethz(code_temp1,&hanzi_conv[0]);
	
	for(i2 = 0; i2 < 16; i2++)
	{
		if(fanxian == FALSE)
		{
			hex_code[i2+0] = (hanzi_conv[i2] >> 8) & 0xff;
			hex_code[i2+16] = hanzi_conv[i2] & 0xff;
		}
		else
		{
			hex_code[i2+0] = ~(hanzi_conv[i2] >> 8);
			hex_code[i2+0] = hex_code[i2+0] & 0xff;
			hex_code[i2+16] = (~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);
		wr_data(dat2_temp);
		wr_com(0x24);
			
		wr_data(*code_temp);
		wr_com(0xc0);
		
		wr_data(*(code_temp + 0x10));
		wr_com(0xc0);
		
		code_temp++;
		i1 = i1 + 0x20;
		dat1_temp = i1 & 0xff;
		dat2_temp = (i1>>8) & 0xff;
	}
}

/***************************************************************************
*	函数:	extern void GUILCD_drawChart(unsigned int Row, unsigned int Column, int *Data);
*	目的:	写字母
*	输入:	code	代码
		o_y	y坐标
		o_x	x坐标
*	输出:	无
***************************************************************************/
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);
	}
}

/***************************************************************************
*	函数:	void hex_convert(char *string,unsigned int o_y,unsigned o_x)
*	目的:	写汉字字符串,将函数传递的字符串放在LCD屏的o_x和o_y坐标处的位置显示
			自动写屏,直到字符串尾,判断为0停止。根据变量fanxi是否为0,
			决定当前字符串是否反显。显示位置从LCD屏的o_x和o_y坐标处开始,
			为行显示,o_y不变,o_x加1变化。
*	输入:	string	代码字符串
		o_y	y坐标,范围(0到7),代表8行16*16点阵
		o_x	x坐标,范围(0到14),代表14列16*16点阵
		fanxian 反显 0:无 非0:反显
*	输出:	无
***************************************************************************/
extern void GUILCD_writeCharStr(unsigned int Row, unsigned int Column, unsigned char *cString ,bool fanxian)
{
	unsigned int ii1,ii4;
	ii4 = 0;
	ii1 = *cString;
	while(ii1 != 0)
	{
/*		ii4++;
		ii2 = ii1 << 8;
		ii2 = ii2 & 0xff00;
		ii3 = *(cString + ii4);
		ii3 = ii3 & 0xff;
		ii2 = ii2 | ii3;*/
		wr_hex(ii1,Row*0x10,Column*2,fanxian);
		Column++;
		ii4++;
		ii1 = *(cString + ii4);
	}
}

/***************************************************************************
*	函数:	void zimu_convert(char *string,unsigned int o_y,unsigned o_x)
*	目的:	写ASC码字符串,16*16点阵格式,将字符串string中的ASC码在LCD屏的
		o_x和o_y坐标处显示,连续显示,直到字符串string串尾为0,o_y保持
		不变,o_x加1。
*	输入:	string	代码字符串
		o_y	y坐标,范围(0到7),代表8行16*16点阵
		o_x	x坐标,范围(0到14),代表14列16*16点阵
*	输出:	无
***************************************************************************/
extern void GUILCD_writeLetterStr(unsigned int Row, unsigned int Column, unsigned char *cString,bool fanxian )
{
	unsigned int iii1,iii2;	
	iii2 = 0;
	iii1 = *cString;
	while(iii1 != 0)
	{
		iii2++;
		wr_letter(iii1,Row*0x10,Column*2,fanxian);
		Column++;
		iii1 = *(cString + iii2);
	}
}

/***************************************************************************
*	函数:	void wr_cursor(unsigned int o_y,unsigned o_x)
*	目的:	写光标
*	输入:	o_y	y坐标
			o_x	x坐标
*	输出:	无
***************************************************************************/
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);	
}

/***************************************************************************
*	函数:	void cr_cursor(unsigned int o_y,unsigned o_x)
*	目的:	清光标,光标地址为o_y(y轴),o_x(x轴)
			
*	输入:	o_y	y坐标(范围:0到7,代表8行汉字)
			o_x	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)
*	目的:	描点
			
*	输入:	Column	y坐标原点(范围:0到127,代表128行点)
		Row	x坐标(范围:0到239,代表240列点)
		*Data	数据,函数表达式为y=f(x),y为y轴,x为x轴
			
*	输出:	无
*	参数:	无全局变量
***************************************************************************/
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");
}

⌨️ 快捷键说明

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