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

实物参考链接 直戳跳转

一、资源说明

二、基本参数

1、参数

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

PCA8574 模块(IIC)

2、引脚说明

LCD2004模块

PCA8574 模块(IIC)

3、LCD2004并行V0接线

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

4、PCA8574 原理图

三、通信协议说明

注:与LCD1602类似

1、LCD2004 并行时序

时序:

写命令代码:

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+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        

五、基础知识学习

STC89C52RC程序下载 直戳跳转

STM32F103C8T6程序下载

1、串口下载  直戳跳转

2、ST-LINK下载  直戳跳转

3、J-LINK下载  直戳跳转

4、DAP-LINK下载  直戳跳转

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

演示视频连接 直戳跳转
资料获取 直戳跳转

实物参考链接 直戳跳转

七、注意事项

1、VCC GND请勿接反,接反易烧
2、显示异常时,排除接线接触不良
3、下载后无显示可调整电位器到合适位置

九、接线说明

可参考程序main.c最上面接线说明


深圳市咱们电子科技有限公司