Keil编写调幅式纸张计数装置,proteus8.6仿真的时候,发现LCD1602显示()屏完全没动静,请问是哪里出错了
#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上。
如果以上几点都没有问题,您可以在代码中添加一些调试信息,例如打印一些变量或者输出一些调试信息,以便进一步排查问题。