📄 lcddrive.c
字号:
/****************************************************************************************
* 文件名:LCDDRIVE320240.C
* 功能:图形液晶320*2408驱动(型号为SED1330)。32K显示存,0000H-7FFFH地址。显示是横向字节,高位
* 在前。
* 说明:图形液晶采用SED1330为LCD控制芯片,内带负压产生器,单5伏供电,并行接口(使用LPC2210驱动)。
* 硬件连接: D0--D7 <===> D0--D7
* /WR <===> nWE
* /RD <===> nOE
* /CE <===> nCS3_1
* C/D <===> A1
*
* /RST <===> VCC
****************************************************************************************/
#include "config.h"
uint8 gui_disp_buf[GUI_LCM_YMAX][GUI_LCM_XMAX/8]; // 声明显示缓冲区
/* 定义LCM地址 */
#define TG320240_COM (*((volatile unsigned short *) 0x83000002))
#define TG320240_DAT (*((volatile unsigned short *) 0x83000000))
/***********************************************************************
* 名称:LCD_WriteCommand()
* 功能:写命令子程序。(发送命令前,不检查液晶模块的状态)
* 入口参数:command 要写入LCM的命令字
* 出口参数:无
* 说明:函数会设置LCM数据总线为输出方式
***********************************************************************/
#define LCD_WriteCommand(command) TG320240_COM = (uint16)command
/***********************************************************************
* 名称:LCD_WriteData()
* 功能:写数据子程序。(发送数据前,不检查液晶模块的状态)
* 入口参数:dat 要写入LCM的数据
* 出口参数:无
* 说明:函数会设置LCM数据总线为输出方式
***********************************************************************/
#define LCD_WriteData(dat) TG320240_DAT = (uint16)dat
/***********************************************************************
* 名称:LCD_ReadState()
* 功能:读取忙状态字子程序。
* 入口参数:无
* 出口参数:返回值即为读出的状态字
* 说明:函数会设置LCM数据总线为输入方式
***********************************************************************/
#define LCD_ReadState() TG320240_DAT
/***********************************************************************
* 名称:LCD_ReadData()
* 功能:读取参数及显示数据子程序。
* 入口参数:无
* 出口参数:返回值即为读出的数据
* 说明:函数会设置LCM数据总线为输入方式
***********************************************************************/
#define LCD_ReadData() TG320240_COM
#define LCD_SYS_SET 0x40 /* 初始化,设置显示窗口 */
uint8 const ParaSysTable8[]= {0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00}; // P1-P8参数
#define LCD_SCROLL 0x44 //设置显示区域,卷动
uint8 const ParaScrTableA[]={0x00,0x00,0xF0,0x00,0x40,0xF0,0x00,0x80,0x00,0x00}; /* P1-P10参数 */
#define LCD_SLEEP_IN 0x53 /* 空闲状态设置 */
#define LCD_DISP_ON 0x59 /* 显示开:后接参数P1,规定各显区及光标的显示方式和闪烁启用/禁用 */
#define LCD_DISP_OFF 0x58 /* 显示关:后接参数P1,规定各显区及光标的显示方式和闪烁启用/禁用 */
#define LCD_OYLAY 0x5B /* 设置画面重叠显示的合成方式及显示一、三区的显示属性,后带一参数P1 */
#define LCD_HDOTSET 0x5A /* 设置以点为单位的显示画面水平移动量 */
#define LCD_CGR_POS 0x5C /* CGRAM偏置地址设置(可以增加自已的符号),后带参数P1、P2 */
#define LCD_CSR_FORM 0x5D /* 光标显示方式及形状设置,后跟2个参数P1、P2 */
#define LCD_CSRDIR_R 0x4C /* 光标地址指针移动方向,向右移动 */
#define LCD_CSRDIR_L 0x4D /* 光标地址指针移动方向,向左移动 */
#define LCD_CSRDIR_U 0x4E /* 光标地址指针移动方向,向上移动 */
#define LCD_CSRDIR_D 0x4F /* 光标地址指针移动方向,向下移动 */
#define LCD_CSR_W 0x46 /* 写当前光标地址,MUP使用两次读数操作 */
#define LCD_CSR_R 0x47 /* 读当前光标地址,后带两参数CSRL、CSRH */
#define LCD_MWRITTE 0x42 /* 数据写入显示缓冲区 */
#define LCD_MREAD 0x43 /* 从显示缓冲区读出数据 */
/***********************************************************************
* 名称:LCD_TestStaBit01()
* 功能:判断读写指令和读写数据是否允许。
* 入口参数:无
* 出口参数:返回0表示禁止,否则表示允许
***********************************************************************/
uint8 LCD_TestStaBit01(void)
{ uint16 i;
for(i=2000; i>0; i--)
{
if( (LCD_ReadState()&0x40)==0x40 ) 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_WriteCommand(command); // 发送命令字
if( LCD_TestStaBit01()==0 ) return(0);
LCD_WriteData(dat1); // 发送数据1
if( LCD_TestStaBit01()==0 ) return(0);
LCD_WriteData(dat2); // 发送数据2
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_WriteCommand(command); // 发送命令字
if( LCD_TestStaBit01()==0 ) return(0);
LCD_WriteData(dat1); // 发送数据1
return(1);
}
/***********************************************************************
* 名称:LCD_WriteTData1()
* 功能:写1字节数据子程序。会先判断状态字。
* 入口参数:dat 要写入LCM的数据
* 出口参数:操作出错返回0,否则返回1
***********************************************************************/
uint8 LCD_WriteTData1(uint8 dat)
{
if( LCD_TestStaBit01()==0 ) return(0);
LCD_WriteData(dat); // 发送命令字
return(1);
}
/* 以下为LCM的用户接口层,主要负责解释用户命令,并发送到LCM,为用户编程提供接口 */
/***********************************************************************
* 名称:LCD_Initialize()
* 功能:LCM初始化,将LCM初始化为纯图形模式,显示起始地址为0x0000,。
* 入口参数:无
* 出口参数:无
* 说明:函数会设置LCM数据总线为输出方式
***********************************************************************/
void LCD_Initialize(void)
{
uint8 i;
LCD_WriteTCommand1(LCD_SYS_SET); //设置显示窗口
for(i=0;i<8;i++)
{
LCD_WriteTData1(ParaSysTable8[i]);
}
LCD_WriteTCommand1(LCD_SCROLL); //设置显示区域,卷动
for (i=0;i<10;i++)
{
LCD_WriteTData1(ParaScrTableA[i]);
}
LCD_WriteTCommand2(LCD_HDOTSET,0x00); //设置点单元卷动位置,0-不移动
LCD_WriteTCommand2(LCD_OYLAY,0x1C); //设置合成方式,一区,三区文本方式,或逻辑
LCD_WriteTCommand2(LCD_DISP_ON,0x04); //开显示,1区开,2、3、4区关,关光标
}
/***********************************************************************
* 名称:LCD_FillAll()
* 功能:LCD填充。以图形方式进行填充,起始地址为0x0000。
* 入口参数:dat 要填充的数据
* 出口参数:无
***********************************************************************/
void LCD_FillAll(uint8 dat)
{
uint32 i;
LCD_WriteTCommand1(LCD_CSRDIR_R); //光标右移
LCD_WriteTCommand3(LCD_CSR_W,0x00,0x00); //设置光标起始地址0000H
LCD_WriteTCommand1(LCD_MWRITTE); //向显示缓冲区写数据
for(i=0;i<240*40;i++)
{
LCD_WriteTData1(dat);
}
}
/****************************************************************************
* 名称:LCD_WriteoneHZ
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -