1、FMC配置
时钟周期根据芯片手册时序和FMC的时钟确定,此处展示的数值为随意填写的,后期可在代码中更改时序。
2、ili9806.c
#include "ili9806.h"
void ILI9806_WriteCmd(volatile uint16_t cmd)
{
cmd = cmd;
ILI9806_REG = cmd;
}
void ILI9806_WriteData(volatile uint16_t data)
{
data = data;
ILI9806_RAM = data;
}
uint16_t ILI9806_ReadReg(uint16_t LCD_Reg)
{
ILI9806_REG = LCD_Reg;
return ILI9806_RAM;
}
uint16_t ILI9806_ReadData(void)
{
volatile uint16_t data;
data = ILI9806_RAM;
return data;
}
void ILI9806_WriteReg(uint16_t reg, uint16_t data)
{
ILI9806_REG = reg;
ILI9806_RAM = data;
}
void ILI9806_DisplayOn(void)
{
ILI9806_WriteCmd(0X29); /* 开启显示 */
}
void ILI9806_DisplayOff(void)
{
ILI9806_WriteCmd(0X28); /* 关闭显示 */
}
void ILI9806_SetCursor(uint16_t x, uint16_t y)
{
ILI9806_WriteCmd(CMD_SET_X);
ILI9806_WriteData(x >> 8);
ILI9806_WriteData(x & 0x00FF);
ILI9806_WriteCmd(CMD_SET_Y);
ILI9806_WriteData(y >> 8);
ILI9806_WriteData(y & 0x00FF);
}
void ILI9806_SetWindow(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
ILI9806_WriteCmd(CMD_SET_X);
ILI9806_WriteData(x1 >> 8);
ILI9806_WriteData(x1 & 0x00FF);
ILI9806_WriteData(x2 >> 8);
ILI9806_WriteData(x2 & 0x00FF);
ILI9806_WriteCmd(CMD_SET_Y);
ILI9806_WriteData(y1 >> 8);
ILI9806_WriteData(y1 & 0x00FF);
ILI9806_WriteData(y2 >> 8);
ILI9806_WriteData(y2 & 0x00FF);
ILI9806_WriteCmd(CMD_GRAM);
}
void ILI9806_Fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey,uint16_t color)
{
uint32_t totalPixel = (ex-sx+1) * (ey-sy+1);
ILI9806_SetWindow(sx, sy, ex, ey);
for(uint32_t i = 0; i < totalPixel; i++)
{
ILI9806_RAM = color;
}
}
void ILI9806_Fill_Colors(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey,uint16_t *color)
{
uint32_t totalPixel = (ex-sx+1) * (ey-sy+1);
ILI9806_SetWindow(sx, sy, ex, ey);
for(uint32_t i = 0; i < totalPixel; i++)
{
ILI9806_RAM = color[i];
}
}
void ILI9806_DrawPoint(uint16_t x, uint16_t y, uint16_t color)
{
ILI9806_SetCursor(x, y); /* 设置光标位置 */
ILI9806_WriteCmd(CMD_GRAM); /* 开始写入GRAM */
ILI9806_RAM = color;
}
/**
* @brief ILI9806初始化
*/
void ILI9806_Init(void)
{
uint16_t ID;
HAL_Delay(100);
ILI9806_WriteCmd(0xD3);
ID = ILI9806_ReadData(); /* dummy read */
ID = ILI9806_ReadData(); /* 读回0X00 */
ID = ILI9806_ReadData(); /* 读回0X98 */
ID <<= 8;
ID |= ILI9806_ReadData(); /* 读回0X06 */
ILI9806_WriteCmd(0xFF); /* EXTC Command Set enable register */
ILI9806_WriteData(0xFF);
ILI9806_WriteData(0x98);
ILI9806_WriteData(0x06);
ILI9806_WriteCmd(0xBC); /* GIP 1 */
ILI9806_WriteData(0x01);
ILI9806_WriteData(0x0F);
ILI9806_WriteData(0x61);
ILI9806_WriteData(0xFF);
ILI9806_WriteData(0x01);
ILI9806_WriteData(0x01);
ILI9806_WriteData(0x0B);
ILI9806_WriteData(0x10);
ILI9806_WriteData(0x37);
ILI9806_WriteData(0x63);
ILI9806_WriteData(0xFF);
ILI9806_WriteData(0xFF);
ILI9806_WriteData(0x01);
ILI9806_WriteData(0x01);
ILI9806_WriteData(0x00);
ILI9806_WriteData(0x00);
ILI9806_WriteData(0xFF);
ILI9806_WriteData(0x52);
ILI9806_WriteData(0x01);
ILI9806_WriteData(0x00);
ILI9806_WriteData(0x40);
ILI9806_WriteCmd(0xBD); /* GIP 2 */
ILI9806_WriteData(0x01);
ILI9806_WriteData(0x23);
ILI9806_WriteData(0x45);
ILI9806_WriteData(0x67);
ILI9806_WriteData(0x01);
ILI9806_WriteData(0x23);
ILI9806_WriteData(0x45);
ILI9806_WriteData(0x67);
ILI9806_WriteCmd(0xBE); /* GIP 3 */
ILI9806_WriteData(0x00);
ILI9806_WriteData(0x01);
ILI9806_WriteData(0xAB);
ILI9806_WriteData(0x60);
ILI9806_WriteData(0x22);
ILI9806_WriteData(0x22);
ILI9806_WriteData(0x22);
ILI9806_WriteData(0x22);
ILI9806_WriteData(0x22);
ILI9806_WriteCmd(0xC7); /* VCOM Control */
ILI9806_WriteData(0x36);
ILI9806_WriteCmd(0xED); /* EN_volt_reg VGMP / VGMN /VGSP / VGSN voltage to output */
ILI9806_WriteData(0x7F);
ILI9806_WriteData(0x0F);
ILI9806_WriteCmd(0XC0); /* Power Control 1 Setting AVDD / AVEE / VGH / VGL */
ILI9806_WriteData(0x0F);
ILI9806_WriteData(0x0B);
ILI9806_WriteData(0x0A); /* VGH 15V,VGLO-10V */
ILI9806_WriteCmd(0XFC); /* AVDD / AVEE generated by internal pumping. */
ILI9806_WriteData(0x08);
ILI9806_WriteCmd(0XDF);
ILI9806_WriteData(0x00);
ILI9806_WriteData(0x00);
ILI9806_WriteData(0x00);
ILI9806_WriteData(0x00);
ILI9806_WriteData(0x00);
ILI9806_WriteData(0x20);
ILI9806_WriteCmd(0XF3); /* DVDD Voltage Setting */
ILI9806_WriteData(0x74);
ILI9806_WriteCmd(0xB4); /* Inversion Type */
ILI9806_WriteData(0x00); /* 02 */
ILI9806_WriteData(0x00); /* 02 */
ILI9806_WriteData(0x00); /* 02 */
ILI9806_WriteCmd(0xF7); /* Resolution Control */
ILI9806_WriteData(0x82); /* 480*800 */
ILI9806_WriteCmd(0xB1); /* FRAME RATE Setting */
ILI9806_WriteData(0x00);
ILI9806_WriteData(0x13);
ILI9806_WriteData(0x13);
ILI9806_WriteCmd(0XF2); /* CR_EQ_PC_SDT #C0,06,40,28 */
ILI9806_WriteData(0x80);
ILI9806_WriteData(0x04);
ILI9806_WriteData(0x40);
ILI9806_WriteData(0x28);
ILI9806_WriteCmd(0XC1); /* Power Control 2 SD OP Bias_VRH1_VRH2_EXT_CPCK_SEL */
ILI9806_WriteData(0x17);
ILI9806_WriteData(0x88); /* VGMP */
ILI9806_WriteData(0x88); /* VGMN */
ILI9806_WriteData(0x20);
ILI9806_WriteCmd(0xE0); /* Positive Gamma Control */
ILI9806_WriteData(0x00); /* P1 */
ILI9806_WriteData(0x0A); /* P2 */
ILI9806_WriteData(0x12); /* P3 */
ILI9806_WriteData(0x10); /* P4 */
ILI9806_WriteData(0x0E); /* P5 */
ILI9806_WriteData(0x20); /* P6 */
ILI9806_WriteData(0xCC); /* P7 */
ILI9806_WriteData(0x07); /* P8 */
ILI9806_WriteData(0x06); /* P9 */
ILI9806_WriteData(0x0B); /* P10 */
ILI9806_WriteData(0x0E); /* P11 */
ILI9806_WriteData(0x0F); /* P12 */
ILI9806_WriteData(0x0D); /* P13 */
ILI9806_WriteData(0x15); /* P14 */
ILI9806_WriteData(0x10); /* P15 */
ILI9806_WriteData(0x00); /* P16 */
ILI9806_WriteCmd(0xE1); /* Negative Gamma Correction */
ILI9806_WriteData(0x00); /* P1 */
ILI9806_WriteData(0x0B); /* P2 */
ILI9806_WriteData(0x13); /* P3 */
ILI9806_WriteData(0x0D); /* P4 */
ILI9806_WriteData(0x0E); /* P5 */
ILI9806_WriteData(0x1B); /* P6 */
ILI9806_WriteData(0x71); /* P7 */
ILI9806_WriteData(0x06); /* P8 */
ILI9806_WriteData(0x06); /* P9 */
ILI9806_WriteData(0x0A); /* P10 */
ILI9806_WriteData(0x0F); /* P11 */
ILI9806_WriteData(0x0E); /* P12 */
ILI9806_WriteData(0x0F); /* P13 */
ILI9806_WriteData(0x15); /* P14 */
ILI9806_WriteData(0x0C); /* P15 */
ILI9806_WriteData(0x00); /* P16 */
ILI9806_WriteCmd(0x2a);
ILI9806_WriteData(0x00);
ILI9806_WriteData(0x00);
ILI9806_WriteData(0x01);
ILI9806_WriteData(0xdf);
ILI9806_WriteCmd(0x2b);
ILI9806_WriteData(0x00);
ILI9806_WriteData(0x00);
ILI9806_WriteData(0x03);
ILI9806_WriteData(0x1f);
ILI9806_WriteCmd(0x3A); /* Pixel Format */
ILI9806_WriteData(0x55);
ILI9806_WriteCmd(0x36); /* Memory Access Control */
ILI9806_WriteData(0x00); /* 02-180 */
ILI9806_WriteCmd(0x11);
HAL_Delay(120);
ILI9806_WriteCmd(0x29);
HAL_Delay(20);
ILI9806_Fill(0,0,480,800,WHITE);
ILI9806_LED(60);
}
3、ili9806.h
#ifndef ILI9806_H_
#define ILI9806_H_
#include "main.h"
#define LCD_WIDTH 480
#define LCD_HEIGHT 800
#define ILI9806_REG *(__IO uint16_t *)((uint32_t)0x60000000)
#define ILI9806_RAM *(__IO uint16_t *)(((uint32_t)0x60000000) + (1 << 1)) //A0 左移1位
#define WHITE 0xFFFF
#define BLACK 0x0000
#define BLUE 0x001F
#define BRED 0XF81F
#define GRED 0XFFE0
#define GBLUE 0X07FF
#define RED 0xF800
#define MAGENTA 0xF81F
#define GREEN 0x07E0
#define CYAN 0x7FFF
#define YELLOW 0xFFE0
#define BROWN 0XBC40 //棕色
#define BRRED 0XFC07 //棕红色
#define GRAY 0X8430 //灰色
#define CMD_GRAM 0x2C
#define CMD_SET_X 0x2A
#define CMD_SET_Y 0x2B
#define ILI9806_LED(n) TIM2->CCR2 = n //LCD背光,N-百分比
void ILI9806_DisplayOn(void);
void ILI9806_DisplayOff(void);
void ILI9806_SetCursor(uint16_t x, uint16_t y);
void ILI9806_SetCursorEnd(uint16_t width, uint16_t height);
void ILI9806_SetWindow(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
void ILI9806_DrawPoint(uint16_t x, uint16_t y, uint16_t color);
void ILI9806_Fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey,uint16_t color);
void ILI9806_Fill_Colors(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey,uint16_t *color);
void ILI9806_Init(void);
#endif