📄 lcddrive_mem.c
字号:
/****************************************************************************************
* 文件名:LCDDRIVE.C
* 功能:图形液晶240*320驱动(型号为ILI9320)。
* 说明:图形液晶采用ILI9320为LCD控制芯片,内带负压产生器,单3.3伏供电,并行接口(使用LPC2210驱动)。
* 硬件连接: D0-D15 <===> D0-D15
* /WR <===> nWE
* /RD <===> nOE
* /CE <===> nCS2
* RS <===> A1
* /RESET <===> P0.15
* Color Definition:
* Black: 0x00000000
* White: 0x00FFFFFF
****************************************************************************************/
#include "config.h"
TCOLOR gui_disp_buf[GUI_LCM_YMAX][GUI_LCM_XMAX]; // 声明GUI显示缓冲区
/* 定义LCM地址 */
#define DRIVER_COM (*((volatile unsigned short *) 0x82000000))
#define DRIVER_DAT (*((volatile unsigned short *) 0x82000002))
#define ColorMode 0 /*0 for 64k color, and 1 for 262k color*/
/* 以下为LCM的驱动层,主要负责发送ILI9320的各种命令,提供设置显示地址等功能,在发送命令
前会检测其状态字。带参数命令模式:先参数,后命令;操作模式:先命令,后数据 */
/***********************************************************************
* 名称:LCD_WriteCommand()
* 功能:写命令子程序。(发送命令前,不检查液晶模块的状态)
* 入口参数:command 要写入LCM的命令字
* 出口参数:无
* 说明:函数会设置LCM数据总线为输出方式
***********************************************************************/
#define LCD_WriteCommand(command) DRIVER_COM = (uint16)command
/***********************************************************************
* 名称:LCD_WriteData()
* 功能:写数据子程序。(发送数据前,不检查液晶模块的状态)
* 入口参数:dat 要写入LCM的数据
* 出口参数:无
* 说明:函数会设置LCM数据总线为输出方式
***********************************************************************/
#define LCD_WriteData(dat) DRIVER_DAT = (uint16)dat
#define LCD_RST_L() IO0CLR=(1<<15)
#define LCD_RST_H() IO0SET=(1<<15)
#define LCD_LightOn() IO0SET=(3<<29)
#define LCD_LightOff() IO0CLR=(3<<29)
/***********************************************************************
* 名称:LCD_ReadState()
* 功能:读取状态字子程序。
* 入口参数:无
* 出口参数:返回值即为读出的状态字
* 说明:函数会设置LCM数据总线为输入方式
***********************************************************************/
#define LCD_ReadState() return(DRIVER_COM)
/***********************************************************************
* 名称:LCD_ReadData()
* 功能:读取数据子程序。
* 入口参数:无
* 出口参数:返回值即为读出的数据
* 说明:函数会设置LCM数据总线为输入方式
***********************************************************************/
#define LCD_ReadData() return(DRIVER_DAT)
/***********************************************************************
* 名称:LCD_Write2REG()
* 功能:写单参数命令子程序。会先判断LCM状态字。
* 入口参数:command 要写入LCM的命令字
* dat1 参数1
* 出口参数:操作出错返回0,否则返回1
* 说明:先发送参数据数据,再发送命令字
***********************************************************************/
uint8 LCD_Write2REG(uint8 COM_Index, uint16 COM_Dat)
{
//LCD_CS_L();
LCD_WriteCommand(COM_Index);
LCD_WriteData(COM_Dat);
//LCD_CS_H();
return(1);
}
uint8 LCD_Write2REG2(uint8 COM_Index, uint16 COM_Dat, uint16 COM_Dat2)
{
//LCD_CS_L();
LCD_WriteCommand(COM_Index);
LCD_WriteData(COM_Dat);
LCD_WriteData(COM_Dat2);
//LCD_CS_H();
return(1);
}
/***********************************************************************
* 名称:LCD_Write2RAM1()
* 功能:Write one pixel to LCD, with AC input
* 入口参数:dat 要写入LCM的数据
* 出口参数:操作出错返回0,否则返回1
***********************************************************************/
uint8 LCD_SetXY(uint16 X_POS, uint16 Y_POS)
{
LCD_Write2REG(0x20, (uint16)X_POS);
LCD_Write2REG(0x21, (uint16)Y_POS);
return(1);
}
/***********************************************************************
* 名称:LCD_Write2RAM1()
* 功能:Write one pixel to LCD, with AC input
* 入口参数:dat 要写入LCM的数据
* 出口参数:操作出错返回0,否则返回1
***********************************************************************/
uint8 LCD_Write2RAM(TCOLOR aPixel)
{
uint16 aPixelH,aPixelL; uint8 *aByte; void *pPix;
#if ColorMode==0
aPixel &= 0x00FFFFFF;
aPixelL = 0x0000;
pPix=&aPixel;
aByte=(uint8 *)pPix;
aPixelH=(*(aByte+2) & 0x3E);
aPixelL=(aPixelH<<11);
aPixelH=(*(aByte+1) & 0x3F);
aPixelL += (aPixelH<<5);
aPixelH = (*aByte & 0x3E);
aPixelL += aPixelH;
LCD_Write2REG(0x22, aPixelL);
#else
aPixel &= 0x00FFFFFF;
aPixelL = 0x0000;
pPix=&aPixel;
aByte=(uint8 *)pPix;
aPixelH=(*(aByte+2) & 0x0F);
aPixelL=(aPixelH<<12);
aPixelH=(*(aByte+1) & 0x3F);
aPixelL += (aPixelH<<6);
aPixelH = (*aByte & 0x3F);
aPixelL += aPixelH;
aPixelH=(*(aByte+2) & 0x30);
aPixelH=(aPixelH>>4);
LCD_Write2REG2(0x22, aPixelH,aPixelL);
#endif
return(1);
}
/***********************************************************************
* added driving functions
*
*
***********************************************************************/
void LCD_Reset(void) {
// VCI=2.8V
//************* Reset LCD Driver ****************//
LCD_RST_H();
DelayMS(1); // Delay 1ms
LCD_RST_L();
DelayMS(1); // Delay 10ms
LCD_RST_H();
DelayMS(1); // Delay 50ms
}
void LCD_InitFunc1(void) {
LCD_Write2REG(0xE5, 0x8000); //RE5,??????
LCD_Write2REG(0x00, 0x0001); //R00,Start oscillator
DelayMS(1); //Wait to stablize
LCD_Write2REG(0x2B,0x0010); //R2B,264k color, 80Hz output
LCD_Write2REG(0x01,0x0100); //R01,Scan direction
LCD_Write2REG(0x02,0x0700); //R02,Line inversion
#if ColorMode==0
LCD_Write2REG(0x03,0x1230); //R03,1 transfers, scan left-right/up-down
#else
LCD_Write2REG(0x03,0xD230); //R03,2 transfers, scan left-right/up-down
#endif
LCD_Write2REG(0x04,0x0000); //R04,no resizing
LCD_Write2REG(0x08,0x0202); //R08,
LCD_Write2REG(0x09,0x0000); //R09,
LCD_Write2REG(0x0A,0x0000); //R0A,
LCD_Write2REG(0x0C,0x0000); //R0C,not RGB mode
LCD_Write2REG(0x0D,0x0000); //R0D,
LCD_Write2REG(0x0F,0x0000); //R0F,
LCD_Write2REG(0x50,0x0000); //R50,x start is 0
LCD_Write2REG(0x51,0x00EF); //R51,x end is 0xEF(240)
LCD_Write2REG(0x52,0x0000); //R52,y start is 0
LCD_Write2REG(0x53,0x013F); //R53,y end is 0x013F(320)
LCD_Write2REG(0x60,0x2700); //R60,Gate scan control(3 registers)
LCD_Write2REG(0x61,0x0001); //R61,
LCD_Write2REG(0x6A,0x0000); //R6A,
LCD_Write2REG(0x80,0x0000); //R80,Partial image disabled(6 registers)
LCD_Write2REG(0x81,0x0000); //R81,
LCD_Write2REG(0x82,0x0000); //R82,
LCD_Write2REG(0x83,0x0000); //R83,
LCD_Write2REG(0x84,0x0000); //R84,
LCD_Write2REG(0x85,0x0000); //R85,
LCD_Write2REG(0x90,0x0010); //R90,Panel control setup
LCD_Write2REG(0x92,0x0000); //R92,
LCD_Write2REG(0x93,0x0003); //R93,
LCD_Write2REG(0x95,0x0110); //R95,
LCD_Write2REG(0x97,0x0000); //R97,
LCD_Write2REG(0x98,0x0000); //R98,
}
void LCD_InitFunc2(void) {
LCD_Write2REG(0x30,0x0007); //R30, Gamma polarity adjustment
LCD_Write2REG(0x31,0x0403); //R31,
LCD_Write2REG(0x32,0x0404); //R32,
LCD_Write2REG(0x35,0x0002); //R35,
LCD_Write2REG(0x36,0x0707); //R36,
LCD_Write2REG(0x37,0x0600); //R37,
LCD_Write2REG(0x38,0x0106); //R38,
LCD_Write2REG(0x39,0x0007); //R39,
LCD_Write2REG(0x3C,0x0700); //R3C,
LCD_Write2REG(0x3D,0x0707); //R3D,
}
void LCD_PwrSetFunc(void) {
LCD_Write2REG(0x10,0x0000); //R10, Output disabled
LCD_Write2REG(0x11,0x0000); //R11,
LCD_Write2REG(0x12,0x0000); //R12,
LCD_Write2REG(0x13,0x0000); //R13,
DelayMS(20); //Delay 200ms
LCD_Write2REG(0x10,0x17B0); //R10, Source/Drived enabled
LCD_Write2REG(0x11,0x0001); //R11, Reference voltage set
DelayMS(5); //Delay 50ms
LCD_Write2REG(0x12,0x013E); //R12, Gray control
DelayMS(5); //Delay 50ms
LCD_Write2REG(0x13,0x1D00); //R13, Amplitude select
LCD_Write2REG(0x29,0x0013); //R29, Voltage control
DelayMS(5); //Delay 50ms
LCD_Write2REG(0x20,0x0000); //R20, GRAM x position set
LCD_Write2REG(0x21,0x0000); //R21, GRAM y position set
}
void LCD_PwrOnFunc(void) {
LCD_Reset();
DelayMS(1); //Delay 10ms
LCD_InitFunc1();
LCD_PwrSetFunc();
LCD_InitFunc2();
LCD_DispOnFunc();
}
void LCD_PwrOffFunc(void) {
LCD_Write2REG(0x10,0x0000); //R10,
LCD_Write2REG(0x11,0x0000); //R11,
LCD_Write2REG(0x12,0x0000); //R12,
LCD_Write2REG(0x13,0x0000); //R13,
DelayMS(20); //Delay 200ms
LCD_Write2REG(0x10,0x0002); //R10,
}
void LCD_DispOnFunc(void) {
LCD_Write2REG(0x07,0x0173); //R07,
LCD_LightOn();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -