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

目录

 一、资源说明

二、基本参数

        1、参数

                LCD2004模块

                PCA8574 模块(IIC)

        2、引脚说明

                LCD2004

                PCA8574 模块(IIC)

        3、LCD2004并行V0接线

        4、PCA8574 原理图

三、通信协议说明

        1、LCD2004 并行时序

                时序:

                写命令代码:

                写数据代码:

        2、PCA8574 IIC时序

                起始与停止时序:

                起始信号程序:

                停止信号程序:

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

                写时序:

                应答时序:

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

四、部分代码说明

        接线说明

                1.1、STC89C52RC+LCD2004模块

                1.2、STC89C52RC+PCA8574 模块(IIC)

                1.3、STM32F103C8T6+LCD2004模块

                1.4、STM32F103C8T6+PCA8574 模块(IIC)

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

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

七、项目所有材料清单

 八、注意事项

 九、接线表格


 一、资源说明

单片机型号

测试条件

模块名称

代码功能

STC89C52RC

1.晶振11.0592M

LCD2004模块

PCA8574 模块(IIC)

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

STM32F103C8T6

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

LCD2004模块

PCA8574 模块(IIC)

二、基本参数

        1、参数

                LCD2004模块

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

da5b67655bc841a8bb290333e0a985cb.jpeg

e3a6b77d3b914067ab7341f2a86a8a83.jpeg

                PCA8574 模块(IIC)

50b409b325874e4d8c6cffb8d5f62678.png

        2、引脚说明

                LCD2004

LCD2004模块

引脚说明

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、LCD2004并行V0接线

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

c4eee7d1e7eb4cc6be0d590683114ebf.png

        4、PCA8574 原理图

7371abb5fe95443589d8e4da420d1250.jpeg

三、通信协议说明

注:与LCD1602类似

        1、LCD2004 并行时序

                时序:

0652a37d40764c64a5a83b938d7b8142.png

                写命令代码:

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时序

                起始与停止时序:

c932d7cafa4649b085d62988da806cfb.png

                起始信号程序:

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、写数据与等待应答时序

                写时序:

01857b1b634e4dbbaaa25e05175e5ae2.png

                应答时序:

85045fa13e25418e95db34918c9da06d.png

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

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+LCD2004模块

#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+LCD2004模块

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

		/*开启LED相关的GPIO外设时钟*/
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
	//LCD_RS引脚初始化
		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_E引脚初始化
		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_004

STC89C52RC系统板X1(接PCF8574模块转接)

3c095ac91c144a1fb839c94d72ddaa13.jpeg

STM32F103C8T6系统板X1(接PCF8574模块转接)

19d55f4dcd0a46b19d248a527f64ebba.jpeg

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

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

STC89C52RC开发板(可直接驱动LCD2004)X1

80411c1396de4b4da83146d3fd965102.jpeg

LCD2004模块X1

ff7b21926d1d4f4a9fa835136a1cc969.jpeg

LCD2004模块X1

2e3cb6be406349c6837d5da30a14a533.jpeg

PCF8574模块

88a5e10530eb4ad4b3b96fe4ca01391c.jpeg

PCF8574模块

88a5e10530eb4ad4b3b96fe4ca01391c.jpeg

16P排母2.54MMX1

16P排针2.54MMX1

4f27d23ef8df41c7b10143e908f805af.jpeg

16P排母2.54MMX1

16P排针2.54MMX1

feff72d59eaf4638ac731bc23916171c.jpeg

Micro USB线X1

3c4f905fb9c64dfab5048bc1d56f4484.jpeg

Micro USB线X2

dbcda456cb2a47c38954320e18baf52b.jpeg

母母杜邦线X16

23463e606a704c9080a453346713e953.jpeg

母母杜邦线X16

e1eaee320a1c4518a78ef97da644b379.jpeg
10K电位器103 10K电位器即可

10K电位器

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

 八、注意事项

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

 九、接线表格

单片机型号

模块

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

STM32F103

C8T6

LCD2004模块

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

GND

5V

PB6

PB7

STC89C52RC

LCD2004模块

VSS

VDD

VO

RS

RW

E

D0

D1

GND

5V

电位器

P0.7

P0.6

P0.5

P2.0

P2.1

D2

D3

D4

D5

D6

D7

A

K

P2.2

P2.3

P2.4

P2.5

P2.6

P2.7

5V

GND

PCF8574模块

GND

VCC

SCL

SDA

GND

5V

P1.0

P1.1

ADS131A04驱动代码需要根据具体的硬件连接方式、应用场景等进行编写。以下是一个基本的参考代码,供您参考: ```c #include "stm32f4xx.h" #include "ads131a04.h" #include "spi.h" //SPI接口驱动 #define ADS131A04_CS_LOW() GPIO_ResetBits(GPIOA, GPIO_Pin_4) //拉低片选 #define ADS131A04_CS_HIGH() GPIO_SetBits(GPIOA, GPIO_Pin_4) //拉高片选 /* ADS131A04初始化函数 */ void ADS131A04_Init(void) { ADS131A04_CS_HIGH(); //先将片选拉高 //设置ADS131A04的初始化寄存器 ADS131A04_WriteReg(ADS131A04_REG_CONFIG1, 0x00); //采样率为2kSPS ADS131A04_WriteReg(ADS131A04_REG_CONFIG2, 0x02); //增益为1,内部参考电压为2.5V ADS131A04_WriteReg(ADS131A04_REG_CONFIG3, 0x04); //启用内部温度传感器 //启动ADS131A04的自校准 ADS131A04_CS_LOW(); SPI_WriteByte(ADS131A04_CMD_SELFCAL); ADS131A04_CS_HIGH(); } /* ADS131A04读取数据函数 */ void ADS131A04_ReadData(uint32_t *pData) { ADS131A04_CS_LOW(); //发送读取数据寄存器的命令 SPI_WriteByte(ADS131A04_CMD_RDATA); //读取数据 for (int i = 0; i < 4; i++) { uint8_t byte1 = SPI_ReadByte(); uint8_t byte2 = SPI_ReadByte(); uint8_t byte3 = SPI_ReadByte(); uint8_t byte4 = SPI_ReadByte(); *pData++ = (byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4; } ADS131A04_CS_HIGH(); } /* ADS131A04写寄存器函数 */ void ADS131A04_WriteReg(uint8_t reg, uint8_t value) { ADS131A04_CS_LOW(); //发送写寄存器命令和寄存器地址 SPI_WriteByte(ADS131A04_CMD_WREG | reg); //发送寄存器值 SPI_WriteByte(value); ADS131A04_CS_HIGH(); } ``` 以上代码中,使用SPI接口与ADS131A04进行通信。在初始化函数中,设置了采样率、增益、内部参考电压和温度传感器等参数,并启动了自校准。在读取数据函数中,发送读取数据寄存器的命令,然后连续读取4个字节的数据,并将其拼接成32位的数据。在写寄存器函数中,发送写寄存器命令和寄存器地址,然后发送寄存器值。 需要注意的是,以上代码中的具体数值可能需要根据实际硬件和应用场景进行调整。同时,还需要根据具体的硬件连接方式进行相应的初始化和配置。建议参考相关的硬件和软件开发文档,以及示例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值