LCD1602模块-带IIC转接板

LCD1602简介

写时序

读时序

指令表

字符表

IIC转接板-PCF8574、PCF8574T

IIC地址

IIC写时序

IIC读时序

PCF8574手册

示例代码

iic.c

#include "iic.h"// IIC总线的延时函数,根据实际情况调整时间
void IIC_Delay()
{uint8_t i;/* 下面的时间是通过逻辑分析仪测试得到的。工作条件:CPU主频72MHz ,MDK编译环境,1级优化循环次数为10时,SCL频率 = 205KHz 循环次数为7时,SCL频率 = 347KHz, SCL高电平时间1.5us,SCL低电平时间2.87us 循环次数为5时,SCL频率 = 421KHz, SCL高电平时间1.25us,SCL低电平时间2.375us */for (i = 0; i < 10; i++);
}// IIC总线的初始化函数
void IIC_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};//开启时钟IIC_SDA_GPIO_CLK_ENABLE();IIC_SCL_GPIO_CLK_ENABLE();// 配置SDA、SCL引脚为开漏输出GPIO_InitStruct.Pin = SDA_GPIO_PIN | SCL_GPIO_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;//注意:如果不在同个port,需要初始化两次HAL_GPIO_Init(SDA_GPIO_PORT, &GPIO_InitStruct);// 初始化时将SDA、SCL置高IIC_SDA_1();IIC_SCL_1();}// IIC总线的起始信号函数
void IIC_Start(void)
{// 先将SDA、SCL置高IIC_SDA_1();IIC_SCL_1();IIC_Delay();// 拉低SDA,开始起始信号IIC_SDA_0();IIC_Delay();// 拉低SCL,开始传输数据IIC_SCL_0();IIC_Delay();
}// IIC总线的停止信号函数
void IIC_Stop(void)
{// 先将SDA、SCL置低IIC_SDA_0();IIC_SCL_1();IIC_Delay();// 拉高SCL,传输结束IIC_SDA_1();
}//发送数据
void IIC_SendByte(uint8_t _ucByte)
{uint8_t i;/* 先发送字节的高位 bit7 */for (i = 0; i < 8; i++) {if (_ucByte & 0x80) {IIC_SDA_1();}else{IIC_SDA_0();}IIC_Delay();IIC_SCL_1();IIC_Delay();IIC_SCL_0();if (i == 7) {IIC_SDA_1(); // 释放总线}_ucByte <<= 1; /* 左移一个 bit */IIC_Delay();}
}
//接收数据
uint8_t IIC_ReadByte(void)
{uint8_t i;uint8_t value;/* 读到第 1 个 bit 为数据的 bit7 */value = 0;for (i = 0; i < 8; i++) {value <<= 1;IIC_SCL_1();IIC_Delay();if (IIC_SDA_READ()) {value++;}IIC_SCL_0();IIC_Delay();}return value;
}//等待从设备响应
uint8_t IIC_WaitAck(void)
{uint8_t re;IIC_SDA_1();    /* CPU释放SDA总线 */IIC_Delay();IIC_SCL_1();    /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */IIC_Delay();if (IIC_SDA_READ())    /* CPU读取SDA口线状态 */{re = 1;}else{re = 0;}IIC_SCL_0();IIC_Delay();return re;
}/*
*********************************************************************************************************
*   函 数 名: i2c_Ack
*   功能说明: CPU产生一个ACK信号
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
void IIC_Ack(void)
{IIC_SDA_0();   /* CPU驱动SDA = 0 */IIC_Delay();IIC_SCL_1(); /* CPU产生1个时钟 */IIC_Delay();IIC_SCL_0();IIC_Delay();IIC_SDA_1(); /* CPU释放SDA总线 */
}/*
*********************************************************************************************************
*   函 数 名: i2c_NAck
*   功能说明: CPU产生1个NACK信号
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
void IIC_NAck(void)
{IIC_SDA_1();   /* CPU驱动SDA = 1 */IIC_Delay();IIC_SCL_1(); /* CPU产生1个时钟 */IIC_Delay();IIC_SCL_0();IIC_Delay();
}

iic.h

