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

📄 lcddriver.c

📁 ST32F10xxx+uCOSII2.85在Keil 3.15b下源代码,这个是根据官方源码移植的,去掉了LCD驱动,目录结构简单化了,在ST32F103C8下使用ULINK调试通过(LED闪烁),可
💻 C
📖 第 1 页 / 共 2 页
字号:
/***********************************************************************************************
* 文件名:		LCDdriver.C
* 硬件:		SMG240128A
*				D0--D7  <===>  D0--D7
*				/WR     <===>  nWE
* 				/RD     <===>  nOE
*				/CE     <===>  nCS3_1
*				C/D     <===>  A1
*				/RST    <===>  VCC
* 功能:		图形液晶240*128驱动(型号为SMG240128A)。32K显示缓存,0000H-7FFFH地址。显示是横向字节,
*				高位在前。
* 说明:		图形液晶采用T6963C为LCD控制芯片,内带负压产生器,单5伏供电,并行接口(使用LPC2210驱动)。
* 日期:		20050510	来自周立功ARM开发板光盘实验5.7,更改了一些编译错误,
*							在GUI_Initialize()中增加LCDOpenLED(),使得开机后打开背景灯	
*							在LCDdriver.h中增加LCDOpenLED()、LCDCloseLED()函数用于控制背景灯
***********************************************************************************************/
#include	"..\src\config.h"
#include	"..\user\EXTVariable.h"

TCOLOR  	gui_disp_buf[GUI_LCM_YMAX][GUI_LCM_XMAX/8];				// 声明GUI显示缓冲区

// LCD引脚的控制方式
#define	LCD_IO_WRITE_COM		0
#define	LCD_IO_WRITE_DAT		1
#define	LCD_IO_READ_COM			2
#define	LCD_IO_READ_DAT			3
// 输出数据,因为使用的是PB9-15,所以需要读-改-写
#define	LCDOutputDatas(datas)	GPIO_Write(GPIO_LCD_DATA,(GPIO_ReadOutputData(GPIO_LCD_DATA)&0x00ff)+(datas<<8));
#define	LCDInputDatas()			(GPIO_ReadInputData(GPIO_LCD_DATA)>>8)
/***********************************************************************************************
* Name:		void LCD_WriteCommand(command)
* Input:	command  	要写入LCM的命令字
* Output:	
* Function:	写命令子程序。(发送命令前,不检查液晶模块的状态)
* Notes:	函数会设置LCM数据总线为输出方式
***********************************************************************************************/
uint16 LCDIOControl(uint8 command,uint16 datas)
{
	static uint8 old_command;
	
	// 输入输出控制,如果跟上次的状态不一样,则修改数据口的输入输出状态
	if((old_command & 0x02) != (command & 0x02))
	{
		GPIO_InitTypeDef gpio_init;
		
		gpio_init.GPIO_Pin  = GPIO_LCD_DATA_DATAS;
		gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
		// 输入/输出
		if(command & 0x02)
			gpio_init.GPIO_Mode = GPIO_Mode_IPU;
		else
			gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
		GPIO_Init(GPIO_LCD_DATA,&gpio_init);
	}
	// 控制方式
	switch(command)
	{
		case LCD_IO_WRITE_COM:
			GPIO_SetBits(GPIO_LCD_CON,GPIO_LCD_CON_CD);		// 命令
			GPIO_ResetBits(GPIO_LCD_CON,GPIO_LCD_CON_WR);	// 写使能
			GPIO_ResetBits(GPIO_LCD_CON,GPIO_LCD_CON_CE);	// 片选使能
			LCDOutputDatas(datas);
			GPIO_SetBits(GPIO_LCD_CON,GPIO_LCD_CON_CE);		// 片选禁止(送数据)
			break;
		case LCD_IO_WRITE_DAT:
			GPIO_ResetBits(GPIO_LCD_CON,GPIO_LCD_CON_CD);	// 数据
			GPIO_ResetBits(GPIO_LCD_CON,GPIO_LCD_CON_WR);	// 写使能
			GPIO_ResetBits(GPIO_LCD_CON,GPIO_LCD_CON_CE);	// 片选使能
			LCDOutputDatas(datas);
			GPIO_SetBits(GPIO_LCD_CON,GPIO_LCD_CON_CE);		// 片选禁止(送数据)
			break;
		case LCD_IO_READ_COM:
			GPIO_SetBits(GPIO_LCD_CON,GPIO_LCD_CON_CD);		// 命令
			GPIO_SetBits(GPIO_LCD_CON,GPIO_LCD_CON_WR);		// 写禁止(读使能)
			GPIO_ResetBits(GPIO_LCD_CON,GPIO_LCD_CON_CE);	// 片选使能
			datas = LCDInputDatas();
			GPIO_SetBits(GPIO_LCD_CON,GPIO_LCD_CON_CE);		// 片选禁止(送数据)
			break;
		case LCD_IO_READ_DAT:
			GPIO_ResetBits(GPIO_LCD_CON,GPIO_LCD_CON_CD);	// 数据
			GPIO_SetBits(GPIO_LCD_CON,GPIO_LCD_CON_WR);		// 写禁止(读使能)
			GPIO_ResetBits(GPIO_LCD_CON,GPIO_LCD_CON_CE);	// 片选使能
			datas = LCDInputDatas();
			GPIO_SetBits(GPIO_LCD_CON,GPIO_LCD_CON_CE);		// 片选禁止(送数据)
			break;
		default:
			break;
	}
	old_command = command;
	return(datas);
}
/***********************************************************************
* 名称:LCD_WriteCommand()
* 功能:写命令子程序。(发送命令前,不检查液晶模块的状态)
* 入口参数:command  	要写入LCM的命令字
* 出口参数:无
* 说明:函数会设置LCM数据总线为输出方式
***********************************************************************/
#define   LCD_WriteCommand(command)  LCDIOControl(LCD_IO_WRITE_COM,command)


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



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


/***********************************************************************
* 名称:LCD_ReadData()
* 功能:读取数据子程序。
* 入口参数:无
* 出口参数:返回值即为读出的数据
* 说明:函数会设置LCM数据总线为输入方式
***********************************************************************/
#define  LCD_ReadData()		LCDIOControl(LCD_IO_READ_DAT,0)


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

/* T6963C 命令定义 */
#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;

   for(i=100; i>0; i--)
   {  if( (LCD_ReadState()&0x03)==0x03 ) break;
   }
   
   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字节数据子程序。会先判断状态字。
* 入口参数:dat  		要写入LCM的数据
* 出口参数:操作出错返回0,否则返回1
***********************************************************************/
uint8  LCD_WriteTData1(uint8 dat)
{  if( LCD_TestStaBit3()==0 ) return(0);
   LCD_WriteData(dat);				// 发送命令字
   
   return(1);
}


/* 以下为LCM的用户接口层,主要负责解释用户命令,并发送到LCM,为用户编程提供接口 */


/***********************************************************************
* 名称:LCD_Initialize()
* 功能:LCM初始化,将LCM初始化为纯图形模式,显示起始地址为0x0000,。
* 入口参数:无
* 出口参数:无
* 说明:函数会设置LCM数据总线为输出方式
***********************************************************************/
void  LCD_Initialize(void)
{  LCD_WriteTCommand3(LCD_TXT_STP, 0x00, 0x00);			// 设置文本方式RAM起始地址
   LCD_WriteTCommand3(LCD_TXT_WID, 30, 0x00);			// 设置文本模式的宽度,宽度为N/6或N/8,N为宽度点数,如240
   LCD_WriteTCommand3(LCD_GRH_STP, 0x00, 0x00);			// 设置图形方式RAM起始地址
   LCD_WriteTCommand3(LCD_GRH_WID, 30, 0x00);			// 设置图形模式的宽度,宽度为N/6或N/8,N为宽度点数,如240
   LCD_WriteTCommand1(LCD_MOD_OR);						// 设置显示方式为"或"
   LCD_WriteTCommand1(LCD_DIS_SW|0x08);					// 设置纯图形显示模式
}


/***********************************************************************
* 名称:LCD_FillAll()
* 功能:LCD填充。以图形方式进行填充,起始地址为0x0000。
* 入口参数:dat		要填充的数据
* 出口参数:无
***********************************************************************/
void  LCD_FillAll(uint8 dat)
{  uint32  i;

   LCD_WriteTCommand3(LCD_ADR_POS, 0x00, 0x00);			// 置地址指针

⌨️ 快捷键说明

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