PCF8574AT驱动LCD1602

news/2024/11/30 2:26:27/

STM32用IIC驱动LCD1602

  • 介绍
  • PCF8574AT
    • 选址
    • 芯片接线图
  • LCD1602
    • 显示问题
    • 乱码问题
  • 实现代码

介绍

网上寻遍了资料发现驱动LCD1602液晶屏的程序几乎都是4线或8线数据线。基本思路都是直接操作I/O,但是缺点是接线太多,十分麻烦。PCF8574和PCF8574AT这两种芯片都是IIC芯片,可以将并行的八根数据线转换只用两根数据线进行控制,减少了I/O口的使用,提高所使用微处理器的控制能力。
故此记录用PCF8574AT代替直接操作I/O驱动LCD1602。以下内容是编写程序时发现并修正的一些错误和使用该款芯片时需要注意的细节,希望能够抛砖引玉。如有错误还请指正!

PCF8574AT

某宝上有一款LCD1602驱动板,能够极大程度节约引脚资源。用IIC协议驱动屏幕。

芯片资料

在这里插入图片描述

选址

其中值得注意的点,芯片名称有所区别,根据实际芯片找到对应的地址才能寻址成功。A2 A1 A0是硬件选址,默认不接均为1。最低bit为读写位。

在这里插入图片描述
以PCF8574AT为例,查找其地址。

在这里插入图片描述

最后芯片写地址是 0x7e

芯片接线图

在这里插入图片描述

LCD1602

数据手册
提取:mp91

显示问题

我使用野火指南者板子stm32f103vet6,程序烧写后需要复位才能正常显示lcd1602内容。这个问题可以在lcd初始化命令补一句。

LCD_WriteCMD(0x02); //必须要,如果没有了第一次上电会没内容

void LCD_Init(void)
{                      i2c_CfgGpio();		/* 配置GPIO */LCD_WriteCMD(0x02);/*必须要,如果没有了第一次上电会没内容*/LCD_WriteCMD(0x28);/* 0x28  4线操作模式   0x38 8线模式  */  /* 0000  1DCB  D开关显示 C开关光标 B开关光标闪烁   */LCD_WriteCMD(0x0c);/* 开显示,关光标    */LCD_WriteCMD(0x06);/* 文字不动,地址自动加1   */LCD_WriteCMD(0x01);/* 清屏    */SysTick_Delay_Ms( 5);
}

上述初始化之后,完美解决了上电复位后才显示文本的问题。

乱码问题

快速复位lcd1602会出现乱码是因为没有读忙函数

读忙函数

51实现:

/* 等待液晶准备好 */
void LcdWaitReady()
{unsigned char sta;LCD1602_DB = 0xFF;LCD1602_RS = 0;LCD1602_RW = 1;do {LCD1602_E = 1;sta = LCD1602_DB; //读取状态字LCD1602_E = 0;} while (sta & 0x80); //bit7等于1表示液晶正忙,重复检测直到其等于0为止
}

STM32实现:

void LCD1602_Wait_Ready(void)
{uint8_t sta;  LCD_data |= 0xf0;     //数据高四位置1i2c_WriteByte(LCD_data);LCD_data &=~(1<<(1-1));//RS=0;               // 0  0  0  0      0  0  0   0LCD_data |=(1<<(2-1));//RW=1;                // D7 D6 D5 D4        E  RW  RSi2c_WriteByte(LCD_data);	do{LCD_data |= 1<<2;          // 0000(数据)0000(控制位)// 0xxx 0100  -------> E=1i2c_WriteByte(LCD_data);SysTick_Delay_Ms(5);		//延时sta = i2c_R_Byte();       /* 读取状态字 */LCD_data ^= 1<<2;              	//异或运算(还原)// 0xxx 0000  ----------> E=0//or  LCD_data &=~(1<<2)  						  //I2C_WriteByte(LCD_data);//1→0 执行指令	i2c_WriteByte(LCD_data);	}while(sta &0x80);           /* 状态字的最高位 1忙,0空闲 */ 
}

实现代码

点击此处


http://www.ppmy.cn/news/140998.html

相关文章

TI 2640 Quick start

&#xff08;1&#xff09;下载ccs 并且安装 &#xff08;2&#xff09;下载对应版本的SDK&#xff0c;并且安装 SDK对应版本下载可以通过搜索的方式&#xff1a;simplelink_cc2640r2_sdk_5_30_00_03 &#xff08;3&#xff09;导入对应的工程文件 此篇文档可以作为参考&#x…

[其他] ATI HD6630M 显卡在Win10下终于有救了(DEll 14R N4120)

重要提示&#xff01;&#xff01;&#xff01; 以前没有仔细的研究&#xff0c;今天重装了一遍Win10。然后重新安装了显卡驱动&#xff0c;现更新一些信息 0. 本教程不适用于索尼AMD双卡本&#xff0c;索尼双卡在AMD驱动下有Intel显卡信息&#xff0c;公版没有。&#xff08;…

Java程序猿搬砖笔记(十三)

文章目录 MySQL数据库生成自动增长序号MySQL修改密码SpringBoot定时任务解决Mybatis出现的各种Parameter not found. Available parameters are [ , ]Mybatis的foreach标签遍历mapSpringBoot项目打包SpringBoot Async使用注意事项Spring Cloud Config bootstrap文件&#xff…

【已解决】vue/react .env.development 中读取不到变量:undefined

文章目录 一、问题二、解决三、拓展学习 一、问题 react 项目中&#xff0c;通过 process.env. 在 .env 或 .env.development 中读取不到变量&#xff0c;undefined 二、解决 首先&#xff0c;确保 .env 和 .env.development 文件放在项目根目录&#xff08;和 package.json…

基于STM32单片机智能手环脉搏心率检测计步器原理图PCB

功能&#xff1a; 0.本系统采用STM32F103C8T6作为单片机&#xff0c;并采用的是成熟的模块 1.采用LCD1602作为显示液晶可以实时显示计步和心率的参数 2.心率传感器采用的是成熟的检测模块&#xff0c;经过LM393信号处理之后送入单片机 3.同时本系统具备温度检测功能&#xff0c…

2.4G智能遥控器设计,可控制智能手机,智能电视(源码)

2.4G智能遥控器设计&#xff0c;可控制智能手机&#xff0c;智能电视等&#xff08;硬件、源码&#xff09; 2.4G遥控器电路设计利用了nrf24le1作为发射IC&#xff0c;以nrf24lu1作为usb接收端&#xff0c;进行了整体的软硬件设计。 你可以吧usb dongle 插入任何带usb host 接口…

BroadLink智能遥控器

BroadLink从智能插座开始&#xff0c;逐渐实现它的平台之路&#xff0c;这些产品的技术含量都不高&#xff0c;但是体验总体是不错的&#xff0c;是个值得赞的产品。过段时间&#xff0c;拆解看看内部实现。这款遥控器可以通过“学习”按键&#xff0c;实现用手机取代各种遥控器…

基于SpringBoot的健身房管理系统

【辰兮要努力】&#xff1a;hello你好我是辰兮&#xff0c;很高兴你能来阅读&#xff0c;昵称是希望自己能不断精进&#xff0c;向着优秀程序员前行&#xff01; 博客来源于项目以及编程中遇到的问题总结&#xff0c;偶尔会有读书分享&#xff0c;我会陆续更新Java前端、后台、…