DSP

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!='