K_A04_001 基于单片机驱动LCD1602字符滚动显示(8位并行+IIC通信)

发布于:2022-11-09 ⋅ 阅读:(9) ⋅ 点赞:(0) ⋅ 评论:(0)

目录

一、资源说明

二、基本参数

        1、参数

        LCD1602模块

        PCA8574 模块(IIC)

        2、引脚说明

        LCD1602

        PCA8574 模块(IIC)

        3、LCD1602并行V0接线

4、PCA8574 原理图

三、通信协议说明

1、LCD1602 并行时序

时序:

写命令代码:

写数据代码:

2、PCA8574 IIC时序

起始与停止时序:

起始信号程序:

停止信号程序:

3、写数据与等待应答时序

写时序:

应答时序:

写一个字节与等待应答程序:

四、部分代码说明

        1、接线说明

        1.1、STC89C52RC+LCD1602模块

        1.2、STC89C52RC+PCA8574 模块(IIC)

        1.3、STM32F103C8T6+LCD1602模块

        1.4、STM32F103C8T6+PCA8574 模块(IIC)

 五、基础知识学习与相关资料下载

六、视频效果展示与程序资料获取

七、项目所有材料清单

 八、注意事项

 九、接线表格


一、资源说明

单片机型号

测试条件

模块名称

代码功能

STC89C52RC

1.晶振11.0592M

LCD1602模块

PCA8574 模块(IIC)

  1.  LCD1602字符滚动显示(8位并行)
  2. LCD1602字符滚动显示(IIC)PCA8574 模块驱动

STM32F103C8T6

  1. 晶振8M
  2. 系统时钟72M

LCD1602模块

PCA8574 模块(IIC)

二、基本参数

        1、参数

        LCD1602模块

        模块分3.3V版本和5V版本 实际项目建议选和单片机电平对应版本

        PCA8574 模块(IIC)

 

      2、引脚说明

         LCD1602

LCD1602模块

引脚说明

VSS

GND引脚接电源地,如果外接电源,一般必须共地

VDD

VCC电源引脚,根据版本接5V或3.3V

V0

LCD 驱动电压输入端

RS

指令/数据选择信号

RW

读写选择信号

E

使能信号

DB0

数据 0

DB1

数据 1

DB2

数据 2

DB3

数据 3

DB4

数据 4

DB5

数据 5

DB6

数据 6

DB7

数据 7

A

LED+  5V或3.3V

K

LED-  GND

        PCA8574 模块(IIC)

PCA8574 模块

引脚说明

GND

GND引脚接电源地,如果外接电源,一般必须共地

VDD

VCC电源引脚,根据版本接5V或3.3V

SCL

串行时钟线

SDA

串行数据线

      3、LCD1602并行V0接线

        VCC和GND不分方向 但是中间一定接VO

  4、PCA8574 原理图

 

三、通信协议说明

    1、LCD1602 并行时序

    时序:

 

写命令代码:

void LcdWriteCom(uint8_t com)   //写入命令

{

LCD1602_E = 0;     //使能

LCD1602_RS = 0;    //选择发送命令

LCD1602_RW = 0;    //选择写入



LCD1602_DATAPINS = com;     //放入命令

DelayMs(1); //等待数据稳定



LCD1602_E = 1;           //写入时序

DelayMs(5);   //保持时间

LCD1602_E = 0;

}

写数据代码:

void LcdWriteData(uint8_t dat) //写入数据

{

LCD1602_E = 0; //使能清零

LCD1602_RS = 1; //选择输入数据

LCD1602_RW = 0; //选择写入



LCD1602_DATAPINS = dat; //写入数据

DelayMs(1);



LCD1602_E = 1;   //写入时序

DelayMs(5);   //保持时间

LCD1602_E = 0;

}

  2、PCA8574 IIC时序

起始与停止时序:

 

           起始信号程序:

void I2cStart()
{
	SDA=1;
	SCL=1;
	Delay10us();//建立时间是SDA保持时间>4.7us
	SDA=0;
	Delay10us();//保持时间是>4us
	SCL=0;			
	Delay10us();		
}

        停止信号程序:

void I2cStop()
{
	SDA=0;
	SCL=1;
	Delay10us();//建立时间大于4.7us
	SDA=1;
	Delay10us();	
	
}

3、写数据与等待应答时序

        写时序:

应答时序:

 

   写一个字节与等待应答程序:

unsigned char I2cSendByte(uint8_t dat)
{
	uint8_t a=0,b=0;//最大255,	
	for(a=0;a<8;a++)//要发送8位,从最高位开始
	{
		SDA=dat>>7;	 //起始信号之后SCL=0,所以可以直接改变SDA信号
		dat=dat<<1;
		Delay10us();
		SCL=1;
		Delay10us();//建立时间>4.7us
		SCL=0;
		Delay10us();//时间大于4us		
	}
	SDA=1;
	Delay10us();
	SCL=1;
	Delay10us();
	while(SDA)//等待应答,也就是等待从设备把SDA拉低
	{
		b++;
		if(b>200)	 //如果超过2000US没有应答发送失败,或者为非应答,表示接收结束
		{
			//SCL=0;
			Delay10us();
			return 0;
		}
	}
	SCL=0;
	Delay10us();
 	return 1;		
}

 