#ifndef __IIC_H
#define __IIC_H
#include "stm32f1xx_hal.h"// IIC总线的SDA、SCL引脚定义
#define SDA_GPIO_PORT GPIOB
#define SDA_GPIO_PIN GPIO_PIN_7
#define SCL_GPIO_PORT GPIOB
#define SCL_GPIO_PIN GPIO_PIN_6// 定义IIC总线时钟
#define IIC_SDA_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define IIC_SCL_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()// 定义IIC总线的高、低电平信号
#define IIC_SDA_1() HAL_GPIO_WritePin(SDA_GPIO_PORT, SDA_GPIO_PIN, GPIO_PIN_SET)
#define IIC_SDA_0() HAL_GPIO_WritePin(SDA_GPIO_PORT, SDA_GPIO_PIN, GPIO_PIN_RESET)
#define IIC_SCL_1() HAL_GPIO_WritePin(SCL_GPIO_PORT, SCL_GPIO_PIN, GPIO_PIN_SET)
#define IIC_SCL_0() HAL_GPIO_WritePin(SCL_GPIO_PORT, SCL_GPIO_PIN, GPIO_PIN_RESET)// IIC总线的SDA、SCL信号读写操作函数
#define IIC_SDA_READ() HAL_GPIO_ReadPin(SDA_GPIO_PORT, SDA_GPIO_PIN)
#define IIC_SCL_READ() HAL_GPIO_ReadPin(SCL_GPIO_PORT, SCL_GPIO_PIN)void IIC_Init(void);
void IIC_Start(void);
void IIC_Stop(void);
void IIC_SendByte(uint8_t _ucByte);
uint8_t IIC_ReadByte(void);
uint8_t IIC_WaitAck(void);
void IIC_Ack(void);
void IIC_NAck(void);#endif  /** __IIC_H */

lcd1602-iic.c

