为什么程序运行没问题,LCD1602可以亮但不能显示字符

LCD1602.c的代码如下

#include <STC15F2K60S2.H>
#include <intrins.h>


sbit LCD_RS=P4^1;
sbit LCD_RW=P4^2;
sbit LCD_E=P4^4;
#define LCD_DataPort P2

void LCD_Delay()        //@11.0592MHz 500us
{
    unsigned char i, j;

    _nop_();
    _nop_();
    i = 6;
    j = 93;
    do
    {
        while (--j);
    } while (--i);
}


void LCD_WirteCommand (unsigned char Command)
{
    LCD_RS=0;
    LCD_RW=0;
    LCD_DataPort=Command;
    LCD_E=1;
    LCD_Delay();
    LCD_E=0;
    LCD_Delay();
}

void LCD_WirteData (unsigned char Data)
{
    LCD_RS=1;
    LCD_RW=0;
    LCD_DataPort=Data;
    LCD_E=1;
    LCD_Delay();
    LCD_E=0;
    LCD_Delay();
}

void LCD_Init(void)
{
    LCD_WirteCommand(0x38);
    LCD_WirteCommand(0x0c);
    LCD_WirteCommand(0x06);
    LCD_WirteCommand(0x01);
}

void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{
    if(Line==1)
    {
        LCD_WirteCommand(0x80|(Column-1));
    }
    else
    {
        LCD_WirteCommand(0x80|(Column-1+0x40));
    }
    LCD_WirteData(Char);
}



main.c的代码:

#include <STC15F2K60S2.H>
#include <intrins.h>
#include "LCD1602.h"



void main()
{
    LCD_Init();
    LCD_ShowChar(1,2,0x41);
    
}

LCD1602部分的原理图

img


结果LCD只是亮了但不显示字符

img

调节一下对比度试试

【以下回答由 GPT 生成】

首先,你的代码中只提供了LCD初始化和写入字符的函数,但没有看到调用这些函数的代码。我们可以假设你有调用这些函数的代码,只是没有提供给出来。

在看代码的基础上,有几个可能导致LCD1602无法显示字符的问题:

  1. 电源问题:首先,确保LCD1602的电源连接正确并且稳定。参考LCD1602的数据手册,确认电源电压范围是否满足要求。

  2. 引脚问题:确认LCD1602的引脚连接正确。你的代码中使用了P4口的引脚作为控制引脚,P2口作为数据引脚。确保这些引脚与LCD1602的引脚连接一致。

  3. 信号问题:电位差是否正确传递给LCD1602。你的代码中使用了软件延迟函数来控制LCD的信号,确认延迟时间是否合适。可以尝试增加延迟时间来解决问题。

接下来是一些可能助于解决问题的方法:

  1. 检查LCD初始化函数是否被调用:确保在你的代码中已经调用了LCD_Init函数来初始化LCD1602。这个函数应该在其他操作之前被调用。

  2. 检查字符显示函数是否被正确调用:确保在显示字符之前,使用LCD_ShowChar函数设置正确的行和列参数。

综上所述,你可以尝试以下步骤来解决该问题:

  1. 确认电源和引脚连接是否正确。

  2. 调整软件延迟函数的延迟时间。

  3. 确保LCD_InitLCD_ShowChar函数被正确调用。

如果以上方法都不能解决问题,则可能是其他硬件或代码问题导致LCD1602无法显示字符。在这种情况下,进一步的故障排除可能需要对硬件进行检查或尝试使用其他测试代码来确认LCD1602正常工作。如果遇到问题,请向硬件供应商或开发者社区寻求支持。



【相关推荐】



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

延时函数有点问题,j 的值只赋值一次,造成延时时间不准确,修改如下,再试试:

void LCD_Delay()        //@11.0592MHz 500us
{
    unsigned char i, j;

    _nop_();
    _nop_();
    i = 6;
    j = 93;
    do
    {
        j = 93;   // 修改
        while (--j);
    } while (--i);
}

试试

void LCD_Delay()        //@11.0592MHz 500us
{
    unsigned char i, j;
 
    _nop_();
    _nop_();
    //i = 6;
    i = 21;       // Delay >= 1.6ms @11.0592MHz
    do
    {
        j = 93;
        while (--j);
    } while (--i);
}

再仔细看看 规格书, 1602每个命令的执行所需时间是不一样的,
旧款LCD1602命令最长 >= 1.6ms. 短的 <= 50us
原延迟时间才 0.5ms, 命令根本没完成