四、部分代码说明

   接线说明

                需要自定义引脚可在此处更改,STM32要自定义引脚的话也要注意引脚时钟使能的更改

        1.1、STC89C52RC+LCD1602模块

#define LCD1602_DATAPINS P0
sbit LCD1602_RS=P2^0;
sbit LCD1602_RW=P2^1;
sbit LCD1602_E=P2^2;

        1.2、STC89C52RC+PCA8574 模块(IIC)

sbit SCL=P1^0;

sbit SDA=P1^1;

        1.3、STM32F103C8T6+LCD1602模块

void LCD1602_GPIO_Config(void)
{		
		/*定义一个GPIO_InitTypeDef类型的结构体*/
		GPIO_InitTypeDef GPIO_InitStructure;

		/*开启LED相关的GPIO外设时钟*/
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
	//LCD_E引脚初始化
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;	
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
		GPIO_Init(GPIOB, &GPIO_InitStructure);	
		
	//LCD_RW引脚初始化
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
		GPIO_Init(GPIOB, &GPIO_InitStructure);
		
	//LCD_RS引脚初始化
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
		GPIO_Init(GPIOB, &GPIO_InitStructure);

	//D0-D7引脚初始化
		GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
		GPIO_Init(GPIOA, &GPIO_InitStructure); 
		

}

        1.4、STM32F103C8T6+PCA8574 模块(IIC)

#define PCF8574_SCL_GPIO_PORT     GPIOB               /* GPIO端口 */

#define PCF8574_SCL_GPIO_CLK     RCC_APB2Periph_GPIOB /* GPIO端口时钟 */

#define PCF8574_SCL_GPIO_PIN GPIO_Pin_6         



#define PCF8574_SDA_GPIO_PORT     GPIOB               /* GPIO端口 */

#define PCF8574_SDA_GPIO_CLK     RCC_APB2Periph_GPIOB /* GPIO端口时钟 */

#define PCF8574_SDA_GPIO_PIN   GPIO_Pin_7        

 五、基础知识学习与相关资料下载

  1. STC89C52RC程序下载      直戳跳转
  2. STM32F103C8T6程序下载
    1. 串口下载                    直戳跳转 
    2. ST-LINK下载              直戳跳转
    3. J-LINK下载                 直戳跳转
    4. DAP-LINK下载            直戳跳转

六、视频效果展示与程序资料获取

        视频连接                直戳跳转

        程序资料获取         直戳跳转

七、项目所有材料清单

STC89C52RC驱动方案

图片

STM32F103C8T6驱动方案

图片

备注

K_A04_001

STC89C52RC系统板X1

STM32F103C8T6系统板X1

1、STM32系统板两根Micro USB线一根用于J-LINK下载器,另一根用于给系统板供电

2、杜邦线建议不用太长的

LCD1602模块X1

LCD1602模块X1

PCF8574模块

PCF8574模块

16P排母2.54MMX1

16P排针2.54MMX1

16P排母2.54MMX1

16P排针2.54MMX1

Micro USB线X1

Micro USB线X2

母母杜邦线X16

母母杜邦线X16

10K电位器 103 10K电位器即可

10K电位器

103 10K电位器即可
J-LINK下载器

 

 八、注意事项

  1. VCC GND请勿接反,接反易烧
  2. 显示异常时,排除接线接触不良
  3. 下载后无显示可调整电位器到合适位置
  4. IIC转接板使用时 单片机复位后异常 需要断电重启才可 逻辑分析仪看波形无异常 具体原因未知  如有想法 欢迎一起交流。

 九、接线表格

单片机型号

模块

对应引脚(上:模块引脚 下:单片机引脚)

STM32F103

C8T6

LCD1602模块

VSS

VDD

VO

RS

RW

E

D0

D1

GND

5V

电位器

PB0

PB1

PB2

PA0

PA1

D2

D3

D4

D5

D6

D7

A

K

PA2

PA3

PA4

PA5

PA6

PA7

3.3V

GND

PCF8574模块

GND

VCC

SCL

SDA

5V

GND

PB6

PB7

STC89C52RC

LCD1602模块

VSS

VDD

VO

RS

RW

E

D0

D1

GND

5V

电位器

P2.0

P2.1

P2.2

P0.0

P0.1

D2

D3

D4

D5

D6

D7

A

K

P0.2

P0.3

P0.4

P0.4

P0.6

P0.7

5V

GND

PCF8574模块

VCC

GND

SCL

SDA

5V

GND

P1.0

P1.1