LCD显示屏的Keil和Proteus仿真遇到了问题

Keil编写调幅式纸张计数装置,proteus8.6仿真的时候,发现LCD1602显示()屏完全没动静,请问是哪里出错了

img

#include <reg52.h>
#include <stdio.h>
#include <intrins.h>

sbit LCD1602_RS = P2^0;
sbit LCD1602_RW = P2^1;
sbit LCD1602_EN = P2^2;
/*============================
LM016L
=============================*/
void Read_Busy()
{
    uchar busy;
    P0 = 0xff;
    LCD1602_RS = 0;     
    LCD1602_RW = 1;     
    do
    {
        LCD1602_EN = 1;
        busy = P0;
        LCD1602_EN = 0;    
        _nop_();
    }while(busy & 0x80); 
}

void LCD1602_Write_Cmd(uchar cmd)
{
    Read_Busy();
    LCD1602_RS = 0;
    LCD1602_RW = 0;    
    P0 = cmd;
    LCD1602_EN = 1;     
    LCD1602_EN = 0;     
}

void LCD1602_Write_Dat(uchar dat)
{
    Read_Busy();
    LCD1602_RS = 1;
    LCD1602_RW = 0;
    P0 = dat;
    LCD1602_EN = 1;
    LCD1602_EN = 0;
}


void LCD1602_Dis_Str(uchar x, uchar y, uchar *str)
{
    if(y) x |= 0x40;
    x |= 0x80;
    LCD1602_Write_Cmd(x);
    while(*str != '\0')
    {
        LCD1602_Write_Dat(*str++);
    }
}

void Init_LCD1602()
{
    LCD1602_Write_Cmd(0x38); 
    LCD1602_Write_Cmd(0x0c); 
    LCD1602_Write_Cmd(0x06); 
    LCD1602_Write_Cmd(0x01); 
}

/*============================
重置
=============================*/
void reset()
{
    uchar i;
    CalPaperNum=0;
    Num_Cal=0;
    for(i=0;i<Num_lim;i++)
    {
        At24c02Write(i,0);
    }
    LCD1602_Write_Cmd(0x01);
}
/*============================
main
=============================*/
void main()
{
    uchar LED_buffer2[16]={"   ADC:         "};
    uchar LED_buffer3[16]={"   NUM:         "};
    Init_LCD1602();
    Timer_Config();
    Int01_Config();
    Timer_Onoff(1);
    while(1)
    {
                
        if(Keyrst==1)
        {
            delay(1000);
            if(Keyrst==1)
            {
                reset();
            }
        }
        else if(Keycal==0)
        {
            delay(1000);
            if(Keycal==0)
            {
                isCalibrating=1;
                Cal_Data_Func();
                LED_buffer2[8] = voltage/100+'0';        
                LED_buffer2[9] = voltage%100/10+'0';
                LED_buffer2[10] = voltage%10+'0';
                LED_buffer2[12] = '.';
                LED_buffer2[13] = voltage/10%10+'0';
                LED_buffer2[11] = voltage/10%10+'0';

                LED_buffer2[8] = CalPaperNum/100+'0';    
                LED_buffer2[9] = CalPaperNum%100/10+'0';
                LCD1602_Dis_Str(0, 0, &LED_buffer2[0]);    
                LCD1602_Dis_Str(0, 1, &LED_buffer2[0]);    
                delay(5000);
                LCD1602_Write_Cmd(0x01);
            }
        }
        else if(Keycount==0)
        {
            delay(1000);
            if(Keycount==0)
            {
                if(isCalibrating==0)
                {
                    isMeasuring=1;
                    Out_Num_Func();
                    LED_buffer3[8] = voltage/100+'0';        
                    LED_buffer3[9] = voltage%100/10+'0';
                    LED_buffer3[10] = voltage%10+'0';
                    LED_buffer3[12] = '.';
                    LED_buffer3[13] = voltage/10%10+'0';
                    LED_buffer3[11] = voltage/10%10+'0';

                    LED_buffer3[8] = CalPaperNum/100+'0';    
                    LED_buffer3[9] = CalPaperNum%100/10+'0';
                    LCD1602_Dis_Str(0, 0, &LED_buffer3[0]);    
                    LCD1602_Dis_Str(0, 1, &LED_buffer3[0]);    
                    delay(10000);
                    LCD1602_Write_Cmd(0x01);
                }
            }
        }
    }
    return;
}    

引用chatGPT作答,根据代码中的LCD1602的相关函数可以看出,显示不出来的原因可能是由于LCD1602没有正确初始化或者在数据写入时出现了问题。因此,建议您检查以下几点:

1.确认LCD1602是否正确连接到Keil开发板上,检查电源和接口连接是否稳定。

2.检查LCD1602的初始化函数Init_LCD1602()是否被正确调用。您可以使用示波器或者LED灯等工具来验证是否已经执行了初始化。

3.检查LCD1602的控制线是否正确连接到Keil开发板上。确保控制线和数据线都能够正常通信。

4.检查LCD1602的读写操作是否正确。您可以使用示波器或者LED灯等工具来验证数据是否能够正确地写入LCD1602。

5.检查LCD1602的数据是否正确。您可以使用示波器或者LED灯等工具来验证数据是否正确地显示在LCD1602上。

如果以上几点都没有问题,您可以在代码中添加一些调试信息,例如打印一些变量或者输出一些调试信息,以便进一步排查问题。