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

📄 lcddrive.c

📁 基于LPC2132和图形液晶128*64(型号为MGL(S)-12864T)的控制显示系统。可以显示时间
💻 C
📖 第 1 页 / 共 2 页
字号:
		  
/****************************************************************************************
* 文件名:LCDDRIVE.C
* 功能:图形液晶128*64驱动(型号为MGL(S)-12864T)。62K显示存,0000H-7FFFH地址。显示是横向字节,高位
*      在前。
* 说明:图形液晶采用T6963C为LCD控制芯片,内带负压产生器,单5伏供电,并行接口(使用LPC2132驱动)。


次页面内的函数只是命令,具体的控制信号需要在主程序调用这些函数前进行定义即使能
/****************************************************************************************/
#include	<includes.h>
#include <LPC21xx.H> 
#include <stdio.h>
/***********************************/

#define  GUI_LCM_XMAX		128							/* 定义液晶x轴的点数 */
#define  GUI_LCM_YMAX		64							/* 定义液晶y轴的点数 */

#define  LCD_CD		   		0x08000000
#define	 LCD_WR				0x08000000
#define	 LCD_RD				0x10000000
#define	 LCD_CE				0x20000000
#define  LCD_RST			0x01000000
#define  LCD_DIR			0x00400000
#define	 BEEPCON			0x80000000
#define  LCD_BL				0x00800000
#define  TCOLOR		uint8
extern	uint8  	gui_disp_buf[GUI_LCM_YMAX][GUI_LCM_XMAX/8];				// 声明显示缓冲区


	uint8 shuzi_0[12]={0x00,0x00,0x1C,0x22,0x22,0x22,0x22,0x22,0x22,0x1C,0x00,0x00,};  //  文字:  0  
	uint8 shuzi_1[12]={0x00,0x00,0x08,0x18,0x08,0x08,0x08,0x08,0x08,0x1C,0x00,0x00,} ; //  文字:  1  
	uint8 shuzi_2[12]={0x00,0x00,0x1C,0x22,0x22,0x04,0x08,0x10,0x20,0x3E,0x00,0x00,} ; //  文字:  2  
	uint8 shuzi_3[12]={0x00,0x00,0x1C,0x22,0x02,0x0C,0x02,0x02,0x22,0x1C,0x00,0x00,};  //  文字:  3  
	uint8 shuzi_4[12]={0x00,0x00,0x04,0x0C,0x14,0x14,0x24,0x3E,0x04,0x0E,0x00,0x00,};  //  文字:  4  
	uint8 shuzi_5[12]={0x00,0x00,0x3E,0x20,0x20,0x3C,0x02,0x02,0x22,0x1C,0x00,0x00, }; //  文字:  5  
	uint8 shuzi_6[12]={0x00,0x00,0x1C,0x22,0x20,0x3C,0x22,0x22,0x22,0x1C,0x00,0x00,};  //  文字:  6  
	uint8 shuzi_7[12]={0x00,0x00,0x3E,0x24,0x04,0x08,0x08,0x08,0x08,0x08,0x00,0x00,};  //  文字:  7  
	uint8 shuzi_8[12]={0x00,0x00,0x1C,0x22,0x22,0x1C,0x22,0x22,0x22,0x1C,0x00,0x00, }; //  文字:  8  
	uint8 shuzi_9[12]={0x00,0x00,0x1C,0x22,0x22,0x22,0x1E,0x02,0x22,0x1C,0x00,0x00,};  //  文字:  9 
	uint8 shuzi_kg[12]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; //  空格
  /* 数字 */
uint8 data1[180]={	
	0x00,0x00,0x1C,0x22,0x22,0x22,0x22,0x22,0x22,0x1C,0x00,0x00,  //  文字:  0  
	0x00,0x00,0x08,0x18,0x08,0x08,0x08,0x08,0x08,0x1C,0x00,0x00,  //  文字:  1  
	0x00,0x00,0x1C,0x22,0x22,0x04,0x08,0x10,0x20,0x3E,0x00,0x00,  //  文字:  2  
	0x00,0x00,0x1C,0x22,0x02,0x0C,0x02,0x02,0x22,0x1C,0x00,0x00,  //  文字:  3  
	0x00,0x00,0x04,0x0C,0x14,0x14,0x24,0x3E,0x04,0x0E,0x00,0x00,  //  文字:  4  
	0x00,0x00,0x3E,0x20,0x20,0x3C,0x02,0x02,0x22,0x1C,0x00,0x00,  //  文字:  5  
	0x00,0x00,0x1C,0x22,0x20,0x3C,0x22,0x22,0x22,0x1C,0x00,0x00,  //  文字:  6  
	0x00,0x00,0x3E,0x24,0x04,0x08,0x08,0x08,0x08,0x08,0x00,0x00,  //  文字:  7  
	0x00,0x00,0x1C,0x22,0x22,0x1C,0x22,0x22,0x22,0x1C,0x00,0x00,  //  文字:  8  
	0x00,0x00,0x1C,0x22,0x22,0x22,0x1E,0x02,0x22,0x1C,0x00,0x00,  //  文字:  9  
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,  //  文字:  .
	0x00,0x00,0x1C,0x22,0x22,0x04,0x08,0x08,0x00,0x08,0x00,0x00,  //  文字: ?
	0x04,0x0C,0x1C,0x3C,0x7C,0xFC,0xFC,0x7C,0x3C,0x1C,0x0C,0x04,  //  左箭头			
	0x20,0x30,0x38,0x3C,0x3E,0x3F,0x3F,0x3E,0x3C,0x38,0x30,0x20,  //  右箭头
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //  空格
	} ;
	uint8 Matrixxie[17]=
{
/*------------------------------------------------------------------------------
;  源文件 / 文字: /
;  宽×高(像素) : 18×7
------------------------------------------------------------------------------*/
  0x00,0x00,0x02,0x04,0x04,0x04,0x08,
  0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x40,
  0x80,0x00
};
uint8 MatrixMaohao[12]=
{
/*------------------------------------------------------------------------------
;  源文件 / 文字: :
;  宽×高(像素) : 18×7
------------------------------------------------------------------------------*/
 0x00,0x00,
  0x00,0x10,0x10,0x00,0x00,0x10,0x10,0x00,
  0x00,0x00
};

