www.pudn.com > 320.rar > lcd.c


/********************************************************************************************************* 
**				                             320240ALCD控制 
** 
** 
**--------------当前版本信息---------------------------------------------------------------------------- 
** 文件名: lcd.c 
** 创建人: 刘明宇 
** 日 期: 2005年10月11日 
** 描 述: LCD320240A控制的主文件 
** 硬件连接 
** 51           lcd 
** P0~7-------->D0~7 
** P2.7-------->cs 
** P2.6-------->A0 
** P1.0-------->Res 
** wr  -------->wr 
** rd  -------->rd 
** 
**--------------历史版本信息---------------------------------------------------------------------------- 
** 无 
**------------------------------------------------------------------------------------------------------ 
** 修改人: 
** 日 期: 
** 描 述: 
** 
**------------------------------------------------------------------------------------------------------ 
********************************************************************************************************/ 
 
#include  
#include  
#include  
#include  
#include "lcd.h" 
#include "disdata.h" 
 
 
 
 
 
/*LCD initial parameters*/ 
/* 
	在下面的数据里面,第四个0x27对应是显示的横向范围,8位除去 
-------------------240128的SYSTEM SET 参数------------------------------- 
unsigned char SYSTAB[8]={0x30,0x87,0x09,0x1d,0x64,0xa0,0x1e,0x00}; 
 
unsigned char SCRTAB[10]={0x00,0x00,0xa0,0x00,0x00,0xa0,0x00,0x80,0x00,0x00}; 
 
Uchar code ParaSysTable8[]= { 
		             0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00		  		// P1-P8参数 
		}; 
*/ 
BYTE code SYSTAB[8]={0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00}; 
//BYTE code SYSTAB[8]={0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00}; 
BYTE code SCRTAB[10]={0x00,0x00,0xf0,0x00,0x40,0xf0,0x00,0x80,0x00,0x00}; 
 
/**************************************************************************** 
* 名称:main 
* 功能:主函数 
* 入口参数:无 
* 出口参数:无 
****************************************************************************/ 
void main(void) 
{ 
	BYTE i; 
	serial_init(); 
	Lcd_res=0; 
	Lcd_res=1; 
	test_serial(); 
 
	INITLCD(); 
	CLRSCREEN(); 
	FULLSCREEN(); 
	while(1) 
	{ 
		sam1(); 
		delaylong(50000); 
		CLRSCREEN(); 
		delaylong(10000); 
		FULLSCREEN(); 
		delaylong(10000); 
	} 
	 
} 
 
 
/*************************SBUROUTINES OF LCD DRIVE**************************/ 
 
/**************************************************************************** 
* 名称:WLCDCOM 
* 功能:写LCD控制命令 
* 入口参数:com 
* 出口参数:无 
****************************************************************************/ 
void WLCDCOM(BYTE com )  
//写LCD控制命令 
{ 
	SEDWRCOM=com; 
	_nop_(); 
} 
 
/**************************************************************************** 
* 名称:WLCDDATA 
* 功能:写LCD控制参数和显示字符数据 
* 入口参数:ref 
* 出口参数:无 
****************************************************************************/ 
void WLCDDATA(BYTE ref )  
//写LCD控制参数和显示字符数据 
{ 
	SEDWRDAT=ref; 
	_nop_(); 
} 
 
/**************************************************************************** 
* 名称:CLRVRAM 
* 功能:显示存储器清零 
* 入口参数:无 
* 出口参数:无 
****************************************************************************/ 
void CLRVRAM(void)  
//显示存储器清零 
{ 
	WORD i,j; 
	WLCDCOM(CSRRGT); 
	WLCDCOM(CSRW); 
	WLCDDATA(0x00); 
	WLCDDATA(0x00); 
	WLCDCOM(MWRITE); 
	for(i=0;i<=0xff;i++) 
	{ 
		for(j=0;j<=0xff;j++) 
		{ 
			WLCDDATA(0x00); 
		} 
	} 
} 
 
/**************************************************************************** 
* 名称:CLRSCREEN 
* 功能:清除显示屏幕 
* 入口参数:无 
* 出口参数:无 
****************************************************************************/ 
void CLRSCREEN(void) 
//清除显示屏幕 
{ 
	WORD i,j; 
	//BYTE a; 
	WLCDCOM(CSRRGT); 
	WLCDCOM(CSRW); 
	WLCDDATA(0X00); 
	WLCDDATA(0X00); 
	WLCDCOM(MWRITE); 
	/* 
	for(i=0;i<0xa0;i++) 
	{ 
		for(j=0;j<0x1e0;j++) 
		{ 
			WLCDDATA(0x00); 
		} 
	}*/ 
	for(i=0;i<9600;i++) 
	{ 
		WLCDDATA(0x00); 
	} 
} 
 
