注:本程序已验证可用,但只对本店模块做过适配测试,其他模块我们没法保证一定能用
实物参考链接 直戳跳转
一、资源说明
二、基本参数
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最上面接线说明