标签:好用 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