#include "iic.h"
//发送数据
void sendData(uint8_t data)
{uint8_t x = 0;IIC_Init();IIC_Start();IIC_SendByte(0x4e); //写地址IIC_WaitAck();IIC_SendByte(data); //数据IIC_WaitAck();IIC_Stop();
}//设置高为|=#define LCD1602_E_1 0x04
#define LCD1602_RW_1 0x02
#define LCD1602_RS_1 0x01
#define LCD1602_P3_1 0x08//设置低为&=
#define LCD1602_P3_0 0xf7
#define LCD1602_E_0 0xfb
#define LCD1602_RW_0 0xfd
#define LCD1602_RS_0 0xfe// 通过IIC发送两个8bit数据
void IIC_SendTwoData(uint8_t data1,uint8_t data2)
{IIC_Start(); //发送起始信号IIC_SendByte(0x4e); //写设备地址IIC_WaitAck(); //等待响应IIC_SendByte(data1); //发送数据1IIC_WaitAck();//等待响应IIC_SendByte(data2); //发送数据2IIC_WaitAck();//等待响应IIC_Stop();//发送结束信号
}//发送4字节命令,高位为数据,低四位为控制
void WriteHalfCommand(uint8_t command)
{uint8_t tempCommand = command; tempCommand &= LCD1602_RS_0; //模式为指令模式tempCommand &= LCD1602_RW_0; //模式为写模式tempCommand |= LCD1602_E_1; //设置时钟为高tempCommand |= LCD1602_P3_1; //设置背景灯亮IIC_SendTwoData(tempCommand,tempCommand&LCD1602_E_0);HAL_Delay(1);
}//发送8字节命令
void WriteFullCommand(uint8_t command)
{WriteHalfCommand((command&0xf0));WriteHalfCommand((command&0x0f)<<4);
}//发送4字节数据
void WriteHalfData(uint8_t data)
{uint8_t tempData = data; tempData |= LCD1602_RS_1; //模式为数据模式tempData &= LCD1602_RW_0; //模式为写模式tempData |= LCD1602_E_1; //设置时钟为高tempData |= LCD1602_P3_1; //设置背景灯亮IIC_SendTwoData(tempData,tempData&LCD1602_E_0);
}//发送8字节数据
void WriteFullData(uint8_t data)
{WriteHalfData((data&0xf0));WriteHalfData((data&0x0f)<<4);
}//发送8字节数据
void ClearScreen(uint8_t data)
{//清屏WriteFullCommand(0x01);
}void showChar(uint8_t row,uint8_t col,char ch)
{WriteFullCommand(0x80+(0x40*row)+col);WriteFullData(ch);
}void showLine(uint8_t row,uint8_t col,char *string)
{WriteFullCommand(0x80+(0x40*row)+col);while(*string){WriteFullData(*string);string++;}
}void initLCD1602(void)
{IIC_Init();//设置4bit模式WriteHalfCommand(0x20);WriteFullCommand(0x28);WriteFullCommand(0x08);WriteFullCommand(0x01);WriteFullCommand(0x06);//开启显示、不显示光标、不闪烁光标WriteFullCommand(0x0c);}

…后续更新详细(TODO)

LCD1602模块-带IIC转接板相关推荐

  1. STM32通过(软/硬IIC)控制LCD1602液晶显示屏(IIC转8位并口的PCF8574转接板的使用)原创

    STM32通过(软/硬IIC)控制LCD1602液晶显示屏(IIC转8位并口的PCF8574转接板的使用)原创 A0,A1,A2全部悬空,那么PCF8574的IIC地址为0x4e.(具体原因,看PCF ...

  2. 51单片机控制LCD1602模块

    51单片机控制LCD1602模块 视频播放:LCD1602视频 (1)LCD1602概述 先来看看LCD1602什么意思?Liquid Crystal Display(LCD)表示液晶显示,1602 ...

  3. 树莓派python_树莓派使用Python控制LCD1602模块

    本文将介绍使用Python通过树莓派控制LCD1602,LCD1602液晶模块相当便宜,关键是它很容易与树莓派(Raspberry Pi)进行接口连接.LCD1602模块有16个引脚,但是我们只需要在 ...

  4. STC15单片机+DS18B20+LCD1602+PCF8574转IIC接口温度显示

    STC15单片机+DS18B20+LCD1602+PCF8574转IIC接口温度显示

  5. 【Arduino】温湿度传感器(DHT11)控制设计 四位数码管,LCD1602,带蜂鸣器、LED灯报警,串口输入设定阈值

    @[TOC]( [Arduino]温湿度传感器(DHT11)控制设计 四位数码管,LCD1602,带蜂鸣器.LED灯报警,串口输入设定阈值 ) 一.实验器材 UNO控制板:1块 共阳极四位数码管:1个 ...

  6. 51单片机 使用IIC转接板驱动LCD1602

    #include <reg52.h> #include "intrins.h" #define uchar unsigned char #define uint uns ...

  7. dz3.2火车头 php接口,DiscuzX3.4论坛火车头采集器免登陆发布模块(带测试接口)-百度云...

    解压后看到的文件有: 其中discusX3.0.wpm 是发布模块,dz测试接口.ljobx 是用于测试的规则,以后不要问规则该怎么写了,就按照这个格式写. 1,上传接口 根据自己的网站编码选择GBk ...

  8. [单片机笔记]LCD1602模块(51单片机)

    文章目录 1 LCD1602概要 1.1 介绍 2 LCD1602功能 2.1 引脚功能 2.2 控制指令集 2.3 连线方法 3 程序设计 3.1 头文件 3.2 .c程序 3.2.1 延迟函数 3 ...

  9. [嵌入式开发模块]MC9S12XEP100 IIC模块 驱动程序

    此为本人写的MC9S12XEP100的IIC集成电路总线的硬件驱动程序. 文章目录 前言 相关理论 驱动模块简介 代码 驱动模块 基于UCOS-II的驱动 示例代码 代码下载 前言 相关理论 相关理论 ...

最新文章

  1. 实现扫码登陆的最简单方案与原理
  2. mqtt 串口_MQTT网关介绍及应用原理
  3. [转]sql update 触发器 获得被update的行的信息详解
  4. EasyUI 中 MenuButton 的使用方法
  5. 【Mybatis-Plus】(四)分页、乐观锁插件 通用枚举 多数据源
  6. 还没毕业就被阿里30万年薪抢定,他凭什么?
  7. ORA-28002:密码过期时的处理…………
  8. 修改kafka java环境_单节点Kafka、Zookeeper安装、启用过程(Windows OS环境)
  9. 【SQL数据库】查询语句练习题
  10. [biztalk笔记]-1.Hello World!
  11. C#中获去一个字符串中的汉字的个数 C#获取字符串全角的个数
  12. git-svn使用教程:git与svn进行同步
  13. vue echarts 条纹柱状横向图
  14. 屠神-官方正版折扣端全面评测报告
  15. [INFO] Using ‘UTF-8‘ encoding to copy filtered resources.错误
  16. 树莓派3B+安装系统(Raspbian)以及配置环境
  17. 医学影像中的基础知识
  18. 精耕“大数据” 做精准营销
  19. 关于ERP系统,你可能不知道的10件事
  20. 神经网络中warmup策略

热门文章

  1. python面向对象实验报告_Python 面向对象 | 菜鸟教程
  2. foxmail配置qq邮箱(需要在QQ邮箱设置第三方授权码
  3. Python读取SQLite数据库数据写入csv
  4. # 和 ## 运算符
  5. python字符串的相关方法,转义字符和原始字符串
  6. js实现回到上一页的功能,介绍三种方法,其中一种在新开的页面中也适用
  7. GOLDENGATE运维手册
  8. 一种水下滑翔机数据噪声的处理方法(by 易)
  9. 服务器账号怎么登录不了怎么办啊,问题:安装服务器安全狗后登录不上账号提示报错怎么办? - 梦飞科技...
  10. Poi 操作Word文档设置页边距 解决CTPageMar类找不到