lcdrive.c
来自「ZLG的LPC2220读取SD卡的源代码」· C语言 代码 · 共 699 行 · 第 1/2 页
C
699 行
/********************************************************************************************************
** 文件名:LCDDRIVE.C
** 功能:图形液晶240×128驱动(型号为YMSP-G240128A-1)。使用的SDRAM型号为62256A,为32K显存,地址为0000H~7FFFH。
** 显示是横向字节,高位在前。
** 说明:图形液晶采用T6963C液晶控制芯片,单5V供电。
**
**
*********************************************************************************************************/
#include "config.h"
#include "ASCII816.h" //标准ASCII库
#include "HZTable.h" //汉字点阵库
#include "menu.h" //菜单库
//以8*8字符计算,显示屏横向、纵向可以显示的字符个数
#define LineChar GUI_LCM_XMAX/8 //一行字符数
#define ColumnChar GUI_LCM_XMAX/8 //一列字符数
uint8 gui_disp_buf[][GUI_LCM_XMAX/8]; //声明显示缓冲区
void DelayNS1(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
{
for(i=0; i<500; i++);
}
}
/***LCM地址***/
#define YM240128_COM (*((volatile unsigned short *)0x82400006))
#define YM240128_DAT (*((volatile unsigned short *)0x82400004))
/********************************************************************************************************
** 名称:LCD_WriteCommand()
** 功能:写命令子程序(发送命令前,不检查液晶模块的状态)
** 入口参数:command 要写入LCM的命令字
** 出口参数:无
** 说明:函数会设置LCM数据总线为输出方式
*********************************************************************************************************/
//#define LCD_WriteCommand(command) YM240128_COM = (uint16)command
void LCD_WriteCommand(uint8 command)
{
//volatile uint8 rr;
//rr = command;
//(*((volatile unsigned short *)0x81F00004))= rr;
YM240128_COM = (uint16)command;
}
/********************************************************************************************************
** 名称:LCD_WriteData()
** 功能:写数据子程序(发送数据前,不检查液晶模块的状态)
** 入口参数:dat 要写入LCM的数据
** 出口参数:无
** 说明:函数会设置LCM数据总线为输出方式
*********************************************************************************************************/
//#define LCD_WriteData(dat) YM240128_DAT = (uint16)dat
void LCD_WriteData(uint8 dat)
{
//volatile uint8 rr;
//rr = dat;
//(*((volatile unsigned short *)0x81F00004))= rr;
YM240128_DAT = (uint16)dat;
}
/********************************************************************************************************
** 名称:LCD_ReadState()
** 功能:读取状态字子程序
** 入口参数:无
** 出口参数:返回值即为读出的状态字
** 说明:函数会设置LCM数据总线为输出方式
*********************************************************************************************************/
//#define LCD_ReadState() YM240128_COM
uint32 LCD_ReadState(void)
{
return YM240128_COM;
}
/********************************************************************************************************
** 名称:LCD_ReadData()
** 功能:读取数据子程序
** 入口参数:无
** 出口参数:返回值即为读出的数据
** 说明:函数会设置LCM数据总线为输出方式
*********************************************************************************************************/
//#define LCD_ReadData() YM240128_DAT
uint32 LCD_ReadData(void)
{
return YM240128_DAT;
}
/*以下为LCM的驱动层,主要负责发送T6963的各种命令,提供设置显示地址等功能,在发送命令前会检测其状态字。
带参数命令模式:先参数,后命令;操作模式:先命令,后数据 (先传递的是参数)*/
/*T6963命令定义*/
#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;
uint32 RState;
DelayNS1(1);
for(i=100;i>0;i--)
{
RState = LCD_ReadState();
if((RState&0x03)==0x03) break;
DelayNS1(1);
}
if((RState&0x08)==0x08)
{
LCD_WriteCommand(LCD_AUT_OVR);
}
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字节数据子程序。会先判断LCM状态字
** 入口参数:dat 要写入LCM的数据
** 出口参数:操作出错返回0,否则返回1
*********************************************************************************************************/
uint8 LCD_WriteTData1(uint8 dat)
{ if(LCD_TestStaBit3()==0) return(0);
//DelayNS1(2);
LCD_WriteData(dat); //发送参数1
return(1);
}
/********************************************************************************************************
** 名称:LCD_Initialize()
** 功能:LCM初始化,将LCM初始化为纯图形模式,显示地址为0x0000
** 入口参数:无
** 出口参数:无
** 说明:函数会设置LCM数据总线为输出方式
*********************************************************************************************************/
void LCD_Initialize(void)
{
if(LCD_WriteTCommand3(LCD_TXT_STP,0x00,0x00) != 0) // 文本显示区首地址
LCD_WriteTCommand3(LCD_TXT_WID,0x1E,0x00); // 文本显示区宽度
LCD_WriteTCommand3(LCD_GRH_STP,0x00,0x00); // 图形显示区首地址
LCD_WriteTCommand3(LCD_GRH_WID,0x1E,0x00); // 图形显示区宽度
LCD_WriteTCommand1(LCD_CUR_SHP | 0x01); // 光标形状
LCD_WriteTCommand1(LCD_MOD_OR); // 显示方式设置
LCD_WriteTCommand1(LCD_DIS_SW | 0x08); // 显示开关设置
}
/********************************************************************************************************
** 名称:LCD_FillAll()
** 功能:LCD填充。以图形方式进行填充,起始地址为0x0000
** 入口参数:dat 要填充的数据
** 出口参数:无
** 说明:函数会设置LCM数据总线为输出方式
*********************************************************************************************************/
void LCD_FillAll(uint8 dat)
{ uint32 i;
LCD_WriteTCommand1(LCD_MOD_OR);
LCD_WriteTCommand1(LCD_DIS_SW|0x08);
DelayNS1(1);
LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00); //置地址指针
LCD_WriteTCommand1(LCD_AUT_WR); //自动写
for(i=0;i<128*30;i++)
{ //写数据
LCD_WriteTData1(dat);
}
LCD_WriteTCommand1(LCD_AUT_OVR); //自动写结束
LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00); //重置地址指针
}
/********************************************************************************************************
** 名称:LCD_FillRect()
** 功能:LCD填充一块黑块,表示选择了该行。以图形方式进行填充
** 入口参数:lin行,column列,level子目录或文件的级数,用来缩进,根目录=0
** 出口参数:无
** 说明:函数会设置LCM数据总线为输出方式
*********************************************************************************************************/
void LCD_FillRect(uint8 lin,uint8 level)
{ uint32 i,j;
uint32 StartAddr;
StartAddr=lin*LineChar + (12+level*2); //定位起始行
LCD_WriteTCommand1(LCD_MOD_OR);
LCD_WriteTCommand1(LCD_DIS_SW|0x08);
DelayNS1(1);
for(j=0;j<16;j++) //填充的高度
{
LCD_WriteTCommand3(LCD_ADR_POS,StartAddr&0xFF,StartAddr>>8); //置地址指针
for(i=0;i<(30-12-2*level);i++) //填充的宽度
{ //写数据
LCD_WriteTCommand2(LCD_INC_WR,0xFF);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?