lcdrive.c

来自「ZLG的LPC2220读取SD卡的源代码」· C语言 代码 · 共 699 行 · 第 1/2 页

C
699
字号
/********************************************************************************************************
** 文件名:LCDDRIVE.C
** 功能:图形液晶240×128驱动(型号为YMSP-G240128A-1)。使用的SDRAM型号为62256A,为32K显存,地址为0000H~7FFFH。
**       显示是横向字节,高位在前。
** 说明:图形液晶采用T6963C液晶控制芯片,单5V供电。
**
**
*********************************************************************************************************/

#include "config.h"

#include "ASCII816.h" //标准ASCII库
#include "HZTable.h"  //汉字点阵库
#include "menu.h"     //菜单库


//以8*8字符计算,显示屏横向、纵向可以显示的字符个数

#define LineChar GUI_LCM_XMAX/8  	//一行字符数
#define ColumnChar GUI_LCM_XMAX/8  	//一列字符数


uint8 gui_disp_buf[][GUI_LCM_XMAX/8];   //声明显示缓冲区

void  DelayNS1(uint32  dly)
{   uint32  i;

    for(; dly>0; dly--) 
    {
        for(i=0; i<500; i++);
    }
}

/***LCM地址***/
#define       YM240128_COM        (*((volatile unsigned short *)0x82400006))
#define       YM240128_DAT        (*((volatile unsigned short *)0x82400004))

/********************************************************************************************************
** 名称:LCD_WriteCommand()
** 功能:写命令子程序(发送命令前,不检查液晶模块的状态)
** 入口参数:command			要写入LCM的命令字      
** 出口参数:无
** 说明:函数会设置LCM数据总线为输出方式
*********************************************************************************************************/

//#define			LCD_WriteCommand(command)		YM240128_COM = (uint16)command
void LCD_WriteCommand(uint8 command)	
{
	//volatile uint8 rr;
	//rr = command;
	//(*((volatile unsigned short *)0x81F00004))= rr;
	YM240128_COM = (uint16)command;
}


/********************************************************************************************************
** 名称:LCD_WriteData()
** 功能:写数据子程序(发送数据前,不检查液晶模块的状态)
** 入口参数:dat			要写入LCM的数据
** 出口参数:无
** 说明:函数会设置LCM数据总线为输出方式
*********************************************************************************************************/

//#define			LCD_WriteData(dat)		YM240128_DAT = (uint16)dat
void LCD_WriteData(uint8 dat)	
{
	//volatile uint8 rr;
	//rr = dat;
	//(*((volatile unsigned short *)0x81F00004))= rr;
	YM240128_DAT = (uint16)dat;
}


/********************************************************************************************************
** 名称:LCD_ReadState()
** 功能:读取状态字子程序
** 入口参数:无
** 出口参数:返回值即为读出的状态字
** 说明:函数会设置LCM数据总线为输出方式
*********************************************************************************************************/

//#define			LCD_ReadState()		YM240128_COM
uint32	LCD_ReadState(void)	
{
	return YM240128_COM;
}

/********************************************************************************************************
** 名称:LCD_ReadData()
** 功能:读取数据子程序
** 入口参数:无     
** 出口参数:返回值即为读出的数据
** 说明:函数会设置LCM数据总线为输出方式
*********************************************************************************************************/
//#define			LCD_ReadData()		YM240128_DAT
uint32	LCD_ReadData(void)
{
	return YM240128_DAT;
}

/*以下为LCM的驱动层,主要负责发送T6963的各种命令,提供设置显示地址等功能,在发送命令前会检测其状态字。
  带参数命令模式:先参数,后命令;操作模式:先命令,后数据 (先传递的是参数)*/


/*T6963命令定义*/

#define			LCD_CUR_POS			0x21		/*光标位置设置(只有设置到有效显示地址并打开显示时才看到)*/
#define			LCD_CGR_POS			0x22		/*CGRAM偏置地址设置(可以增加自己的符号)*/
#define			LCD_ADR_POS			0x24		/*地址指针位置(设置读写操作指针)*/


#define			LCD_TXT_STP			0x40		/*文本区首地址(从此地址开始向屏幕左上角显示字符)*/
#define			LCD_TXT_WID			0x41		/*文本区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数)*/

#define			LCD_GRH_STP			0x42		/*图形区首地址(从此地址开始向屏幕左上角显示字符)*/
#define			LCD_GRH_WID			0x43		/*图形区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数)*/


#define			LCD_MOD_OR  		0x80		/*显示方式:逻辑"或"*/
#define			LCD_MOD_XOR  		0x81		/*显示方式:逻辑"异或"*/
#define			LCD_MOD_AND  		0x82		/*显示方式:逻辑"与"*/
#define			LCD_MOD_TCH 		0x83		/*显示方式:文本特征*/


#define			LCD_DIS_SW  		0x90		/*显示开关:D0=1/0,光标闪烁启用/禁用*/
												/*     		D1=1/0,光标显示启用/禁用*/
												/* 			D2=1/0,文本显示启用/禁用(打开后再使用)*/
												/* 			D3=1/0,图形显示启用/禁用(打开后再使用)*/
												
												
#define			LCD_CUR_SHP			0xA0		/*光标形状选择:0xA0~0xA7表示光标占的行数*/												


#define			LCD_AUT_WR			0xB0		/*自动写设置*/	
#define			LCD_AUT_RD			0xB1		/*自动读设置*/	
#define			LCD_AUT_OVR			0xB2		/*自动读/写结束*/	


#define			LCD_INC_WR			0xC0		/*数据一次写,地址加1*/	
#define			LCD_INC_RD			0xC1		/*数据一次读,地址加1*/	
#define			LCD_DEC_WR			0xC2		/*数据一次写,地址减1*/	
#define			LCD_DEC_RD			0xC3		/*数据一次读,地址减1*/	
#define			LCD_NOC_WR			0xC4		/*数据一次写,地址不变*/	
#define			LCD_NOC_RD			0xC5		/*数据一次读,地址不变*/	


#define			LCD_SCN_RD			0xE0		/*屏读*/	
#define			LCD_SCN_CP			0xE8		/*屏拷贝*/	
#define			LCD_BIT_OP			0xF0		/*位操作:D0~D2用于定义D0~D7。D3为1时置位,为0时清除。*/	


/********************************************************************************************************
** 名称:LCD_TestStaBit01()
** 功能:判断读写指令和读写数据是否允许
** 入口参数:无     
** 出口参数:返回0表示禁止,否则表示允许
*********************************************************************************************************/

uint8 LCD_TestStaBit01(void)
{	uint8 i;
	uint32 RState;
	DelayNS1(1);
	
	for(i=100;i>0;i--)
	{	
		RState = LCD_ReadState();
		if((RState&0x03)==0x03) break;
		 DelayNS1(1);
	}
	if((RState&0x08)==0x08)
	{
		LCD_WriteCommand(LCD_AUT_OVR);
	}	
	return(i);
}



/********************************************************************************************************
** 名称:LCD_TestStaBit3()
** 功能:数据自动写状态是否允许
** 入口参数:无     
** 出口参数:返回0表示禁止,否则表示允许
*********************************************************************************************************/

uint8 LCD_TestStaBit3(void)
{	uint8 i;
	
	for(i=100;i>0;i--)
	{	if((LCD_ReadState()&0x08)==0x08) break;
	}
	return(i);
}



/********************************************************************************************************
** 名称:LCD_WriteTCommand1()
** 功能:写无参数命令子程序。会先判断LCM状态字
** 入口参数:command	要写入LCM的命令字     
** 出口参数:操作出错返回0,否则返回1
*********************************************************************************************************/

uint8 LCD_WriteTCommand1(uint8 command)
{	
	if(LCD_TestStaBit01()==0)  return(0);
	LCD_WriteCommand(command);   //发送命令字
	return(1);
}



/********************************************************************************************************
** 名称:LCD_WriteTCommand3()
** 功能:写双参数命令子程序。会先判断LCM状态字
** 入口参数:command	要写入LCM的命令字  
** 			 dat1		参数1
**			 dat2		参数2   
** 出口参数:操作出错返回0,否则返回1
** 说明:先发送两字节参数数据,再发送命令字
*********************************************************************************************************/

uint8 LCD_WriteTCommand3(uint8 command, uint8 dat1, uint8 dat2)
{		
	if(LCD_TestStaBit01()==0)  return(0);
	LCD_WriteData(dat1);   //发送参数1
	
	if(LCD_TestStaBit01()==0)  return(0);;
	LCD_WriteData(dat2);   //发送参数2
	
	if(LCD_TestStaBit01()==0)  return(0);
	LCD_WriteCommand(command);   //发送命令字
	
	return(1);
}



