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 文件。
  • 代码仅供参考,您可以根据自己的需求进行修改和扩展。
STM32 I2C 驱动 1602A LCD 显示数字代码示例

原文地址: https://www.cveoy.top/t/topic/nkXx 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录