STM32 FMC LCD ILI9806驱动

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值