LCD1602引脚介绍及STM32单片机驱动LCD1602程序

发布时间:2024-06-13  

  LCD1602是一种工业字符型液晶,能够同时显示16x02即32个字符。LCD1602液晶显示原理 LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。

  LCD1602特性:

  3.3V或5V工作电压,对比度可调


  内含复位电路提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能

  有80字节显示数据存储器DDRAM

  内建有192个5X7点阵的字型的字符发生器CGROM

  8个可由用户自定义的5X7的字符发生器CGRAM

  LCD1602引脚功能:

  字符型LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,引脚定义如下表所示:

LCD1602引脚介绍及STM32单片机驱动LCD1602程序

  STM32单片机驱动LCD1602程序:

  #ifndef _LCD1602_H

  #define _LCD1602_H

  #include “LCD1602.H”

  //============================端口位清除寄存器==============================================//

  #define LCD1602_RS0 GPIOE-》BRR = 0x00000004 //低电平 PE.2

  #define LCD1602_RW0 GPIOE-》BRR = 0x00000010 //低电平 PE.4

  #define LCD1602_EN0 GPIOE-》BRR = 0x00000040 //低电平 PE.6

  //============================端口位设置/清除寄存器=========================================//

  #define LCD1602_RS1 GPIOE-》BSRR = 0x00000004 //高电平 PE.2

  #define LCD1602_RW1 GPIOE-》BSRR = 0x00000010 //高电平 PE.4

  #define LCD1602_EN1 GPIOE-》BSRR = 0x00000040 //高电平 PE.4

  #define DATA_OUT GPIOD-》ODR//数据端口 PB0-PB7

  //==========================================================================================//

  //单片机系统时钟在72MHZ下的延时

  void Delay_us(unsigned long CountLing)

  {

  signed char i;

  while(CountLing--)

  {

  i = 10;

  while(i--);

  }

  }

  //==========================================================================================//

  //LCD1602液晶读忙状态

  void LCD_FBUF(void)

  {

  LCD1602_RS0; //RS信号拉低

  LCD1602_RW1; //RW信号拉高

  LCD1602_EN1;//EN信号拉高

  DATA_OUT = 0xFF; //数据端口 11111111全高电平

  while((DATA_OUT & 0x80) == 0x80); //判断数据端口PB7 是否一直高

  LCD1602_RW1;//RW信号拉高

  LCD1602_EN0; //EN信号拉低

  }

  //==========================================================================================//

  //LCD1602写指令子函数

  void Write_LCD1602_Instruction_Com(unsigned char Com)

  {

  LCD_FBUF(); //读忙状态

  LCD1602_RS0; //RS信号拉低写指令

  LCD1602_RW0; //RW信号拉低

  LCD1602_EN0; //EN信号拉低

  DATA_OUT = Com; //数据端口指令输入

  Delay_us(340); //延时1ms

  LCD1602_EN1; //EN信号一个高脉冲

  Delay_us(340); //延时1ms

  LCD1602_EN0;

  }

  //==========================================================================================//

  //LCD1602写数据子函数

  void Write_LCD1602_Instruction_Data(unsigned char Date)

  {

  LCD_FBUF(); //读忙状态

  LCD1602_RS1; //RS信号拉高写数据指令

  LCD1602_RW0;

  LCD1602_EN0; //EN信号拉低

  DATA_OUT = Date; //数据端口数据输入

  Delay_us(340); //延时1ms

  LCD1602_EN1; //EN信号一个高脉冲

  Delay_us(340); //延时1ms

  LCD1602_EN0;

  }

  //==========================================================================================//

  //LCD1602写指令和写数据子函数

  void Write_LCD1602_Instruction_Com_Data(unsigned char CountLiey, unsigned char Date)

  {

  if(CountLiey == 0) //CountLiey == 0 写指令

  {

  Write_LCD1602_Instruction_Com(Date); // 写指令

  }

  else //CountLiey !=0 写数据

  {

  Write_LCD1602_Instruction_Data(Date); //不等于0写数据

  }

  }

  //==========================================================================================//

  //LCD1602写指令初始化子函数

  void Init_LCD1602(void)

  {

  Write_LCD1602_Instruction_Com(0x38); //设置16×2显示,5×7点阵,8位数据接口

  Delay_us(6); //延时 200us

  Write_LCD1602_Instruction_Com(0x38); //设置16×2显示,5×7点阵,8位数据接口

  Delay_us(6); //延时 200us

  Write_LCD1602_Instruction_Com(0x0C); //设置打开显示

  Delay_us(6); //延时 200us

  Write_LCD1602_Instruction_Com(0x06); //读或写一个字符后地址指针加1

  Delay_us(6);

  Write_LCD1602_Instruction_Com(0x01); //显示清屏

  Delay_us(6);

  }

  #endif

  //========================================END==================================================//

  #include “stm32f10x_lib.h”

  #include “LCD1602.H”

  //#include “DS18B20.H”

  typedef volatile unsigned char uint8;

  typedef volatile unsigned int uint16;

  typedef volatile unsigned long uint32;

  //==========================================================================================//

  //配置GPIO端口

  void GPIO_InitStructReadtempCmd(void)

  {

  GPIO_InitTypeDef GPIO_InitStruct;

  //GPIOC端口初始化

  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 |GPIO_Pin_4 | GPIO_Pin_6; // LCD1602 RS-RW-EN脚

  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出

  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //输出速率50MHZ

  GPIO_Init(GPIOE, &GPIO_InitStruct); //GPIOE端口初始化

  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |//数据脚 PB0-PB7

  GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;

  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出

  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //输出速率50MHZ

  GPIO_Init(GPIOD, &GPIO_InitStruct); //GPIOD端口初始化

  }

  //==========================================================================================//

  //配置GPIO外设时钟

  void RCC_APB2PeriphReadtempyCmd(void)

  {

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); // 开启GPIOD外设时钟

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); // 开启GPIOE外设时钟

  }

  //==========================================================================================//

  //函数主题

  int main(void)

  {

  RCC_APB2PeriphReadtempyCmd();//外设时钟初始化 //注意外设初始化一定要在GPIO端口配置初始化前面

  GPIO_InitStructReadtempCmd(); //GPIO端口配置初始化

  while(1)

  {

  Write_LCD1602_Instruction_Com_Data(0, 0x80+4); //0是写指令

  Write_LCD1602_Instruction_Com_Data(1, ‘A’ ); //1是写数据

  }

  }


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>