📄 e0f343a920c1001d115eb61adb267a55
字号:
/****************************************************************************************
* 文件名:LCDDRIVE.C
* 功能:图形液晶240*128驱动(型号为SMG240128A)。32K显示存,0000H-7FFFH地址。显示是横向字节,高位
* 在前。
* 说明:图形液晶采用T6963C为LCD控制芯片,内带负压产生器,单5伏供电,并行接口(使用LPC2210驱动)。
* 硬件连接: D0--D7 <===> D0--D7
* /WR <===> nWE
* /RD <===> nOE
* /CE <===> nCS2_1
* C/D <===> A1
*
* /RST <===> VCC
****************************************************************************************/
#include "../gui/config.h"
#include "lcddrive.h"
#include "../gui/FONT_MACRO.H"
#define DISRAM_SIZE 0X7FFF //设置显示ram的大小
#define TXTSTART 0x0000 //设置文本区的起始地址
#define GRSTART 0x6800 //设置图形区的起始地址
#define CGRAMSTART 0x7800 //设置CGRAM的起始地址
uint8 gui_disp_buf[GUI_LCM_YMAX][GUI_LCM_XMAX/8]; // 声明显示缓冲区
const uint8 My_DispFlag[][8]=
{
// '1'
{
________,
___X____,
__XX____,
___X____,
___X____,
___X____,
___X____,
__XXX___,
}
//'A'
,{
________,
__XXX___,
_X___X__,
_X___X__,
_XXXXX__,
_X___X__,
_X___X__,
_X___X__,
}
};
const uint8 DownFlag[12]=
{
{
________,
________,
___XX___,
___XX___,
___XX___,
___XX___,
___XX___,
X__XX__X,
_X_XX_X_,
__XXXX__,
___XX___,
________,
}
};
void LCD_BackLight(int onoff)
{
if(onoff)
IOSET1=0x00000004;
else
IOCLR1=0x00000004;
}
/******************************************************************************
** Function name: mdelay
**
** Descriptions:
**
** parameters: delay length
** Returned value: None
**
*****************************************************************************
void mdelay( int delay )
{
int i;
for( i = 0; i < delay * 40; i++);
return;
}
*/
/***********************************************************************
* 名称:LCD_TestStaBit01()
* 功能:判断读写指令和读写数据是否允许。
* 入口参数:无
* 出口参数:返回0表示禁止,否则表示允许
***********************************************************************/
uint8 LCD_TestStaBit01(void)
{
uint8 i;
for(i=100; i>0; i--)
{ if( (LCD_ReadState()&0x03)==0x03 ) break;
}
//mdelay(15);
return(i);
// mdelay(10); return 1;
}
/***********************************************************************
* 名称:LCD_TestStaBit3()
* 功能:数据自动写状态是否允许。
* 入口参数:无
* 出口参数:返回0表示禁止,否则表示允许
***********************************************************************/
uint8 LCD_TestStaBit3(void);
uint8 LCD_TestStaBit3(void)
{
uint8 i;
for(i=100; i>0; i--)
{ if( (LCD_ReadState()&0x08)==0x08 ) break;
}
//mdelay(15);
return(i);
}
/***********************************************************************
* 名称:LCD_WriteTCommand1()
* 功能:写无参数命令子程序。会先判断LCM状态字。
* 入口参数:command 要写入LCM的命令字
* 出口参数:操作出错返回0,否则返回1
***********************************************************************/
uint8 LCD_WriteTCommand1(uint8 command);
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);
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);
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);
uint8 LCD_WriteTData1(uint8 dat)
{
if( LCD_TestStaBit3()==0 ) return(0);
LCD_WriteData(dat); // 发送命令字
return(1);
}
/* 以下为LCM的用户接口层,主要负责解释用户命令,并发送到LCM,为用户编程提供接口 */
void LCD_Clear(void);
void LCD_Clear(void)
{
uint32 i;
LCD_WriteTCommand3(LCD_ADR_POS, 0x00, 0x00); // 置地址指针
LCD_WriteTCommand1(LCD_AUT_WR); // 自动写
for(i=0;i<128*16;i++)
{
LCD_WriteTData1(0x00); // 写数据
}
LCD_WriteTCommand1(LCD_AUT_OVR); // 自动写结束
LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00); // 重置地址指针
}
/***********************************************************************
* 名称:LCD_Initialize()
* 功能:LCM初始化,将LCM初始化为纯图形模式,显示起始地址为0x0000,。
* 入口参数:无
* 出口参数:无
* 说明:函数会设置LCM数据总线为输出方式
***********************************************************************/
void LCD_Initialize(void)
{
IODIR0 |=0x00000004; //define IO stat for Backlight control
LCD_WriteTCommand3(LCD_TXT_STP, 0x00, 0x00); // 设置文本方式RAM起始地址
LCD_WriteTCommand3(LCD_TXT_WID, 16, 0x00); // 设置文本模式的宽度,宽度为N/6或N/8,N为宽度点数,如240
LCD_WriteTCommand3(LCD_GRH_STP, 0x00, 0x00); // 设置图形方式RAM起始地址
LCD_WriteTCommand3(LCD_GRH_WID, 16, 0x00); // 设置图形模式的宽度,宽度为N/6或N/8,N为宽度点数,如240
LCD_WriteTCommand1(LCD_MOD_OR); // 设置显示方式为"或"
LCD_WriteTCommand1(LCD_DIS_SW|0x08); // 设置纯图形显示模式
//LCD_WriteTCommand1(0x9c);
LCD_Clear();
}
/*
void LCD_Initialize(void)
{ LCD_WriteTCommand3(LCD_TXT_STP, 0x00, 0x00); // 设置文本方式RAM起始地址
LCD_WriteTCommand3(LCD_TXT_WID, 16, 0x00); // 设置文本模式的宽度,宽度为N/6或N/8,N为宽度点数,如240
LCD_WriteTCommand3(LCD_GRH_STP, 0x00, 0x00); // 设置图形方式RAM起始地址
LCD_WriteTCommand3(LCD_GRH_WID, 16, 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*16;i++)
{ LCD_WriteTData1(dat); // 写数据
}
LCD_WriteTCommand1(LCD_AUT_OVR); // 自动写结束
LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00); // 重置地址指针
}
/***********************************************************************
* 名称:LCD_FillDat() //填充一个有效的区域范围
* 功能:LCD填充。以图形方式进行填充,起始地址为x,y。填充范围w宽,h高.
* 入口参数:dat 要填充的数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -