📄 lcd_driver.c
字号:
unsigned long i;
LCD_SetWindow(start_x, start_y, end_x, end_y);
LCD_WriteGRAM_EN();
for(i=0; i < (end_x - start_x + 1)*(end_y - start_y + 1); i++)
{
LCD_DATA_OUT(color); //填充颜色
}
LCD_WR_END();
LCD_SetWindow(0,0, X_END, Y_END); //恢复全局作图区
}
//液晶端口初始化,外部无需调用
void LCD_PortInit(void)
{
//控制端口方向初始化,移植时只需更改有关宏定义
/*LCD_CS_DDR |= BIT(LCD_CS_BIT);
LCD_RS_DDR |= BIT(LCD_RS_BIT);
LCD_WR_DDR |= BIT(LCD_WR_BIT);
LCD_RD_DDR |= BIT(LCD_RD_BIT);
LCD_REST_DDR |= BIT(LCD_REST_BIT);*/
//控制端口电平初始化
/*LCD_CS_H;
LCD_RS_H;
LCD_WR_H;
LCD_RD_H;
LCD_REST_H;*/
//数据总线端口方向初始化,视接口需要更改或添加
//DATA_L_DDR = 0xff;
//DATA_L_PORT = 0xff;
RCC->APB2ENR|=1<<3;//先使能外设PORTB时钟
RCC->APB2ENR|=1<<4;//先使能外设PORTC时钟
//PORTC0~13推挽输出
GPIOC->CRL=0x33333333;
GPIOC->CRH&=0xFF000000;
GPIOC->CRH|=0x00333333;
GPIOC->ODR|=0x3FFF;
//PORTB 高8位推挽输出
GPIOB->CRH=0x33333333;
GPIOB->ODR|=0xFF00;
}
//液晶驱动初始化
void LCD_DriverInit(void)
{
unsigned short int lcd_id = 0x0000; //保存LCD_ID号
LCD_PortInit(); //调用端口初始化
LCD_REST_L; //复位控制
Delay_nMS(1);
LCD_REST_H;
Delay_nMS(1); //完成复位
LCD_WriteRegister(0x0000, 0x0001); //开启时钟
Delay_nMS(10);
lcd_id = LCD_ReadRegister(0x0000); //读取LCD_ID
while(0)
{
UART_Transmit(lcd_id >> 8);
UART_Transmit(lcd_id);
Delay_nMS(500);
}
switch(lcd_id)
{
//R61514
case 0x1514: //R61514S驱动IC
LCD_WriteRegister(0x0007, 0x0000);
Delay_nMS(2);
LCD_WriteRegister(0x0017, 0x0001);
LCD_WriteRegister(0x0010, 0x4410);
LCD_WriteRegister(0x0011, 0x0000);
LCD_WriteRegister(0x0012, 0x0118);
LCD_WriteRegister(0x0013, 0x0d23);
Delay_nMS(2);
LCD_WriteRegister(0x0010, 0x4490);
LCD_WriteRegister(0x0011, 0x0000);
LCD_WriteRegister(0x0012, 0x013d);
Delay_nMS(2);
LCD_WriteRegister(0x0001, 0x0213);
LCD_WriteRegister(0x0003, 0x1030); //0x1030,设置接口方式,颜色位数和扫描方向
LCD_WriteRegister(0x0007, 0x0005);
LCD_WriteRegister(0x0008, 0x0603);
LCD_WriteRegister(0x0009, 0x002f);
LCD_WriteRegister(0x000b, 0x8000);
LCD_WriteRegister(0x0040, 0x0000);
LCD_WriteRegister(0x0041, 0x0000);
LCD_WriteRegister(0x0042, 0x9f00);
LCD_WriteRegister(0x0043, 0x9f00);
LCD_WriteRegister(0x0044, 0x7f00); //水平窗口起始大小(高8位HEA[结束地址],低8位HSA[起始地址])
LCD_WriteRegister(0x0045, 0x9f00); //垂直窗口起始大小(高8位VEA[结束地址],低8位VSA[起始地址])
LCD_WriteRegister(0x0021, 0x0000); //GRAM起始坐标点
LCD_WriteRegister(0x0030, 0x0103);
LCD_WriteRegister(0x0031, 0x0001);
LCD_WriteRegister(0x0032, 0x0304);
LCD_WriteRegister(0x0033, 0x0204);
LCD_WriteRegister(0x0034, 0x0406);
LCD_WriteRegister(0x0035, 0x0707);
LCD_WriteRegister(0x0036, 0x0407);
LCD_WriteRegister(0x0037, 0x0303);
LCD_WriteRegister(0x0038, 0x0403);
LCD_WriteRegister(0x0039, 0x0102);
Delay_nMS(1);
//-----Display On-------------------
LCD_WriteRegister(0x0002, 0x0600);
LCD_WriteRegister(0x0007, 0x0015);
Delay_nMS(1);
LCD_WriteRegister(0x0007, 0x0055);
Delay_nMS(1);
LCD_WriteRegister(0x0002, 0x0700);
LCD_WriteRegister(0x0007, 0x0077);
break; //完成初始化
//ILI9320与ILI9328
case 0x9325:
case 0x9328:
case 0xD325:
LCD_WriteRegister(0x00e7,0x0010);
LCD_WriteRegister(0x0000,0x0001);//开启内部时钟
LCD_WriteRegister(0x0001,0x0100);
LCD_WriteRegister(0x0002,0x0700);//电源开启
//LCD_WriteRegister(0x0003,(1<<3)|(1<<4) ); //65K RGB
//DRIVE TABLE(寄存器 03H)
//BIT3=AM BIT4:5=ID0:1
//AM ID0 ID1 FUNCATION
// 0 0 0 R->L D->U
// 1 0 0 D->U R->L
// 0 1 0 L->R D->U
// 1 1 0 D->U L->R
// 0 0 1 R->L U->D
// 1 0 1 U->D R->L
// 0 1 1 L->R U->D 正常就用这个.
// 1 1 1 U->D L->R
#if LCD_CHAR_HORIZONTAL > 0
//字符正放(竖屏),即X->240,CHAR_X->8
LCD_WriteRegister(0x0003,0x1030);//65K ,8位模式下两次传输,16位模式下1次传输,BIT[7]OGR为0时系统坐标固定,(H->x:0-219,V->y:0-319)
#else
//字符顺时针旋转90度(横屏),即X->240,CHAR_X->16
LCD_WriteRegister(0x0003,0x1038);
#endif
LCD_WriteRegister(0x0004,0x0000);
LCD_WriteRegister(0x0008,0x0207);
LCD_WriteRegister(0x0009,0x0000);
LCD_WriteRegister(0x000a,0x0000);//display setting
LCD_WriteRegister(0x000c,0x0001);//display setting
LCD_WriteRegister(0x000d,0x0000);//0f3c
LCD_WriteRegister(0x000f,0x0000);
//电源配置
LCD_WriteRegister(0x0010,0x0000);
LCD_WriteRegister(0x0011,0x0007);
LCD_WriteRegister(0x0012,0x0000);
LCD_WriteRegister(0x0013,0x0000);
Delay_nMS(5);
LCD_WriteRegister(0x0010,0x1590);
LCD_WriteRegister(0x0011,0x0227);
Delay_nMS(5);
LCD_WriteRegister(0x0012,0x009c);
Delay_nMS(5);
LCD_WriteRegister(0x0013,0x1900);
LCD_WriteRegister(0x0029,0x0023);
LCD_WriteRegister(0x002b,0x000e);
Delay_nMS(5);
LCD_WriteRegister(0x0020,0x0000);
LCD_WriteRegister(0x0021,0x013f);
Delay_nMS(5);
//伽马校正
LCD_WriteRegister(0x0030,0x0007);
LCD_WriteRegister(0x0031,0x0707);
LCD_WriteRegister(0x0032,0x0006);
LCD_WriteRegister(0x0035,0x0704);
LCD_WriteRegister(0x0036,0x1f04);
LCD_WriteRegister(0x0037,0x0004);
LCD_WriteRegister(0x0038,0x0000);
LCD_WriteRegister(0x0039,0x0706);
LCD_WriteRegister(0x003c,0x0701);
LCD_WriteRegister(0x003d,0x000f);
Delay_nMS(5);
LCD_WriteRegister(0x0050,0x0000); //水平GRAM起始位置
LCD_WriteRegister(0x0051,0x00ef); //水平GRAM终止位置
LCD_WriteRegister(0x0052,0x0000); //垂直GRAM起始位置
LCD_WriteRegister(0x0053,0x013f); //垂直GRAM终止位置
LCD_WriteRegister(0x0060,0xa700);
LCD_WriteRegister(0x0061,0x0001);
LCD_WriteRegister(0x006a,0x0000);
LCD_WriteRegister(0x0080,0x0000);
LCD_WriteRegister(0x0081,0x0000);
LCD_WriteRegister(0x0082,0x0000);
LCD_WriteRegister(0x0083,0x0000);
LCD_WriteRegister(0x0084,0x0000);
LCD_WriteRegister(0x0085,0x0000);
LCD_WriteRegister(0x0090,0x0010);
LCD_WriteRegister(0x0092,0x0000);
LCD_WriteRegister(0x0093,0x0003);
LCD_WriteRegister(0x0095,0x0110);
LCD_WriteRegister(0x0097,0x0000);
LCD_WriteRegister(0x0098,0x0000);
//开启显示设置
LCD_WriteRegister(0x0007,0x0133);
LCD_WriteRegister(0x0020,0x0000);
LCD_WriteRegister(0x0021,0x013f);
break;
//ILI9320与ILI9300
case 0x9320:
case 0x9300:
LCD_WriteRegister(0x00,0x0000);
LCD_WriteRegister(0x01,0x0100); //Driver Output Contral.
LCD_WriteRegister(0x02,0x0700); //LCD Driver Waveform Contral.
#if LCD_CHAR_HORIZONTAL > 0
//字符正放(竖屏),即X->240,CHAR_X->8
LCD_WriteRegister(0x0003,0x1030);//65K ,8位模式下两次传输,16位模式下1次传输,BIT[7]OGR为0时系统坐标固定,(H->x:0-219,V->y:0-319)
#else
//字符顺时针旋转90度(横屏),即X->240,CHAR_X->16
LCD_WriteRegister(0x0003,0x1038);
#endif
LCD_WriteRegister(0x04,0x0000); //Scalling Contral.
LCD_WriteRegister(0x08,0x0202); //Display Contral 2.(0x0207)
LCD_WriteRegister(0x09,0x0000); //Display Contral 3.(0x0000)
LCD_WriteRegister(0x0a,0x0000); //Frame Cycle Contal.(0x0000)
LCD_WriteRegister(0x0c,(1<<0)); //Extern Display Interface Contral 1.(0x0000)
LCD_WriteRegister(0x0d,0x0000); //Frame Maker Position.
LCD_WriteRegister(0x0f,0x0000); //Extern Display Interface Contral 2.
Delay_nMS(5);
LCD_WriteRegister(0x07,0x0101); //Display Contral.
Delay_nMS(5);
LCD_WriteRegister(0x10,(1<<12)|(0<<8)|(1<<7)|(1<<6)|(0<<4)); //Power Control 1.(0x16b0)
LCD_WriteRegister(0x11,0x0007); //Power Control 2.(0x0001)
LCD_WriteRegister(0x12,(1<<8)|(1<<4)|(0<<0)); //Power Control 3.(0x0138)
LCD_WriteRegister(0x13,0x0b00); //Power Control 4.
LCD_WriteRegister(0x29,0x0000); //Power Control 7.
LCD_WriteRegister(0x2b,(1<<14)|(1<<4));
LCD_WriteRegister(0x50,0); //Set X Star
//水平GRAM终止位置Set X End.
LCD_WriteRegister(0x51,239); //Set Y Star
LCD_WriteRegister(0x52,0); //Set Y End.t.
LCD_WriteRegister(0x53,319); //
LCD_WriteRegister(0x60,0x2700); //Driver Output Control.
LCD_WriteRegister(0x61,0x0001); //Driver Output Control.
LCD_WriteRegister(0x6a,0x0000); //Vertical Srcoll Control.
LCD_WriteRegister(0x80,0x0000); //Display Position? Partial Display 1.
LCD_WriteRegister(0x81,0x0000); //RAM Address Start? Partial Display 1.
LCD_WriteRegister(0x82,0x0000); //RAM Address End-Partial Display 1.
LCD_WriteRegister(0x83,0x0000); //Displsy Position? Partial Display 2.
LCD_WriteRegister(0x84,0x0000); //RAM Address Start? Partial Display 2.
LCD_WriteRegister(0x85,0x0000); //RAM Address End? Partial Display 2.
LCD_WriteRegister(0x90,(0<<7)|(16<<0)); //Frame Cycle Contral.(0x0013)
LCD_WriteRegister(0x92,0x0000); //Panel Interface Contral 2.(0x0000)
LCD_WriteRegister(0x93,0x0001); //Panel Interface Contral 3.
LCD_WriteRegister(0x95,0x0110); //Frame Cycle Contral.(0x0110)
LCD_WriteRegister(0x97,(0<<8)); //
LCD_WriteRegister(0x98,0x0000); //Frame Cycle Contral.
LCD_WriteRegister(0x07,0x0173); //(0x0173)
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -