STM32 I2C 驱动 1602A LCD 显示数字代码示例
STM32 I2C 驱动 1602A LCD 显示数字代码示例
以下是使用 I2C 协议调用 1602A LCD 显示数字的示例代码:
#include "stm32f10x.h"
#include "stm32f10x_i2c.h"
#include "delay.h"
#define I2C_SCL_Pin GPIO_Pin_6
#define I2C_SDA_Pin GPIO_Pin_7
#define I2C_SCL_Port GPIOB
#define I2C_SDA_Port GPIOB
#define I2C_SCL_RCC RCC_APB2Periph_GPIOB
#define I2C_SDA_RCC RCC_APB2Periph_GPIOB
#define I2C_Speed 400000
#define I2C_OWN_ADDRESS7 0x3F
#define SLAVE_ADDRESS_LCD 0x4E //slave address
void I2C_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
RCC_APB2PeriphClockCmd(I2C_SCL_RCC, ENABLE);
RCC_APB2PeriphClockCmd(I2C_SDA_RCC, ENABLE);
GPIO_InitStructure.GPIO_Pin = I2C_SCL_Pin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(I2C_SCL_Port, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = I2C_SDA_Pin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(I2C_SDA_Port, &GPIO_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
I2C_DeInit(I2C1);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = I2C_OWN_ADDRESS7;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
I2C_Cmd(I2C1, ENABLE);
I2C_Init(I2C1, &I2C_InitStructure);
}
void I2C_WriteByte(uint8_t addr, uint8_t data)
{
I2C_GenerateSTART(I2C1, ENABLE);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, SLAVE_ADDRESS_LCD << 1, I2C_Direction_Transmitter);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1, addr);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1, data);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C1, ENABLE);
}
void LCD_Clear(void)
{
I2C_WriteByte(0x80, 0x01);
delay_ms(2);
}
void LCD_Init(void)
{
I2C_WriteByte(0x80, 0x38);
delay_ms(2);
I2C_WriteByte(0x80, 0x39);
delay_ms(2);
I2C_WriteByte(0x80, 0x14);
delay_ms(2);
I2C_WriteByte(0x80, 0x73);
delay_ms(2);
I2C_WriteByte(0x80, 0x56);
delay_ms(2);
I2C_WriteByte(0x80, 0x6C);
delay_ms(2);
}
void LCD_ShowChar(uint8_t x, uint8_t y, uint8_t chr)
{
uint8_t addr = 0x80;
if (y == 1)
{
addr |= 0x40;
}
addr |= x;
I2C_WriteByte(addr, chr);
}
void LCD_ShowNum(uint8_t x, uint8_t y, uint32_t num)
{
uint8_t chr[16];
sprintf((char*)chr, "%lu", num);
for (uint8_t i = 0; i < 16; i++)
{
if (chr[i] == '\0')
{
break;
}
LCD_ShowChar(x + i, y, chr[i]);
}
}
int main(void)
{
delay_init();
I2C_Configuration();
LCD_Init();
LCD_Clear();
LCD_ShowNum(0, 0, 123456);
while (1)
{
}
}
说明:
- 此代码使用了 STM32 的 I2C 通信接口,通过 I2C 协议向 1602A LCD 写入数据。
- 初始化 I2C 通信接口时,使用了 PB6 和 PB7 这两个引脚作为 SCL 和 SDA 引脚,并将其设置为开漏输出。
- 在 LCD 初始化完成后,使用 LCD_ShowNum 函数在 LCD 上显示一个数字。
代码功能:
- I2C_Configuration(): 初始化 I2C 通信接口,配置 I2C1、SCL 和 SDA 引脚。
- I2C_WriteByte(): 向 I2C 设备写入一个字节数据。
- LCD_Clear(): 清除 LCD 显示屏。
- LCD_Init(): 初始化 LCD。
- LCD_ShowChar(): 在 LCD 指定位置显示一个字符。
- LCD_ShowNum(): 在 LCD 指定位置显示一个数字。
- main(): 程序入口,初始化 I2C、LCD,并显示数字 123456。
注意:
- 代码需要根据您的具体硬件配置进行修改。
- 代码中使用了 delay.h 文件,需要根据您的实际情况修改或添加 delay.h 文件。
- 代码仅供参考,您可以根据自己的需求进行修改和扩展。
原文地址: https://www.cveoy.top/t/topic/nkXx 著作权归作者所有。请勿转载和采集!