lcd1602显示一排方块

如图,用stm32做的酒精浓度检测仪,硬件应该没问题,就是lcd1602初始化失败导致出现一排黑块,看看软件部分看看哪出错了。(附带程序)

img

img

img

img

img

img

img

img

你好,你的这个问题可能是因为你使用P0引脚没有上拉电阻。软件应该没啥问题,我看你的图片是直连的,可以考虑外接上拉一个电阻试一下。参考这篇文章:
https://blog.csdn.net/qq_63691940/article/details/125526291


#include <reg52.h>   
#include "intrins.h"                         
#include <stdio.h>
 
#define LCD1602_DB P0
  
sbit LCD1602_RS = P2^0; //LCD1602 显示
sbit LCD1602_RW = P2^1; //LCD1602 显示
sbit LCD1602_E = P2^2;  //LCD1602 显示
 
void InitLcd1602();
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);  
void LcdShowStr_data(unsigned char x, unsigned char y, unsigned char s);  
 
void main (void)
{ 
    InitLcd1602();
    LcdShowStr(0, 0, "0123456789ABCDEF"); 
    LcdShowStr(0, 1, "0123456789ABCDEF"); 
    while(1);
}

/* 等待液晶准备好 */
void LcdWaitReady()
{
    unsigned char sta;
    LCD1602_DB = 0xFF;
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    do 
    {
        LCD1602_E = 1;
        sta = LCD1602_DB; //读取状态字
        LCD1602_E = 0;
    }
    while (sta & 0x80); //bit7 等于1表示液晶正忙,重复检测直到其等于0为止
}

/* 向LCD1602 写入一字节命令,cmd-待写入命令值 */
void LcdWriteCmd(unsigned char cmd)
{
    LcdWaitReady();
    LCD1602_RS = 0;
    LCD1602_RW = 0;
    LCD1602_DB = cmd;
    LCD1602_E = 1;
    LCD1602_E = 0;
}

/* 向 LCD1602 写入一字节数据,dat-写入数据值 */
void LcdWriteDat(unsigned char dat)
{
    LcdWaitReady();
    LCD1602_RS = 1;
    LCD1602_RW = 0;
    LCD1602_DB = dat;
    LCD1602_E = 1;
    LCD1602_E = 0;
}


/* 设置显示 RAM 起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */
void LcdSetCursor(unsigned char x, unsigned char y)
{
    unsigned char addr;
    if (y == 0)
    { //由输入的屏幕坐标计算显示 RAM 的地址
      addr = 0x00 + x; //第一行字符从 0x00 起始
    }
    else
    {    
      addr = 0x40 + x; //第二行字符从 0x40 起始
    }
    LcdWriteCmd(addr | 0x80); //设置 RAM 地址
}

/* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针 */
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
{
    LcdSetCursor(x, y); //设置起始地址
    while (*str != '\0')
    { //连续写入字符串数据,直到检测到结束符
      LcdWriteDat(*str++); // 连续写入字符串数据,然后str自加 1
   }
}


void LcdShowStr_data(unsigned char x, unsigned char y, unsigned char s)
{
    LcdSetCursor(x, y); //设置起始地址
    LcdWriteDat('0'+s);  
}

 
/* 初始化1602液晶 */
void InitLcd1602()
{
    LcdWriteCmd(0x38); //16*2 显示,5*7 点阵,8 位数据接口
    LcdWriteCmd(0x0C); //显示器开,光标关闭
    LcdWriteCmd(0x06); //文字不动,地址自动加 1
    LcdWriteCmd(0x01); //清屏
} 

  



以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:

可能是LCD1602初始化失败导致的一排黑块。可以检查一下以下几个方面:

  1. 硬件连接是否正确。检查LCD1602的引脚是否正确地连接到STM32上。

  2. 是否正确初始化了LCD1602。可以检查一下初始化函数是否正确地调用了。

  3. 是否正确设置了LCD1602的显示模式。可以检查一下显示模式的设置是否正确。

以下是一个简单的LCD1602初始化程序的示例:

#include "stm32f10x.h"

void LCD1602_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
    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_10;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    GPIO_Write(GPIOB, 0x38);
    GPIO_Write(GPIOB, 0x38);
    GPIO_Write(GPIOB, 0x38);
    GPIO_Write(GPIOB, 0x0C);
    GPIO_Write(GPIOB, 0x06);
    GPIO_Write(GPIOB, 0x01);
}

在这里,我们使用了GPIOB的0、1、5、6、7、8、9、10引脚来连接到LCD1602上,用于控制其显示。在初始化函数中,我们首先开启了GPIOB的时钟,然后设置了GPIOB的引脚工作模式为输出模式。最后,我们发送了一些初始化命令给LCD1602,包括设置显示模式、光标移动方向等。

希望这个例子可以帮助你解决问题。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
从你的描述来看,这个问题是LCD1602初始化失败导致的。首先,你需要检查是否使用了正确的初始化步骤,包括正确连接LCD以及正确初始化LCD的控制器。以下是液晶屏初始化过程的步骤:

  1. 对液晶控制器进行基本的初始化,包括清除显示、设置显示模式等。

  2. 向液晶控制器写命令或数据。

  3. 等待LCD响应后再发送下一个指令。

下面是一个简单的LCD1602的初始化程序片段:

// 初始化I/O口、使能液晶
void lcd_init(void)
{
    delay_ms(20);
    write_com(0x38);  // 8位总线、2行显示、5 x 7点阵
    delay_ms(5);
    write_com(0x38);  // 8位总线、2行显示、5 x 7点阵
    delay_ms(5);
    write_com(0x38);  // 8位总线、2行显示、5 x 7点阵
    delay_us(50);
    write_com(0x08);  // 关闭显示
    delay_us(50);
    write_com(0x01);  // 清除屏幕
    delay_ms(5);
    write_com(0x06);  // 光标右移,文字不动
    delay_us(50);
    write_com(0x0c);  // 开启显示,光标关闭
}

void write_com(uint8_t ch)
{
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 1;
    LCD_DATA = ch;
    delay_us(10);
    LCD_EN = 0;
}

void write_data(uint8_t ch)
{
    LCD_RS = 1;//写数据
    LCD_RW = 0;//写模式
    LCD_EN = 1;//允许
    LCD_DATA = ch;
    delay_us(10);
    LCD_EN = 0;
}

上面的代码假定了将LCD1602的1602端口接在STM32的不同的端口上,并且通过使用延迟函数来保证充分的间隔时间和执行时间。

建议你调试一下你的代码,重点检查以下方面:

  1. 是否正确连接了LCD1602的引脚;

  2. 是否调用了正确的初始化函数和发送正确的初始化命令;

  3. 你的全局变量和功能是否正确声明和实现;

  4. 是否正确使用了I²C线;

希望这些能够帮助你找到问题所在。
如果我的回答解决了您的问题,请采纳!

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你看下这篇博客吧, 应该有用👉 :STM32驱动lcd1602,并口8位 6800时序
  • 除此之外, 这篇博客: 【毕业设计】基于stm32的智能温控风扇设计与实现 - 物联网 单片机中的 3.2.2 LCD1602 液晶屏简介 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    1602 液晶也叫 1602 字符型液晶, 它是一种专门用来显示字母、 数字、 符号等的点阵型液晶模块。 它由若干个 5X7 或者 5X11 等点阵字符位组成, 每个点阵字符位都可以显示一个字符, 每位之间有一个点距的间隔, 每行之间也有间隔, 起到了字符间距和行间距的作用, 正因为如此所以它不能很好地显示图形

    在这里插入图片描述


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^