LCD12864B的使用总结
2019-07-13 18:28发布
生成海报
查LCD12864B的资料
接线如下:
一、初始化IO口
void LCD_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOE|
RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG
,ENABLE);
//PB0,PB1
GPIO_InitStructure.GPIO_Pin=LCD_BL_Pin|LCD_RS_Pin;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//普通输出
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_Init(LCD_RS_PORT,&GPIO_InitStructure);
GPIO_SetBits(LCD_RS_PORT,LCD_RS_Pin);
GPIO_ResetBits(LCD_BL_PORT,LCD_BL_Pin);//点亮背光
//PE3,PE4,PE5
GPIO_InitStructure.GPIO_Pin=LCD_RW_Pin|LCD_EN_Pin|LCD_PSB_Pin;
GPIO_Init(LCD_EN_PORT,&GPIO_InitStructure);
GPIO_SetBits(LCD_EN_PORT,LCD_RW_Pin|LCD_EN_Pin|LCD_PSB_Pin);
GPIO_InitStructure.GPIO_Pin=LCD_D0_Pin;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//普通输出
GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;//开漏输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_Init(LCD_D0_PORT,&GPIO_InitStructure);
GPIO_SetBits(LCD_D0_PORT,LCD_D0_Pin);
GPIO_InitStructure.GPIO_Pin=LCD_D1_Pin|LCD_D2_Pin;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//普通输出
GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;//开漏输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_Init(LCD_D1_PORT,&GPIO_InitStructure);
GPIO_SetBits(LCD_D1_PORT,LCD_D1_Pin|LCD_D2_Pin);
GPIO_InitStructure.GPIO_Pin=LCD_D3_Pin|LCD_D4_Pin|LCD_D5_Pin|LCD_D6_Pin|LCD_D7_Pin;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//普通输出
GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;//开漏输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_Init(LCD_D3_PORT,&GPIO_InitStructure);
GPIO_SetBits(LCD_D3_PORT,LCD_D3_Pin|LCD_D4_Pin|LCD_D5_Pin|LCD_D6_Pin|LCD_D7_Pin);
}
二、LCD12864初始化
void LCD12864_Init(void)
{
LCD_PSB=1;
WriteToLCD(LCD_CMD,0x34);//扩充指令操作
delay_ms(100);
WriteToLCD(LCD_CMD,0x30);//基本指令操作
delay_ms(100);
WriteToLCD(LCD_CMD,0x0C);//显示开,关光标
delay_ms(100);
WriteToLCD(LCD_CMD,0x01);//清LCD
delay_ms(5);
}
其中函数
//写指令/数据到LCD
void WriteToLCD(uint8_t mode,uint8_t byte)
{
if(mode==LCD_CMD)//写指令
{
while(LCD_Busy());
LCD_RS = 0;//指令
LCD_RW = 0;//写
LCD_EN = 0;
delay_us(5);
GPIO_Set(GPIOE,PIN6,GPIO_MODE_OUT,GPIO_OTYPE_OD,GPIO_SPEED_100M,GPIO_PUPD_PU); GPIO_Set(GPIOF,PIN6|PIN11,GPIO_MODE_OUT,GPIO_OTYPE_OD,GPIO_SPEED_100M,GPIO_PUPD_PU);
GPIO_Set(GPIOG,PIN6|PIN7|PIN8|PIN13|PIN15,GPIO_MODE_OUT,GPIO_OTYPE_OD,GPIO_SPEED_100M,GPIO_PUPD_PU);
WriteByteToLCD(byte);//写
delay_us(5);
LCD_EN = 1;
delay_us(5);
LCD_EN = 0;
}else //写数据
{
while(LCD_Busy());
LCD_RS = 1;//数据
LCD_RW = 0;
LCD_EN = 0;
delay_us(5);
GPIO_Set(GPIOE,PIN6,GPIO_MODE_OUT,GPIO_OTYPE_OD,GPIO_SPEED_100M,GPIO_PUPD_PU);
GPIO_Set(GPIOF,PIN6|PIN11,GPIO_MODE_OUT,GPIO_OTYPE_OD,GPIO_SPEED_100M,GPIO_PUPD_PU);
GPIO_Set(GPIOG,PIN6|PIN7|PIN8|PIN13|PIN15,GPIO_MODE_OUT,GPIO_OTYPE_OD,GPIO_SPEED_100M,GPIO_PUPD_PU);
WriteByteToLCD(byte);//写
delay_us(5);
LCD_EN = 1;
delay_us(5);
LCD_EN = 0;
}
}
函数的编写根据数据手册
LCD_RS = 0;//选择指令
LCD_RW = 0;//选择写
LCD_EN = 0;
数据引脚全部设置为输出
WriteByteToLCD(byte);//准备数据写
delay_us(5);
LCD_EN = 1;//写数据
delay_us(5);
LCD_EN = 0;//数据传输结束
数据与命令只有一点不同
LCD_RS = ;//选择数据
三、相关函数的调用
源文件如下
#include "lcd12864.h"
#include "delay.h"
*************************************************************************************/
/*************************************************************************************
LCD12864
LCD_RS PB1
LCD_RW PE3
LCD_EN PE4
LCD_PSB PE5
LCD_RST 接到板子RST上
LCD_D0 PE6
LCD_D1 PF6
LCD_D2 PF11
LCD_D3 PG6
LCD_D4 PG7
LCD_D5 PG8
LCD_D6 PG13
LCD_D7 PG15
************************************************************************************/
uint8_t LCD_GRAM[32][32];
void LCD_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOE|
RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG
,ENABLE);
//PB0,PB1
GPIO_InitStructure.GPIO_Pin=LCD_BL_Pin|LCD_RS_Pin;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//普通输出
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_Init(LCD_RS_PORT,&GPIO_InitStructure);
GPIO_SetBits(LCD_RS_PORT,LCD_RS_Pin);
GPIO_ResetBits(LCD_BL_PORT,LCD_BL_Pin);//点亮背光
//PE3,PE4,PE5
GPIO_InitStructure.GPIO_Pin=LCD_RW_Pin|LCD_EN_Pin|LCD_PSB_Pin;
GPIO_Init(LCD_EN_PORT,&GPIO_InitStructure);
GPIO_SetBits(LCD_EN_PORT,LCD_RW_Pin|LCD_EN_Pin|LCD_PSB_Pin);
GPIO_InitStructure.GPIO_Pin=LCD_D0_Pin;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//普通输出
GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;//开漏输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_Init(LCD_D0_PORT,&GPIO_InitStructure);
GPIO_SetBits(LCD_D0_PORT,LCD_D0_Pin);
GPIO_InitStructure.GPIO_Pin=LCD_D1_Pin|LCD_D2_Pin;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//普通输出
GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;//开漏输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_Init(LCD_D1_PORT,&GPIO_InitStructure);
GPIO_SetBits(LCD_D1_PORT,LCD_D1_Pin|LCD_D2_Pin);
GPIO_InitStructure.GPIO_Pin=LCD_D3_Pin|LCD_D4_Pin|LCD_D5_Pin|LCD_D6_Pin|LCD_D7_Pin;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//普通输出
GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;//开漏输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_Init(LCD_D3_PORT,&GPIO_InitStructure);
GPIO_SetBits(LCD_D3_PORT,LCD_D3_Pin|LCD_D4_Pin|LCD_D5_Pin|LCD_D6_Pin|LCD_D7_Pin);
}
//数据格式
//D7 D6 D5 D4 D3 D2 D1 D0
uint8_t ReadByteFromLCD(void)
{
uint8_t res=0;
res=(LCD_D0_IN<<0)|(LCD_D1_IN<<1)
|(LCD_D2_IN<<2)|(LCD_D3_IN<<3)
|(LCD_D4_IN<<4)|(LCD_D5_IN<<5)
|(LCD_D6_IN<<6)|(LCD_D7_IN<<7);
return res;
}
void WriteByteToLCD(uint8_t byte)
{
LCD_D0_OUT=(byte&0x01)>>0;
LCD_D1_OUT=(byte&0x02)>>1;
LCD_D2_OUT=(byte&0x04)>>2;
LCD_D3_OUT=(byte&0x08)>>3;
LCD_D4_OUT=(byte&0x10)>>4;
LCD_D5_OUT=(byte&0x20)>>5;
LCD_D6_OUT=(byte&0x40)>>6;
LCD_D7_OUT=(byte&0x80)>>7;
}
/*************************************************************************************
************************************************************************************/
/*************************************************************************************
LCD判忙函数
1:忙
0:不忙
************************************************************************************/
uint8_t LCD_Busy(void)
{
uint8_t res=0;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
//数据线IO方向设定
GPIO_Set(GPIOE,PIN6,GPIO_MODE_IN,0,0,GPIO_PUPD_PU);
GPIO_Set(GPIOF,PIN6|PIN11,GPIO_MODE_IN,0,0,GPIO_PUPD_PU);
GPIO_Set(GPIOG,PIN6|PIN7|PIN8|PIN13|PIN15,GPIO_MODE_IN,0,0,GPIO_PUPD_PU);
delay_us(5);
//读数据
res=(ReadByteFromLCD()&0x80);
LCD_EN = 0;
return res;
}
//写指令/数据到LCD
void WriteToLCD(uint8_t mode,uint8_t byte)
{
if(mode==LCD_CMD)//写指令
{
while(LCD_Busy());
LCD_RS = 0;//指令
LCD_RW = 0;//写
LCD_EN = 0;
delay_us(5);
GPIO_Set(GPIOE,PIN6,GPIO_MODE_OUT,GPIO_OTYPE_OD,GPIO_SPEED_100M,GPIO_PUPD_PU);
GPIO_Set(GPIOF,PIN6|PIN11,GPIO_MODE_OUT,GPIO_OTYPE_OD,GPIO_SPEED_100M,GPIO_PUPD_PU);
GPIO_Set(GPIOG,PIN6|PIN7|PIN8|PIN13|PIN15,GPIO_MODE_OUT,GPIO_OTYPE_OD,GPIO_SPEED_100M,GPIO_PUPD_PU);
WriteByteToLCD(byte);//写
delay_us(5);
LCD_EN = 1;
delay_us(5);
LCD_EN = 0;
}else //写数据
{
while(LCD_Busy());
LCD_RS = 1;//数据
LCD_RW = 0;
LCD_EN = 0;
delay_us(5);
GPIO_Set(GPIOE,PIN6,GPIO_MODE_OUT,GPIO_OTYPE_OD,GPIO_SPEED_100M,GPIO_PUPD_PU);
GPIO_Set(GPIOF,PIN6|PIN11,GPIO_MODE_OUT,GPIO_OTYPE_OD,GPIO_SPEED_100M,GPIO_PUPD_PU);
GPIO_Set(GPIOG,PIN6|PIN7|PIN8|PIN13|PIN15,GPIO_MODE_OUT,GPIO_OTYPE_OD,GPIO_SPEED_100M,GPIO_PUPD_PU);
WriteByteToLCD(byte);//写
delay_us(5);
LCD_EN = 1;
delay_us(5);
LCD_EN = 0;
}
}
void LCD12864_Init(void)
{
LCD_PSB=1;
WriteToLCD(LCD_CMD,0x34);//扩充指令操作
delay_ms(100);
WriteToLCD(LCD_CMD,0x30);//基本指令操作
delay_ms(100);
WriteToLCD(LCD_CMD,0x0C);//显示开,关光标
delay_ms(100);
WriteToLCD(LCD_CMD,0x01);//清LCD
delay_ms(5);
}
void LCD12864_Clear(void)
{
WriteToLCD(LCD_CMD,0x01);//清LCD
delay_ms(5);
}
//设定显示位置
//x=0-3,y=0-7
//128*64=16*8*16*4
void LCD12864_SetCursor(uint8_t x,uint8_t y)
{
if (y==0)
{y=0x80;}
else if (y==1)
{y=0x90;}
else if (y==2)
{y=0x88;}
else if (y==3)
{y=0x98;}
WriteToLCD(LCD_CMD,x+y); //显示地址
}
/*************************************************************************************/
void LCD12864_ShowString(uint8_t x,uint8_t y, uint8_t *s)//显示字符串
{
LCD12864_SetCursor(x,y);
while(*s!='
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