有没有用stm32zet6点亮lcd1602的完整程序呀

用stm32f103zet6点亮lcd1602 ,我的程序只能让它亮屏,什么都显示不出来

https://blog.csdn.net/m0_49830036/article/details/129463269

一、可以参考一下CSDN博客:https://blog.csdn.net/qq_41701950/article/details/107630078

二、该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
当使用STM32F103ZET6单片机点亮LCD1602时,需要使用GPIO控制端口以及液晶驱动程序来控制液晶显示内容。下面是一个使用C语言编写的完整程序,可以点亮LCD1602并显示一些文本。

首先,我们需要定义使用的引脚和端口。在这个例子中,使用的引脚为PA6-PA9,PB0-PB1,PB10-PB12,以及PB14-PB15。其中,PA6-PA7用于控制RS和EN信号,PB0-PB1用于控制D0-D1信号,PB10-PB12用于控制D4-D6信号,PB14-PB15用于控制D7-D8信号。

#include "stm32f10x.h"
#include "delay.h"

#define LCD_RS GPIO_Pin_6
#define LCD_EN GPIO_Pin_7
#define LCD_D0 GPIO_Pin_0
#define LCD_D1 GPIO_Pin_1
#define LCD_D4 GPIO_Pin_10
#define LCD_D5 GPIO_Pin_11
#define LCD_D6 GPIO_Pin_12
#define LCD_D7 GPIO_Pin_14
#define LCD_D8 GPIO_Pin_15

#define LCD_RS_PORT GPIOA
#define LCD_EN_PORT GPIOA
#define LCD_D0_PORT GPIOB
#define LCD_D1_PORT GPIOB
#define LCD_D4_PORT GPIOB
#define LCD_D5_PORT GPIOB
#define LCD_D6_PORT GPIOB
#define LCD_D7_PORT GPIOB
#define LCD_D8_PORT GPIOB

接下来,我们需要编写一个函数来向LCD发送指令或数据。在这个例子中,我们使用的是4位并行模式,因此需要将8位数据分成两个4位数据进行发送。

void LCD_Send_4bit(uint8_t data)
{
    GPIO_WriteBit(LCD_D4_PORT, LCD_D4, (BitAction)((data >> 0) & 0x01));
    GPIO_WriteBit(LCD_D5_PORT, LCD_D5, (BitAction)((data >> 1) & 0x01));
    GPIO_WriteBit(LCD_D6_PORT, LCD_D6, (BitAction)((data >> 2) & 0x01));
    GPIO_WriteBit(LCD_D7_PORT, LCD_D7, (BitAction)((data >> 3) & 0x01));

    GPIO_WriteBit(LCD_EN_PORT, LCD_EN, Bit_RESET);
    delay_us(1);
    GPIO_WriteBit(LCD_EN_PORT, LCD_EN, Bit_SET);
    delay_us(1);
    GPIO_WriteBit(LCD_EN_PORT, LCD_EN, Bit_RESET);
    delay_us(100);
}

void LCD_Send(uint8_t data, uint8_t command)
{
    GPIO_WriteBit(LCD_RS_PORT, LCD_RS, (BitAction)(command));

    LCD_Send_4bit((data >> 4) & 0x0F);
    LCD_Send_4bit((data >> 0) & 0x0F);
}

接着,我们需要编写一些控制函数,例如初始化函数和清屏函数。