/************************************************
*	名称:DelayNS()
*	功能:长软件延时
*	入口参数:dly				延时参数,值越大,延时越长
*	出口参数:无
***************************************************/
void DelayNs(uint32 dly)
{	uint32	i;
	for(;dly>0;dly--)
		for(i=0;i<250;i++);
}
/* *************硬件连接:D0--D7  <===>  P1.16--P1.23    PINSEL2 =0x0008H  P1:25:16 用作GPIO 管脚。

*           	/WR     <===>  P0.27
*          		/RD     <===>  P0.28
*           	/CE     <===>  P0.29
*           	/RST    <===>  P1.24 
*           	C/D     <===>  P1.27/TDO    跳线


/***********************************************************************
* 名称:LCD_WriteCommand()
* 功能:写命令子程序。(发送命令前,不检查液晶模块的状态)
* 入口参数:command  	要写入LCM的命令字
* 出口参数:无
* 说明:函数会设置LCM数据总线为输出方式
***********************************************************************/
extern void   LCD_WriteCommand(uint8 lcdcommand)  
	   { 
	    uint32 lcdcommand32;
		uint8  lcdcommand8;	
         IODIR1=IODIR1|0x00FF0000;				/*P1.16--p1.23作为GPIO输出口*/

		IOSET0|=LCD_DIR;					//74HC245 DIR 为高时数据从左到右
	DelayNs(1);
		IOSET1|=LCD_CD; 				//  指令通道使能=1
		DelayNs(1);
		IOCLR0|=LCD_CE;				//  片选使能
	 	DelayNs(1);
		IOCLR0|=LCD_WR;				//	LCD写使能
		DelayNs(1);

		lcdcommand8=lcdcommand;
	   
	   	lcdcommand32 = lcdcommand8 << 16;						/*数据向左移16位*/
	    IOPIN1=(IOPIN1&0xFF00FFFF)|lcdcommand32;
		//IOCLR0|=LCD_WR;
						//	LCD写使能
		DelayNs(1);//需要延时
		
		IOSET0|=LCD_WR;				 //	 LCD写使能停止
		IOSET0|=LCD_CE;				 //  LCD片选停止
   		DelayNs(1);
		IOSET1|=LCD_CD;				 //  写数据使能 终止  
	  	DelayNs(1);
   	  }

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

	   IODIR1=IODIR1|0x00FF0000;						/*P1.16--p1.23作为GPIO输出口*/
	 	
		IOSET0|=LCD_DIR;					//74HC245 DIR 为高时数据从左到右
		DelayNs(1);
		IOCLR1|=LCD_CD;			//数据通道使能 =0
		DelayNs(1);
		IOCLR0|=LCD_CE;
		DelayNs(1);
	 	IOCLR0|=LCD_WR;				//	LCD写使能
		DelayNs(1);
	 	
		
		lcddat32=lcddat;
	   	lcddat32 <<= 16;   								/*数据向左移16位*/
	    IOPIN1=(IOPIN1&0xFF00FFFF)|lcddat32;
		
		DelayNs(1);	//需要延时
		
		IOSET0|=LCD_WR;				 //	LCD写使能停止
		IOSET0|=LCD_CE;				 //LCD片选停止
		DelayNs(1);
   		IOSET1|=LCD_CD;				//写数据使能 终止
		DelayNs(1);
	  }



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

		IOCLR0|=LCD_DIR;					//74HC245 DIR 为低时数据从右到左
		DelayNs(1);
		IODIR1=IODIR1&0xFF00FFFF;								/*P1.16--p1.23作为GPIO输入口*/
		DelayNs(1);
		IOSET1|=LCD_CD;					//数据通道使能 =0
			DelayNs(1);
		IOCLR0|=LCD_CE;					//片选LCD
		DelayNs(1);
		IOCLR0|=LCD_RD; 						//读使能
	
	 	
	 	LCDinSTATE=IOPIN1;
		LCDinSTATE>>=16;
		LCDinSTATE8=LCDinSTATE;
		DelayNs(1);

		IOSET0|=LCD_RD;  				//读使能关闭
		DelayNs(1);
		IOSET0|=LCD_CE;			//片选LCD 结束
	   	DelayNs(1);
		IODIR1=IODIR1|0xFFFF0000;		// 重新定义P1.16--P1.23为输出
  		
		IOSET0|=LCD_DIR;					//74HC245 DIR 为高时数据从左到右
		DelayNs(1);
		return LCDinSTATE8;
	 }

/***********************************************************************
* 名称:LCD_ReadData()
* 功能:读取数据子程序。
* 入口参数:无
* 出口参数:返回值即为读出的数据
* 说明:函数会设置LCM数据总线为输入方式
***********************************************************************/
extern uint8 LCD_ReadData()
		{uint32 LCDinData;
		 uint8 	LCDinData8;
		 
		 IOCLR0|=LCD_DIR;					//74HC245 DIR 为低时数据从右到左
		 DelayNs(1);
		 IODIR1=IODIR1&0xFF00FFFF;								/*P1.16--p1.23作为GPIO输入口*/
		 
		 DelayNs(1);
		 IOSET1|=LCD_CD;			//数据通道使能 =0
		 DelayNs(1);
		 IOCLR0|=LCD_CE;			//片选LCD
	 	 DelayNs(1);
		 IOCLR0|=LCD_RD; 						//读使能
		
		 		 
	 	 LCDinData=IOPIN1;
		 LCDinData>>=16;
		 LCDinData8=LCDinData;
		 DelayNs(1);
	
		 IOSET0|=LCD_RD;  				//读使能关闭
		 DelayNs(1);
		 IOSET0|=LCD_CE;			//片选LCD 结束
		 DelayNs(1);
		 IODIR1=IODIR1|0xFFFF0000;		// 重新定义P1.16--P1.23为输出
		 	DelayNs(1);
			IOSET0|=LCD_DIR;					//74HC245 DIR 为高时数据从左到右
			DelayNs(1);
	 	 return LCDinData8;
}

/* 以下为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表示禁止,否则表示允许
***********************************************************************/
extern uint8  LCD_TestStaBit01(void)
{  uint8 i;
   
   for(i=100; i>0; i--)
   {  if( (LCD_ReadState()&0x03)==0x03 )    {
   break;}
   }
   return(i);
}


/***********************************************************************
* 名称:LCD_TestStaBit3()
* 功能:数据自动写状态是否允许。
* 入口参数:无
* 出口参数:返回0表示禁止,否则表示允许
***********************************************************************/
extern uint8  LCD_TestStaBit3(void)
{  uint8 i;
   for(i=100; i>0; i--)
   {  if( (LCD_ReadState()&0x08)==0x08 ) break;
   }
   return(i);
}


 /***********************************************************************
* 名称:LCD_RTCommand1()
* 功能:读一个字节子程序。会先判断LCM状态字。
* 入口参数:command  		要写入LCM的命令字
* 出口参数:操作出错返回0,否则返回数据
***********************************************************************/
extern uint8  LCD_RTCommand1(uint8 command)
{  	
	uint8 redddd; 
	if( LCD_TestStaBit01()==0 ) return(0);
    LCD_WriteCommand(command);		// 发送命令字
	redddd=LCD_ReadData();
   return(redddd);
}
/***********************************************************************
* 名称:LCD_WriteTCommand1()
* 功能:写无参数命令子程序。会先判断LCM状态字。
* 入口参数:command  		要写入LCM的命令字
* 出口参数:操作出错返回0,否则返回1
***********************************************************************/
extern uint8  LCD_WriteTCommand1(uint8 command)
{  	
	 
	if( LCD_TestStaBit01()==0 ) return(0);
    LCD_WriteCommand(command);		// 发送命令字

   return(1);
}

/***********************************************************************
* 名称:LCD_WriteTCommand2()
* 功能:写单参数命令子程序。会先判断LCM状态字。
* 入口参数:command  	要写入LCM的命令字
*          dat1		参数1
* 出口参数:操作出错返回0,否则返回1
* 说明:先发送参数据数据,再发送命令字
***********************************************************************/
extern 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_WriteTCommand3()
* 功能:写双参数命令子程序。会先判断LCM状态字。
* 入口参数:command  	要写入LCM的命令字
*          dat1		参数1
*          dat2		参数2
* 出口参数:操作出错返回0,否则返回1
* 说明:先发送两字节参数据数据,再发送命令字
***********************************************************************/
extern uint8  LCD_WriteTCommand3(uint8 command, uint8 dat1, uint8 dat2)
{  
				

   if( LCD_TestStaBit01()==0 ) { IOCLR0=IOCLR0|BEEPCON;
   return(0);}
   LCD_WriteData(dat1);				// 发送数据1
  
   if( LCD_TestStaBit01()==0 ) return(0);
   LCD_WriteData(dat2);				// 发送数据2
   

⌨️ 快捷键说明

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