标题: LCD1602可以在仿真显示出来,插到我的单片机上就只亮,不显示字符 [打印本页]

作者: 13067071271    时间: 2018-5-20 16:31
标题: LCD1602可以在仿真显示出来,插到我的单片机上就只亮,不显示字符
  1. #include<reg52.h>

  2. #define LCD1602_DB P0

  3. sbit LCD1602_RS = P2^6;
  4. sbit LCD1602_RW = P2^5;
  5. sbit LCD1602_E  = P2^7;

  6. typedef unsigned int uint;
  7. typedef unsigned char uchar;

  8. void Delay10us(uint i)         
  9. {
  10.         while(i--);
  11. }

  12. /* lcd1602写入数据/命令(i=1/i=0) */
  13. void Write_Cmd_Dat(uchar i,uchar dat)   
  14. {
  15.         LCD1602_RS = i;
  16.         LCD1602_RW = 0;        
  17.         LCD1602_E  = 1;
  18.         LCD1602_DB = dat;
  19.         Delay10us(500);                 //不能少!!
  20.         LCD1602_E  = 0;
  21. }


  22. void LCD1602Init()
  23. {
  24.         Write_Cmd_Dat(0,0x38);
  25.         Write_Cmd_Dat(0,0x0c);
  26.         Write_Cmd_Dat(0,0x06);
  27.         Write_Cmd_Dat(0,0x01);
  28. }


  29. /* 设置LCD1602光标位置 */
  30. void LcdSetCursor(uchar x,uchar y)
  31. {
  32.         uchar addr;

  33.         if(y==0)
  34.                 addr = 0x00 + x;
  35.         else
  36.                 addr = 0x40 + x;

  37.         Write_Cmd_Dat(0,addr |0x80);
  38. }

  39. /* LCD1602显示字符串 */
  40. void DisplayString(uchar *s)
  41. {
  42.         while(*s>0)
  43.         {
  44.                 Write_Cmd_Dat(1,*s);
  45.                 s++;
  46.         }
  47. }



  48. void main()
  49. {

  50.         char code string_1[] = "sadfsadf";
  51.         char code string_2[] = "   23";
  52.         LCD1602Init();
  53.         LcdSetCursor(0,0);
  54.         DisplayString(string_1);

  55.         LcdSetCursor(0,1);
  56.         DisplayString(string_2);

  57.         while(1);               
  58. }

复制代码

作者: 13067071271    时间: 2018-5-20 16:31
请问是哪里得问题呢
作者: 小黑不黑    时间: 2018-5-20 16:45
检查有无虚焊,有无短路情况
作者: wulin    时间: 2018-5-20 21:03
13067071271 发表于 2018-5-20 16:31
请问是哪里得问题呢

查延时程序是否与所用单片机适配
作者: xyzmk123    时间: 2018-5-21 09:04
你的程序的有问题,你应该根据LCD的DataSheet来写程序,根据LCD的时序图来对应程序。
作者: zhdp    时间: 2018-5-21 09:16
我老是看到有人写1602的程序总是没‘’检查是否忙碌“”这个函数,我还以为不写也可以,就特地去删除这个函数试试,结果出现一排方块。我是真的服,我看到没加的不止三次了。还有你的
/* LCD1602显示字符串 */while(*s>0)这样写不是死循环吗,能显示出吗?DisplayString(string_1);没加&编译没报错,我没写立刻报错.
        
  

作者: xyzmk123    时间: 2018-5-23 16:53
zhdp 发表于 2018-5-21 09:16
我老是看到有人写1602的程序总是没‘’检查是否忙碌“”这个函数,我还以为不写也可以,就特地去删除这个函 ...

这个回帖明显有问题,忙信号检测可以加但是没有必要,只要加入一定的延迟即可不必那么麻烦的,忙检测对于高速器件单片机来说是必要的,但是51单片机的最大频率也就24MHz,我之前测试过,在两个数据写入不加延迟是可以正常显示的,也不用忙检测。
再解释下忙检测,是为了防止写一个信号的时候,这一个信号没有写完就开始写下一数据,造成错误才加入的忙检测。
我之前回复过这个问题,程序有问题,根据LCD1602D 的DATASHEET文档来编写程序。
(我的正确答案只有20黑币奖励,回答有问题的竟然奖励50黑币,我很不开心~)
作者: xyzmk123    时间: 2018-5-23 17:01
本来想等着楼主回复,问我怎么改程序的,发现楼主不见了,那我把你的问题解释一下,你的数据输入之前应该满足建立时间的要求,数据先使能再写入数据怎么能满足建立时间的要求呢。你应该先把数据写入LCD延迟一段时间之后使能EN置1,再延迟一段时间后清0 EN
作者: yanwang    时间: 2018-5-23 20:46
调一下电位器试试
作者: 13067071271    时间: 2018-6-4 18:40
小黑不黑 发表于 2018-5-20 16:45
检查有无虚焊,有无短路情况

问题已经解决了  我发现我的液晶屏是4路的


作者: 13067071271    时间: 2018-6-4 18:42
谢谢打家由于我是第一次发帖没能及时回复大家
下面是我把配置的代码改了就没问题了
void LcdInit()                                                  //LCD初始化子程序
{
        Write_Cmd_Dat(0,0x32);         //将8位总线转为4位总线
        Write_Cmd_Dat(0,0x28);         //在四位线下的初始化
        Write_Cmd_Dat(0,0x0c);  //开显示不显示光标
        Write_Cmd_Dat(0,0x06);  //写一个指针加1
        Write_Cmd_Dat(0,0x01);  //清屏
        Write_Cmd_Dat(0,0x80);  //设置数据指针起点
}
作者: 13067071271    时间: 2018-6-4 18:44
xyzmk123 发表于 2018-5-23 17:01
本来想等着楼主回复,问我怎么改程序的,发现楼主不见了,那我把你的问题解释一下,你的数据输入之前应该满 ...

是的 我就是没有建立时间的要求 在adc0832这个芯片上吃了亏
这个lcd是为了做一个做单片机测电压的
作者: 13067071271    时间: 2018-6-4 18:47
zhdp 发表于 2018-5-21 09:16
我老是看到有人写1602的程序总是没‘’检查是否忙碌“”这个函数,我还以为不写也可以,就特地去删除这个函 ...

谢谢你 我回去改了函数
作者: 我我我我我我    时间: 2018-6-4 19:07
硬件本身有问题吗




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1