void LCD_Init()
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);

    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = LCD_RS;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(LCD_RS_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = LCD_EN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(LCD_EN_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = LCD_D4 | LCD_D5 | LCD_D6 | LCD_D7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(LCD_D4_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = LCD_D0 | LCD_D1 | LCD_D8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(LCD_D0_PORT, &GPIO_InitStructure);

    LCD_Send(0x33, 0);
    delay_ms(5);
    LCD_Send(0x32, 0);
    delay_ms(5);
    LCD_Send(0x28, 0);
    LCD_Send(0x08, 0);
    LCD_Send(0x01, 0);
    LCD_Send(0x06, 0);
    LCD_Send(0x0C, 0);
}

void LCD_Clear()
{
    LCD_Send(0x01, 0);
    delay_ms(5);
}

最后,我们可以编写一个主函数来测试LCD是否可用,并把一些文本显示在屏幕上。

int main(void)
{
    LCD_Init();
    LCD_Clear();

    LCD_Send(0x48, 1);
    LCD_Send(0x65, 1);
    LCD_Send(0x6C, 1);
    LCD_Send(0x6C, 1);
    LCD_Send(0x6F, 1);
    LCD_Send(0x2C, 1);
    LCD_Send(0x20, 1);
    LCD_Send(0x57, 1);
    LCD_Send(0x6F, 1);
    LCD_Send(0x72, 1);
    LCD_Send(0x6C, 1);
    LCD_Send(0x64, 1);
    LCD_Send(0x21, 1);

    while (1)
    {
    }
}

在这个例子中,我们向LCD发送了一串文本“Hello, World!”,并使用无限循环来防止程序结束。当我们下载并运行这个程序时,液晶屏幕应该会显示这些文本。

需要注意的是,我们在程序中使用了一些自定义的延迟函数,需要根据实际情况进行调整,以便确保LCD能够正确接收数据。同时,还需要确保引脚和端口的定义与实际硬件连接相对应。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
以下是使用STM32F103ZET6点亮LCD1602的完整程序。这个程序涵盖了初始化GPIO口,初始化LCD1602,以及向LCD中写入数据等操作。

#include "stm32f10x.h"
#include "lcd1602.h"

void delay(__IO uint32_t nCount);

int main(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    /* Enable Clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);

    /* Configure GPIO */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5; // 设置为LCD1602的数据线
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; // 设置为LCD1602的控制线
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* 初始化LCD1602 */
    LCD1602_Init();

    /* 写入数据 */
    uint8_t text[] = "Hello, World!";
    LCD1602_WriteString(text);

    while(1)
    {
    }
}

void delay(__IO uint32_t nCount)
{
    for(; nCount != 0; nCount--);
}

此处的lcd1602.h文件需要您自己编写。示例代码如下:

#ifndef __LCD1602_H
#define __LCD1602_H

#include "stm32f10x.h"

void LCD1602_Init(void);
void LCD1602_WriteData(uint8_t dat);
void LCD1602_WriteCommand(uint8_t cmd);
void LCD1602_WriteString(uint8_t* str);
void LCD1602_SetCursorPos(uint8_t x, uint8_t y);

#endif /* __LCD1602_H */

这里的LCD1602_Init()函数初始化了LCD1602。LCD1602_WriteData()LCD1602_WriteCommand()函数用于向LCD1602写入数据和指令。LCD1602_WriteString()函数则是用来写入字符串。LCD1602_SetCursorPos()函数用于设置光标位置。

下面是lcd1602.c文件的相关代码:

#include "lcd1602.h"

void delay(uint32_t count);

void LCD1602_Init(void)
{
    /* Function Set: 0011 NFxx */
    LCD1602_WriteCommand(0x38);
    delay(5000);

    /* Function Set: 0011 NFxx */
    LCD1602_WriteCommand(0x38);
    delay(15000);

    /* Function Set: 0011 NFxx */
    LCD1602_WriteCommand(0x38);
    delay(100);

    /* Function Set: 0010 NFxx */
    LCD1602_WriteCommand(0x28);
    delay(100);

    /* Display ON/OFF Control: 0000 1DCB */
    LCD1602_WriteCommand(0x0C);
    delay(100);

    /* Clear Display */
    LCD1602_WriteCommand(0x01);
    delay(2000);

    /* Entry Mode Set: 0000 01I/D S=1 */
    LCD1602_WriteCommand(0x06);
    delay(100);
}

void LCD1602_WriteData(uint8_t dat)
{
    GPIO_SetBits(GPIOA, GPIO_Pin_2); // RS = 1
    GPIO_SetBits(GPIOA, GPIO_Pin_3); // RW = 0
    GPIOB->ODR = dat; // DB0~DB7
    GPIO_SetBits(GPIOA, GPIO_Pin_5); // E = 1
    delay(10);
    GPIO_ResetBits(GPIOA, GPIO_Pin_5); // E = 0
    delay(100);
}

void LCD1602_WriteCommand(uint8_t cmd)
{
    GPIO_ResetBits(GPIOA, GPIO_Pin_2); // RS = 0
    GPIO_ResetBits(GPIOA, GPIO_Pin_3); // RW = 0
    GPIOB->ODR = cmd; // DB0~DB7
    GPIO_SetBits(GPIOA, GPIO_Pin_5); // E = 1
    delay(10);
    GPIO_ResetBits(GPIOA, GPIO_Pin_5); // E = 0
    delay(100);
}

void LCD1602_WriteString(uint8_t* str)
{
    uint8_t i = 0;
    while(str[i] != 0)
    {
        LCD1602_WriteData(str[i]);
        i++;
    }
}

void LCD1602_SetCursorPos(uint8_t x, uint8_t y)
{
    uint8_t addr;
    if(y == 0)
    {
        addr = 0x80 + x;
    }
    else
    {
        addr = 0xC0 + x;
    }
    LCD1602_WriteCommand(addr);
}

void delay(__IO uint32_t nCount)
{
    for(; nCount != 0; nCount--);
}

这里的LCD1602_Init()函数初始化了LCD1602。LCD1602_WriteData()LCD1602_WriteCommand()函数用于向LCD1602写入数据和指令。LCD1602_WriteString()函数则是用来写入字符串。LCD1602_SetCursorPos()函数用于设置光标位置。

通过这个例程,您可以试着将它移植到您的项目中。不过这只是一个参考代码,您需要根据您的实际需要调整一些参数。
如果我的回答解决了您的问题,请采纳!

STM32驱动LCD1602
可以借鉴下
https://blog.csdn.net/rsd102/article/details/117044961

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7679722
  • 这篇博客也不错, 你可以看下使用stm32f103驱动lcd1602
  • 除此之外, 这篇博客: STM32F103ZET6硬件资源简介中的 2、LCD模块接口 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • image-20211011215409233

    ​ LCD接口接在了STM32F103ZET6的FSMC总线上(不是一条线),可以显著提高LCD的刷屏速度。

    ​ 图中的 T_MISO/T_MOSI/T_PEN/T_SCK/T_CS 连接在 MCU 的 PB2PB2/PF9/PF10/PB1/PF11 上, 这些信号用来实现对液晶触摸屏的控制(支持电阻屏和电容屏)。LCD_BL 连接在 MCU 的 PB0 上,用于控制 LCD 的背光。液晶复位信号 RESET 则是直接连接在开发板的复位按钮上,和 MCU 共用一个复位电路。

    注:

    LCD接口在板子上的具体位置:

    image-20211011220723994