/********************************************************************************************************
** 名称:LCD_WriteTCommand2()
** 功能:写单参数命令子程序。会先判断LCM状态字
** 入口参数:command	要写入LCM的命令字  
** 			 dat1		参数1
** 出口参数:操作出错返回0,否则返回1
** 说明:先发送参数数据,再发送命令字
*********************************************************************************************************/

uint8 LCD_WriteTCommand2(uint8 command, uint8 dat1)
{	if(LCD_TestStaBit01()==0)  return(0);
	LCD_WriteData(dat1);   //发送参数1
		
	if(LCD_TestStaBit01()==0)  return(0);
	LCD_WriteCommand(command);   //发送命令字
	
	return(1);
}



/********************************************************************************************************
** 名称:LCD_WriteTData1()
** 功能:写1字节数据子程序。会先判断LCM状态字
** 入口参数:dat	要写入LCM的数据 
** 出口参数:操作出错返回0,否则返回1
*********************************************************************************************************/

uint8 LCD_WriteTData1(uint8 dat)
{	if(LCD_TestStaBit3()==0)  return(0);
	//DelayNS1(2);
	LCD_WriteData(dat);   //发送参数1
		
	return(1);
}



/********************************************************************************************************
** 名称:LCD_Initialize()
** 功能:LCM初始化,将LCM初始化为纯图形模式,显示地址为0x0000
** 入口参数:无
** 出口参数:无
** 说明:函数会设置LCM数据总线为输出方式
*********************************************************************************************************/

void LCD_Initialize(void)
{	

 	if(LCD_WriteTCommand3(LCD_TXT_STP,0x00,0x00) != 0) // 文本显示区首地址
 	LCD_WriteTCommand3(LCD_TXT_WID,0x1E,0x00);  // 文本显示区宽度
 	LCD_WriteTCommand3(LCD_GRH_STP,0x00,0x00);  // 图形显示区首地址
 	LCD_WriteTCommand3(LCD_GRH_WID,0x1E,0x00);  // 图形显示区宽度
 	LCD_WriteTCommand1(LCD_CUR_SHP | 0x01);  // 光标形状
 	LCD_WriteTCommand1(LCD_MOD_OR);   // 显示方式设置
 	LCD_WriteTCommand1(LCD_DIS_SW | 0x08);  // 显示开关设置
}



/********************************************************************************************************
** 名称:LCD_FillAll()
** 功能:LCD填充。以图形方式进行填充,起始地址为0x0000
** 入口参数:dat	要填充的数据
** 出口参数:无
** 说明:函数会设置LCM数据总线为输出方式
*********************************************************************************************************/

void LCD_FillAll(uint8 dat)
{	uint32	i;
	
	LCD_WriteTCommand1(LCD_MOD_OR);		
	LCD_WriteTCommand1(LCD_DIS_SW|0x08);
	DelayNS1(1);
	LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00);		//置地址指针
	LCD_WriteTCommand1(LCD_AUT_WR);					//自动写
	
	for(i=0;i<128*30;i++)
	{	 											//写数据
		LCD_WriteTData1(dat);
	}
	
	LCD_WriteTCommand1(LCD_AUT_OVR);				//自动写结束
	LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00);		//重置地址指针
}


/********************************************************************************************************
** 名称:LCD_FillRect()
** 功能:LCD填充一块黑块,表示选择了该行。以图形方式进行填充
** 入口参数:lin行,column列,level子目录或文件的级数,用来缩进,根目录=0
** 出口参数:无
** 说明:函数会设置LCM数据总线为输出方式
*********************************************************************************************************/

void LCD_FillRect(uint8 lin,uint8 level)
{	uint32	i,j;
	uint32 StartAddr;
	
	StartAddr=lin*LineChar + (12+level*2); //定位起始行
	
	LCD_WriteTCommand1(LCD_MOD_OR);		
	LCD_WriteTCommand1(LCD_DIS_SW|0x08);
	DelayNS1(1);
	
	for(j=0;j<16;j++)   //填充的高度
	{
		LCD_WriteTCommand3(LCD_ADR_POS,StartAddr&0xFF,StartAddr>>8);		//置地址指针
	
		for(i=0;i<(30-12-2*level);i++)  //填充的宽度
		{	 											//写数据
			LCD_WriteTCommand2(LCD_INC_WR,0xFF); 

⌨️ 快捷键说明

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