ccyyer 发表于 2021-12-7 17:07 第一种:r 单片机可以,仿真不行; #include <reg52.h> ... void Busy() { ··· } 第二种:源代码中的:单片机可以仿真不行。 #include <AT89X52.h> ... void LCD1602_busy(void) { ··· } 以上两种不能仿真是因为在驱动忙检测里在对P0口赋值后马上忙检测,此时检测的还是对P0赋值的1,所以一直为忙,只有在while忙检测之前加一段延时就行。 例如这样。 void Busy() { P0= 0xFF;//必要的否则会干扰读写信号 delay_nms(5); RW=1; RS=0; EN=1; while(P0 & 0x80); EN=0; } 为了验证这一猜想,我将P0赋值为0F,果然此时仿真有显示了。然而实际单片机则显示错误。 这说明硬件与软件在数据读取速度上的不同,影响了实现。 |
你把排阻连接到lcd1602上看看 |
有一下几种驱动; 忙检测的: 第一种:r 单片机可以仿真不行; #include <reg52.h> ... void Busy() { P0= 0xFF;//必要的否则会干扰读写信号 RW=1; RS=0; EN=1; while(P0 & 0x80); EN=0; } 第二种:源代码中的:单片机可以仿真不行。 #include <AT89X52.h> ... void LCD1602_busy(void) { P0_7=1; //将P0.7置1,为读状态做准备 RS=0; //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入 RW=1; //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入 E=1; //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入 while(P0_7==1); //由P0.7读入1,表示1602液晶忙,需要等待 E=0; //读完以后,恢复E的电平 } 第三种:也是唯一成功的,读入忙信号后不将while循环放在忙检测函数中,这似乎也是影响到仿真的因素,while循环是否在忙检测函数内部。 //BUSY CHECK bit test() { bit busy; RS=0; RW=1; EN=1; _nop_(); _nop_(); _nop_(); _nop_(); busy=BF; EN=0; return busy; } 我要顶不住了兄弟们 |
Y_G_G 发表于 2021-12-7 13:25 我也不会,同喜同喜。 |
逛这个论坛三年,我一直很庆幸,我到现在还不会用proteus仿真 |
songxia8013 发表于 2021-12-6 16:48 是的,我对着网上一个驱动改了就行,正在详细看 |
有没有可能是芯片配置不正确? 还是单片机的机器频率设置不正确? |
应该是放错程序了吧 |
你不贴代我只能乱猜 请把Readdata和WriteData函数中的CheckBusy注释掉 |
可能都原因:你的1602驱动程序有问题 |
看了两个图区别是不同的文件夹![]() |