/**************************************************************************** 
* 名称:WNUMBER 
* 功能:显示0~9等10个数字 
* 入口参数:... 
* 出口参数:无 
****************************************************************************/ 
void WNUMBER(BYTE x,BYTE y,BYTE (*p)[16],BYTE num ) 
//功能:显示0~9等10个数字,num为要显示的数字的值(16×8) 
//x坐标寄存器(字节),y坐标寄存器(点行) 
{  
	WORD temp;  
	BYTE hi,lo; 
	BYTE a,b,c; 
	temp=y*AP; 
	hi=HIBYTE(temp); 
	lo=LOBYTE(temp); 
	lo=x+lo; 
	if(CY==1) {hi+=0x01;CY=0;} 
	 
	WLCDCOM(CSRDOWN); 
	WLCDCOM(CSRW); 
	WLCDDATA(lo); 
	WLCDDATA(hi); 
	WLCDCOM(MWRITE); 
	for(c=0;c<16;c++) 
	{ 
		WLCDDATA(*(*(p+num)+c)); 
	} 
	lo=lo+0x01; 
	if(CY==1) {hi+=0x01;CY=0;} 
} 
 
/**************************************************************************** 
* 名称:WBLOCK 
* 功能:显示16×8点字符 
* 入口参数:... 
* 出口参数:无 
****************************************************************************/ 
void WBLOCK(BYTE x,BYTE y,BYTE (*p)[16],BYTE num ) 
//功能:显示16×8点字符,num为要显示的字符块长度 
//x坐标为低8位寄存器(字节),y坐标寄存器(点行) 
{  
	WORD temp; 
	BYTE hi,lo; 
	BYTE a,b,c; 
	temp=y*AP; 
	hi=HIBYTE(temp); 
	lo=LOBYTE(temp); 
	lo=x+lo; 
	if(CY==1) {hi+=0x01;CY=0;} 
	 
	WLCDCOM(CSRDOWN); 
	WLCDCOM(CSRW); 
	WLCDDATA(lo); 
	WLCDDATA(hi); 
	WLCDCOM(MWRITE); 
	for(c=0;c<16;c++) 
	{ 
		WLCDDATA(*(*(p+num-1)+c)); 
	} 
	lo=lo+0x01; 
	if(CY==1) {hi+=0x01;CY=0;} 
} 
 
/**************************************************************************** 
* 名称:FILLBLOCK 
* 功能:显示16×16字符 
* 入口参数:... 
* 出口参数:无 
****************************************************************************/ 
void FILLBLOCK(BYTE x,BYTE y,BYTE len ) 
//功能:显示16×16字符,len为要显示的字符块的长度 
//x坐标为低8位寄存器(字节),y坐标寄存器(点行) 
{  
	WORD temp; 
	BYTE hi,lo; 
	BYTE a,b; 
	temp=y*AP; 
	hi=HIBYTE(temp); 
	lo=LOBYTE(temp); 
	lo=x+lo; 
	if(CY==1) {hi+=0x01;CY=0;} 
	for(b=0;b<0x10;b++)//**************************************************************这里要改  
	{ 
		WLCDCOM(CSRDOWN); 
		WLCDCOM(CSRW); 
		WLCDDATA(lo); 
		WLCDDATA(hi); 
		WLCDCOM(MWRITE); 
		for(a=0;a<16;a++) 
		{ 
			WLCDDATA(0xff); 
		} 
		lo=lo+0x01; 
		if(CY==1) {hi+=0x01;CY=0;} 
	} 
} 
 
