LCD显示的问题,请求帮助!


我做了个LCD1602,但是不能显示,搞了一下午,也没看出来是什么原因!请高手帮忙看看!
下面是proteus 仿真图
[localimg=370,300]2[/localimg]
我的keil源程序如下:
#include <reg51.h>
#include <intrins.h>
#define nop() _nop_()
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL;
sbit rs = P3^5;
sbit rw = P3^6;
sbit ep = P3^7;
BYTE code dis1[] = {"www.stuelab.cn"};
BYTE code dis2[] = {"cao si yi"};
/*********************************************************
函数功能:延时子程序
入口参数:ms
出口参数:
*********************************************************/
void delay(BYTE ms)
{
  BYTE i;
  while(ms--)
    {
     for(i=0;i<250;i++)
       {
         nop();
         nop();
         nop();
         nop();
        }
    }
}
/*************************************************************
函数功能:测试LCD忙碌状态
入口参数:
出口参数:result
*************************************************************/
BOOL lcd_bz()
{
  BOOL result;
  rs = 0;
  rw =1;
  ep = 1;
  nop();
  nop();
  nop();
  nop();
  result = (BOOL)(P0&0x80);
  ep = 0;
  return result;
}
/************************************************************
函数功能:写指令数据到LCD
入口参数:cmd
出口参数:
************************************************************/
lcd_wcmd(BYTE cmd)
{
  while(lcd_bz)
  rs = 0;
  rw = 0;
  ep = 0;
  nop();
  nop();
  P0 = cmd;
  nop();
  nop();
  nop();
  nop();
  ep = 1;
  nop();
  nop();
  nop();
  nop();
  ep = 0;
}
/**********************************************************
函数功能:设定显示位置
入口参数:pos
出口参数:
**********************************************************/
lcd_pos(BYTE pos)
{
  lcd_wcmd(pos+0x80);
}
/***********************************************************
函数功能:写显示数据到LCD
入口参数:dat
出口参数:
***********************************************************/
lcd_wdat(BYTE dat)
{
  while(lcd_bz());
  rs = 1;
  rw = 0;
  ep = 0;
  P0 = dat;
  nop();
  nop();
  nop();
  nop();
  ep = 1;
  nop();
  nop();
  nop();
  nop();
  ep = 0;
}
/************************************************************
函数功能:LCD初始化
入口参数:
出口参数:
************************************************************/
lcd_initial()
{
  lcd_wcmd(0x38);//显示模式设置
  delay(1);
  lcd_wcmd(0x0c);//显示开及光标设置
  delay(1);
  lcd_wcmd(0x06);//显示光标移动设置
  delay(1);
  lcd_wcmd(0x01);//清除LCD显示内容
  delay(1);
}
/************************************************************
函数功能:主程序
入口参数:
出口参数:
************************************************************/
main()
{
  BYTE i;
  lcd_initial();
  delay(10);
  lcd_pos(0);
  i=0;
  while(dis1!='\0')
   {
    lcd_wdat(dis1);
    i++;
   }
   lcd_pos(0x41);
   i=0;
  while(dis2!='\0')
   {
    lcd_wdat(dis2);
    i++;
   }
  while(1);
}

1602.rar
(2008-07-29 16:52:20, Size: 38 KB, Downloads: 0)


Snap1.jpg


我也来说两句 查看全部回复

最新回复

  • lzl520f4 (2008-7-30 13:26:35)

    我以前也遇到这样的情况.搞了好久都不显示.后来仿真时把忙检测去掉.就行了.你试一下看看.
  • 天罡星lmy (2008-7-30 13:43:39)

    把  忙标志去掉就行了 仿真软件还是跟硬件有差距
  • wscsyyych (2008-7-30 18:15:51)

    搞出来啦!是测忙的问题!把测忙去掉之后就能够显示啦,很兴奋
    在此感谢上楼的lzl520f4和天罡星lmy的提醒!
    但是还不知道为什么仿真的时候非得把测忙去掉才能正常显示??........
  • 高日红123 (2008-8-01 15:15:41)

    我以前也遇到这样的情况.搞了好久都不显示.后来仿真时把忙检测去掉.就行了.你试一下看看.
  • liaoguobao00 (2008-8-03 09:13:27)

    楼主说把测忙去掉之后就能够显示,这事没错,但是你要知道,任何一块液晶显示器在送指令之前都必须检测忙标志的,只有标志位为0事才能送指令,这是规定,事不能省略的。
        你的程序之所以通不过,那是应为你的测忙程序写错了,它是在E的上升沿(不是下降沿,切记!!!!!)在D7上给出忙标志,这点和12864恰好相反,所以你照搬12864的测忙程序肯定通不过啦,你把测忙程序改成这样就对了
    BOOL lcd_bz()
    {
      BOOL result;
      rs = 0;
      rw =1;
      ep = 0;
      nop();
      nop();
      nop();
      nop();
      result = (BOOL)(P0&0x80);
      ep = 1;
      return result;
    }
  • wscsyyych (2008-8-03 10:34:19)

    回复#6楼,我在程序中试了一下你的想法,发现不对,你说是在E的上升沿在D7上给出忙标志位,这是错的,应该是在下降沿测忙!!
    顺便说一下,我原来不能显示的原因已经找出来啦,其实在软件上仿真加上测忙程序是可以显示的!原来程序出错的地方如下:
    /************************************************************
    函数功能:写指令数据到LCD
    入口参数:cmd
    出口参数:
    ************************************************************/
    lcd_wcmd(BYTE cmd)
    {
      while(lcd_bz)
      rs = 0;
      rw = 0;
      ep = 0;
      nop();
      nop();
      P0 = cmd;
      nop();
      nop();
      nop();
      nop();
      ep = 1;
      nop();
      nop();
      nop();
      nop();
      ep = 0;
    }
    这个子程序中的测忙指令 “ while(lcd_bz)  ”应该改为 “while(lcd_bz()); ”才是对的,
    顺便把主函数也改了下,仿真成功!
    把能够成功仿真的源程序传上来,共享一下!

    1602.rar
    (2008-08-03 10:34:19, Size: 39.1 KB, Downloads: 7)

  • liuliya21c (2008-8-03 14:48:34)

    7楼的看的比较仔细,呵呵,就是那个地方不对的~
    这种错误可以在keil中单步调试中调试出来,或者keil和protues联调中跳出来的
  • lining (2008-8-03 15:50:13)

  • 锅牛 (2008-8-09 15:28:59)

    真是太感谢了!
  • lzl520f4 (2008-8-11 13:09:16)

    我觉得还是你的忙检测程序有问题.呵呵.
    6楼的说得思路是没错的.你再仔细想一下.