找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4076|回复: 9
打印 上一主题 下一主题
收起左侧

STM32与LCD1602连接GPIO_Mode配置用什么方式

[复制链接]
跳转到指定楼层
楼主
ID:71233 发表于 2015-3-27 10:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教:大家在处理STM32与LCD1602连接时,GPIO_Mode配置用什么方式?用什么方式较安全?还有,LCD1602为5V的,可以直接相连吗?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:78060 发表于 2015-4-25 21:12 | 只看该作者
不知道!!我也在学习!!
回复

使用道具 举报

板凳
ID:58502 发表于 2015-4-26 02:51 | 只看该作者
最好使用开漏输出
回复

使用道具 举报

地板
ID:190624 发表于 2017-8-25 16:47 | 只看该作者
连接有图片吗?
回复

使用道具 举报

5#
ID:229469 发表于 2017-8-26 16:29 | 只看该作者
1602是什么接口的,I2C吗
回复

使用道具 举报

6#
ID:71233 发表于 2023-1-4 09:28 | 只看该作者
zhouwentao 发表于 2017-8-26 16:29
**** 作者被禁止或删除 内容自动屏蔽 ****

I2C或并口
回复

使用道具 举报

7#
ID:996773 发表于 2023-1-4 10:24 | 只看该作者
1602液晶屏原生是没有i2c接口的,有也是用串转并芯片实现的,如果用并口的话还是用传统弱上拉模式,要么上拉高电平,要么拉低低电平。开漏模式就是悬空高阻抗容易受干扰
回复

使用道具 举报

8#
ID:1034262 发表于 2023-1-4 11:09 | 只看该作者
开漏+上拉。
回复

使用道具 举报

9#
ID:1060471 发表于 2023-1-7 12:47 | 只看该作者
  #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是写数据    }    }
回复

使用道具 举报

10#
ID:1060471 发表于 2023-1-7 12:48 | 只看该作者
  #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是写数据

  }

  }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表