/**************************************************************************** 
* 名称:CLRBLOCK 
* 功能:清除16×8字符快 
* 入口参数:... 
* 出口参数:无 
****************************************************************************/ 
void CLRBLOCK(BYTE x,BYTE y,BYTE len ) 
//清除16×8字符快,len为要清除的字符块的长度 
//x坐标寄存器(字节),y坐标寄存器(点行) 
{  
	WORD temp; 
	BYTE hi,lo; 
	BYTE a,b; 
	temp=y*AP; 
	hi=HIBYTE(temp); 
	lo=LOBYTE(temp); 
	lo=x+lo; 
	if(CY==1) {hi+=0x01;CY=0;} 
	for(b=0;b<0x10;b++)//**********************************************************这里要改 
	{ 
		WLCDCOM(CSRDOWN); 
		WLCDCOM(CSRW); 
		WLCDDATA(lo); 
		WLCDDATA(hi); 
		WLCDCOM(MWRITE); 
		for(a=0;a<16;a++) 
		{ 
			WLCDDATA(0x00); 
		} 
		lo=lo+0x01; 
		if(CY==1) {hi+=0x01;CY=0;} 
	} 
} 
 
 
/**************************************************************************** 
* 名称:WLCDCHR 
* 功能:显示16×32字符 
* 入口参数:... 
* 出口参数:无 
****************************************************************************/ 
void WLCDCHR(BYTE x,BYTE y,BYTE (*p)[32],BYTE num ) 
//功能:显示16×32字符,num为要显示字符数组的第一维的值 
//x坐标寄存器(字节),y坐标寄存器(点行) 
{  
	WORD temp;  
	BYTE hi,lo; 
	BYTE a,b,c; 
	temp=y*AP; 
	hi=HIBYTE(temp); 
	lo=LOBYTE(temp); 
	lo=x+lo; 
	if(CY==1) {hi+=0x01;CY=0;} 
	 
	WLCDCOM(CSRDOWN); 
	for(a=0;a<0x10;a++)//**********************************************************这里要改  
	{ 
		WLCDCOM(CSRW); 
		WLCDDATA(lo); 
		WLCDDATA(hi); 
		WLCDCOM(MWRITE); 
		for(c=0;c<0x20;c+=2) 
		{ 
			WLCDDATA(*(*(p+a)+c)); 
		} 
		lo=lo+0x01; 
		if(CY==1) {hi+=0x01;CY=0;} 
		 
		WLCDCOM(CSRW); 
		WLCDDATA(lo); 
		WLCDDATA(hi); 
		WLCDCOM(MWRITE); 
		for(c=1;c<0x20;c+=2) 
		{ 
			WLCDDATA(*(*(p+a)+c)); 
		} 
		lo=lo+0x01; 
		if(CY==1) {hi+=0x01;CY=0;} 
	 
	} 
} 
 
/**************************************************************************** 
* 名称:INITLCD 
* 功能:初始化LCD显示参数以及界面 
* 入口参数:... 
* 出口参数:无 
****************************************************************************/ 
void INITLCD(void)  
//初始化LCD显示参数以及界面 
{ 
	WORD a,b,c; 
	WLCDCOM(SYSSET); 
	for(b=0;b<8;b++) 
	{ 
		WLCDDATA(SYSTAB[b]); 
	} 
	WLCDCOM(SCROLL); 
	for(b=0;b<10;b++) 
	{ 
		WLCDDATA(SCRTAB[b]); 
		//WLCDDATA(0x00); 
	} 
	WLCDCOM(HDOTSCR); 
	WLCDDATA(0X00); 
	WLCDCOM(OVLAY); 
	WLCDDATA(0X1c); 
	WLCDCOM(DISPOFF); 
	WLCDDATA(0X56); 
	CLRVRAM(); 
	WLCDCOM(CSRFORM); 
	WLCDDATA(0X07); 
	WLCDDATA(0X8f); 
	WLCDCOM(DISPON); 
	WLCDDATA(0X16); 
 
} 
 
/**************************************************************************** 
* 名称:FULLSCREEN 
* 功能:清除显示屏幕 
* 入口参数:无 
* 出口参数:无 
****************************************************************************/ 
void FULLSCREEN(void) 
//清除显示屏幕 
{ 
	//WORD i,j; 
	WORD i; 
	//BYTE a; 
	WLCDCOM(CSRRGT); 
	WLCDCOM(CSRW); 
	WLCDDATA(0X00); 
	WLCDDATA(0X00); 
	WLCDCOM(MWRITE); 
	/* 
	for(i=0;i<320;i++) 
	{ 
		for(j=0;j<30;j++) 
		{ 
			WLCDDATA(0xff); 
		} 
	}*/ 
	for(i=0;i<9600;i++) 
	{ 
		WLCDDATA(0xff); 
	} 
} 
 
/**************************************************************************** 
* 名称:FULLSCREEN 
* 功能:清除显示屏幕 
* 入口参数:无 
* 出口参数:无 
****************************************************************************/ 
void sam1(void) 
{ 
	WORD i; 
	WLCDCOM(CSRRGT); 
	WLCDCOM(CSRW); 
	WLCDDATA(0X00); 
	WLCDDATA(0X00); 
	WLCDCOM(MWRITE); 
	 
	for(i=0;i<320*5*2;i++) 
	{ 
		WLCDDATA(Bmp1[i]); 
	} 
	 
	for(i=0;i<320*5*2;i++) 
	{ 
		WLCDDATA(Bmp1[i]); 
	} 
	 
	for(i=0;i<320*5*2;i++) 
	{ 
		WLCDDATA(Bmp1[i]); 
	} 
}