如图,用stm32做的酒精浓度检测仪,硬件应该没问题,就是lcd1602初始化失败导致出现一排黑块,看看软件部分看看哪出错了。(附带程序)
你好,你的这个问题可能是因为你使用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初始化失败导致的一排黑块。可以检查一下以下几个方面:
硬件连接是否正确。检查LCD1602的引脚是否正确地连接到STM32上。
是否正确初始化了LCD1602。可以检查一下初始化函数是否正确地调用了。
是否正确设置了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的控制器。以下是液晶屏初始化过程的步骤:
对液晶控制器进行基本的初始化,包括清除显示、设置显示模式等。
向液晶控制器写命令或数据。
等待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的不同的端口上,并且通过使用延迟函数来保证充分的间隔时间和执行时间。
建议你调试一下你的代码,重点检查以下方面:
是否正确连接了LCD1602的引脚;
是否调用了正确的初始化函数和发送正确的初始化命令;
你的全局变量和功能是否正确声明和实现;
是否正确使用了I²C线;
希望这些能够帮助你找到问题所在。
如果我的回答解决了您的问题,请采纳!
1602 液晶也叫 1602 字符型液晶, 它是一种专门用来显示字母、 数字、 符号等的点阵型液晶模块。 它由若干个 5X7 或者 5X11 等点阵字符位组成, 每个点阵字符位都可以显示一个字符, 每位之间有一个点距的间隔, 每行之间也有间隔, 起到了字符间距和行间距的作用, 正因为如此所以它不能很好地显示图形