码迷,mamicode.com
首页 > 其他好文 > 详细

jlxLCD12864液晶屏驱动STM32F411

时间:2019-01-18 15:10:55      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:好用   man   i++   数据线   lse   page   har   使用   ddr   

---恢复内容开始---

这里有个比较坑人的地方就是在使用过程中LCD的供电最好用3.3v的不要用5v有时候会初始化不成功,会闪屏时断时续就像接触不良一样,可能是使用5V之后时序电平高低不准确。

void Delay(unsigned short tick)
{
  uint8_t j, k;
  for (j = 0; j < tick; j++)
    for (k = 0; k < 110; k++)
      ;
}
void delay_us(int i)
{
  int j, k;
  for (j = 0; j < i; j++)
    for (k = 0; k < 1; k++)
      ;
}
void transfer_command(int data1)
{
  char i;
  RS_L; //RS:低,写入命令
  for (i = 0; i < 8; i++)
  {
    SCLK_L;    //时钟线
    delay_us(2);
    if (data1 & 0x80)
    {
      SDA_H;//数据线
    }
    else
    {
      SDA_L;
    }
    SCLK_H;
    delay_us(2);
    data1 <<= 1;
  }
}
void transfer_data(int data1)
{
  char i;
   RS_H; //RS:高,发送数据
  for (i = 0; i < 8; i++)
  {
    SCLK_L;
    delay_us(1);
    if (data1 & 0x80)
    {
      SDA_H;
    }
    else
    {
      SDA_L;
    }
    SCLK_H;
    delay_us(1);
    data1 <<= 1;
  }
}
void init_lcd(void) //LCD初始化
{
  RST_L; //硬件复位
  Delay(100);
  RST_H;
  Delay(100);
  transfer_command(0xe2); //软件复位
  Delay(5);
  transfer_command(0x2c); /*升压步聚1*/
  Delay(5);
  transfer_command(0x2e); /*升压步聚2*/
  Delay(5);
  transfer_command(0x2f); /*升压步聚3*/
  Delay(5);
  transfer_command(0x24); /*粗调对比度,可设置范围20~27*/
  transfer_command(0x80); /*微调对比度*/
  transfer_command(0x1a); /*微调对比度的值,可设置范围0~63  1f*/
  transfer_command(0xa2); /*1/9偏压比(bias)*/
  transfer_command(0xc8); /*行扫描顺序:从上到下*/
  transfer_command(0xa0); /*列扫描顺序:从左到右*/
  transfer_command(0x40); /*起始行:从第一行开始*/
  transfer_command(0xaf); /*开显示*/
}
void lcd_address(unsigned char page, unsigned char column)
{
  column = column - 1;                             //第1列在LCD驱动IC里是第0列,所以减1.
  page = page - 1;                                 //第1页,在LCD驱动IC里是第0页,所以减1
  transfer_command(0xb0 + page);                   //设置页地址。每页是 8 行。一个画面的 64 行被分成 8 个页。
  transfer_command(((column >> 4) & 0x0f) + 0x10); //设置列地址的高 4 位
  transfer_command(column & 0x0f);                 //设置列地址的低 4 位
}
void clear_screen()
{
  unsigned char i, j;
  for (i = 0; i < 9; i++)
  {
    //lcd_address(1 + i, 1);
    transfer_command(0xb0 + i);
    transfer_command(0x10);
    transfer_command(0x00);
    for (j = 0; j < 132; j++)
    {
      transfer_data(0x00);
    }
  }
}

---恢复内容结束---

void Delay(unsigned short tick)
{
  uint8_t j, k;
  for (j = 0; j < tick; j++)
    for (k = 0; k < 110; k++)
      ;
}
void delay_us(int i)
{
  int j, k;
  for (j = 0; j < i; j++)
    for (k = 0; k < 1; k++)
      ;
}
void transfer_command(int data1)
{
  char i;
  RS_L; //RS:低,写入命令
  for (i = 0; i < 8; i++)
  {
    SCLK_L;
    delay_us(2);
    if (data1 & 0x80)
    {
      SDA_H;
    }
    else
    {
      SDA_L;
    }
    SCLK_H;
    delay_us(2);
    data1 <<= 1;
  }
}
void transfer_data(int data1)
{
  char i;
   RS_H; //RS:高,发送数据
  for (i = 0; i < 8; i++)
  {
    SCLK_L;
    delay_us(1);
    if (data1 & 0x80)
    {
      SDA_H;
    }
    else
    {
      SDA_L;
    }
    SCLK_H;
    delay_us(1);
    data1 <<= 1;
  }
}
void init_lcd(void) //LCD初始化
{
  RST_L; //硬件复位
  Delay(100);
  RST_H;
  Delay(100);
  transfer_command(0xe2); //软件复位
  Delay(5);
  transfer_command(0x2c); /*升压步聚1*/
  Delay(5);
  transfer_command(0x2e); /*升压步聚2*/
  Delay(5);
  transfer_command(0x2f); /*升压步聚3*/
  Delay(5);
  transfer_command(0x24); /*粗调对比度,可设置范围20~27*/
  transfer_command(0x80); /*微调对比度*/
  transfer_command(0x1a); /*微调对比度的值,可设置范围0~63  1f*/
  transfer_command(0xa2); /*1/9偏压比(bias)*/
  transfer_command(0xc8); /*行扫描顺序:从上到下*/
  transfer_command(0xa0); /*列扫描顺序:从左到右*/
  transfer_command(0x40); /*起始行:从第一行开始*/
  transfer_command(0xaf); /*开显示*/
}
void lcd_address(unsigned char page, unsigned char column)
{
  column = column - 1;                             //第1列在LCD驱动IC里是第0列,所以减1.
  page = page - 1;                                 //第1页,在LCD驱动IC里是第0页,所以减1
  transfer_command(0xb0 + page);                   //设置页地址。每页是 8 行。一个画面的 64 行被分成 8 个页。
  transfer_command(((column >> 4) & 0x0f) + 0x10); //设置列地址的高 4 位
  transfer_command(column & 0x0f);                 //设置列地址的低 4 位
}
void clear_screen()
{
  unsigned char i, j;
  for (i = 0; i < 9; i++)
  {
    //lcd_address(1 + i, 1);
    transfer_command(0xb0 + i);
    transfer_command(0x10);
    transfer_command(0x00);
    for (j = 0; j < 132; j++)
    {
      transfer_data(0x00);
    }
  }
}

jlxLCD12864液晶屏驱动STM32F411

标签:好用   man   i++   数据线   lse   page   har   使用   ddr   

原文地址:https://www.cnblogs.com/lmj1997/p/10287488.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!