您的位置:首页 > 其它

LCD240*128(TC6963)(一)

2009-09-30 16:06 190 查看
/******************************************************************************

* 文件名:LCDDRIVE.C

* 功能:图形液晶240*128驱动(型号为SMG240128A)。32K显示存,0000H-7FFFH地址。显示是横向字节,高位在前。

* 说明:图形液晶采用T6963C为LCD控制芯片,内带负压产生器,单5伏供电,并行口(使用LPC2210驱动)。

* 硬件连接: D0--D7 <===> D0--D7

* /WR <===> nWE

* /RD <===> nOE

* /CE <===> nCS3_1

* C/D <===> A1

* /RST <===> VCC

******************************************************************************/

#include "config.h"

TCOLOR gui_disp_buf[GUI_LCM_YMAX][GUI_LCM_XMAX/8];

// 声明GUI显示缓冲区

/* 定义LCM地址 */

#define TG240128_COM (*((volatile unsigned short *) 0x83000002)) //命令

#define TG240128_DAT (*((volatile unsigned short *) 0x83000000)) //数据

/***********************************************************************

* 名称:LCD_WriteCommand()

* 功能:写命令子程序。(发送命令前,不检查液晶模块的状态)

* 入口参数:command 要写入LCM的命令字

* 出口参数:无

* 说明:函数会设置LCM数据总线为输出方式

***********************************************************************/

#define LCD_WriteCommand(command) TG240128_COM = (uint16)command

/***********************************************************************

* 名称:LCD_Write#()

* 功能:写数据子程序。(发送数据前,不检查液晶模块的状态)

* 入口参数:dat 要写入LCM的数据

* 出口参数:无

* 说明:函数会设置LCM数据总线为输出方式

***********************************************************************/

#define LCD_Write#(dat) TG240128_DAT = (uint16)dat

/***********************************************************************

* 名称:LCD_ReadState()

* 功能:读取状态字子程序。

* 入口参数:无

* 出口参数:返回值即为读出的状态字

* 说明:函数会设置LCM数据总线为输入方式

***********************************************************************/

#define LCD_ReadState() TG240128_COM

/***********************************************************************

* 名称:LCD_Read#()

* 功能:读取数据子程序。

* 入口参数:无

* 出口参数:返回值即为读出的数据

* 说明:函数会设置LCM数据总线为输入方式

***********************************************************************/

#define LCD_Read#() TG240128_DAT

/* 以下为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_Write#(dat1); // 发送数据1

if( LCD_TestStaBit01()==0 ) return(0);

LCD_Write#(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_Write#(dat1); // 发送数据1

if( LCD_TestStaBit01()==0 ) return(0);

LCD_WriteCommand(command); // 发送命令字

return(1);

}

/***********************************************************************

* 名称:LCD_WriteT#1()

* 功能:写1字节数据子程序。会先判断状态字。

* 入口参数:dat 要写入LCM的数据

* 出口参数:操作出错返回0,否则返回1

***********************************************************************/

uint8 LCD_WriteT#1(uint8 dat)

{ if( LCD_TestStaBit3()==0 ) return(0);

LCD_Write#(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); // 置地址指针

LCD_WriteTCommand1(LCD_AUT_WR); // 自动写

for(i=0;i<128*30;i++) //128*(240/8),按字节方式写

{ LCD_WriteT#1(dat); // 写数据

}

LCD_WriteTCommand1(LCD_AUT_OVR); // 自动写结束

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

}

/****************************************************************************

* 名称:LCD_UpdatePoint()

* 功能:在指定位置上画点,刷新某一点。

* 入口参数: x 指定点所在列的位置

* y 指定点所在行的位置

* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: