打印

写命令OK,写数据后无显示,请高手帮忙check

[复制链接]
1898|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jmx|  楼主 | 2007-7-27 09:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ck, LCD, CD, LED, RS
执行写命令OK,例如我W_cmd(0x85); 光标会跑到第一行第五列的位置并闪烁.
但是当我执行写数据指令把要显示的内容写入的时候,屏幕就什么也没有了.
我怀疑是W_data();有问题,可是我试了把    LCD_DATA=lcddata;放在LCD_EN=1;前面,也不行,而且我看别人的demo程序时序也是这样的,实在找不出问题了.
以前没有搞过LCD,请高手帮忙看看,
/*-------------------------------------------------------------

-------------------------------------------------------------*/
#include "REG52.H"
  
#define uchar unsigned char 


/*-------------------------------------------------------------
sbit分别定义CPU 管脚对应的硬件连接
-------------------------------------------------------------*/
sfr   LCD_DATA  = 0xA0;

sbit  LCD_EN     = 0xB3;//------P3.3 Enable Pin
sbit  LCD_RS    = 0xB4;//------P3.4 RS pin
sbit  LCD_RW    = 0xB5;//------P3.5 R/W pin

sbit led0        = 0x80;//------LED, for debug
sbit led1        = 0x82;//------LED, for debug
sbit led2        = 0x84;//------LED, for debug
sbit led3        = 0x86;//------LED, for debug
sbit bflag=P2^7;       //------busy bit


LCD_busy(void);        //判断LCD BUSY
void W_cmd(uchar);     //写命令
void R_data(void);     //读数据
void W_data(uchar);    //写数据
void Delay_xMs(unsigned int x);//延时;


LCD_busy(void)            //----判断LCD BUSY
{
unsigned char Lcdbusy;
   LCD_EN=0;               //clear enable
   led0=0;
   Delay_xMs(3);
   LCD_RS=0;               //clear RS
   led1=0;
   Delay_xMs(3);
   LCD_RW=1;                //set R/W
   led2=1;
   Delay_xMs(3);
   LCD_EN=1;                //set enable
   led0=1;
   Delay_xMs(3);
  Lcdbusy=P2;              //读P2口,取得BF状态 
  while( bflag==1)       
  {  Lcdbusy=P2;}
  LCD_EN=0;                //clear EN
        led0=0;

}
void W_cmd(uchar lcdcmd)    //---写命令
{   
   LCD_busy();             //判断BUSY
   LCD_EN=0;               //clear  EN
    led0=0;
    Delay_xMs(3);
   LCD_RS=0;               //clear  RS
   led1=0;
    Delay_xMs(3);
    LCD_RW=0;              //clear RW
    led2=0;
    Delay_xMs(3);
    LCD_EN=1;              //set EN
    led0=1;
    Delay_xMs(3);
    LCD_DATA=lcdcmd;       //send command to LCD
    LCD_EN=0;              //clear  EN
    led1=0;
    Delay_xMs(128);
}

void W_data(uchar lcddata)    //--写数据到LCD
{
   LCD_busy();                //判断BUSY
   LCD_EN=0;                  //clear  EN
   led0=0;
    Delay_xMs(3);
    LCD_RS=1;                 //set RS
    led1=1;
    Delay_xMs(3);
    LCD_RW=0;                 //clear  RW
    led2=0;
    Delay_xMs(3);
    LCD_EN=1;                //set EN
     led0=1;
    Delay_xMs(3);
    LCD_DATA=lcddata;        //send data to LCD

    LCD_EN=0;               //clear  EN
    led0=0;
    Delay_xMs(128);
}




/*------------------------------------------------
功能:显示码.
-------------------------------------------------*/
unsigned char code LCD_Show[]={0x50,0xf5,0x68,0x4a,0x47,0xc2,0xc0,0x5b,0x40,0x42,0x41,0xc4,0xf0,0x4c,0xe0,0xe1,0xff};


/*-------------------------------------------------
功能:1MS延时子程序
-------------------------------------------------*/
void Delay_xMs(unsigned int x)
{
    unsigned int i,j;
    for( i =0;i < x;i++ )
    {
        for( j =0;j<500;j++ );
    }
}

/*-------------------------------------------------
主程序
--------------------------*/
void main()
{  

   uchar i;
  LCD_EN=0;
     led0=0;
   LCD_RW=0;
            led2=0;

//          led0=0;
        W_cmd(0x38);//显示模式设置,这个命令的格式为:001,DL,N,F,-,-
        ; ------------------------------------------------请看第6条命令的说明,因这是一个16字符
        ;--------------------------------------------------2行的模组,用并行传输,因此将DL设定为1,将N设定
        ;--------------------------------------------------为1表示有两行,将F设定为0,表示用5X8的点的字符
//        led1=0;
        W_cmd(0x01);//清屏
        W_cmd(0x0E);;-----------------显示,光标,闪动控制,这个命令的格式为:00001,D,C,B
        ;--------------------------------------------------D为1,表示显示开,C为0表示光标关,B为0表示闪动关
        W_cmd(0x80);//设定首行地址

           W_data(0x55);//写入要显示的内容--------问题就在这行执行以后


//      led2=0;
      while(1); 

相关帖子

沙发
jmx|  楼主 | 2007-7-27 21:57 | 只看该作者

难道没有人能帮忙解决么?

难道没有人能帮忙解决么?

使用特权

评论回复
板凳
XWJ| | 2007-7-27 22:39 | 只看该作者

先送数,再改变EN

void W_cmd(uchar lcdcmd)    //---写命令
{   
   LCD_busy();             //判断BUSY
   LCD_EN=0;               //clear  EN
    led0=0;
    Delay_xMs(3);
   LCD_RS=0;               //clear  RS
   led1=0;
    Delay_xMs(3);
    LCD_RW=0;              //clear RW
    led2=0;
    LCD_DATA=lcdcmd;       //send command to LCD
    Delay_xMs(3);
    LCD_EN=1;              //set EN
    led0=1;
    Delay_xMs(3);
    LCD_EN=0;              //clear  EN
    led1=0;
    Delay_xMs(128);
}

void W_data(uchar lcddata)    //--写数据到LCD
{
   LCD_busy();                //判断BUSY
   LCD_EN=0;                  //clear  EN
   led0=0;
    Delay_xMs(3);
    LCD_RS=1;                 //set RS
    led1=1;
    Delay_xMs(3);
    LCD_RW=0;                 //clear  RW
    led2=0;
    LCD_DATA=lcddata;        //send data to LCD
    Delay_xMs(3);
    LCD_EN=1;                //set EN
     led0=1;
    Delay_xMs(3);

    LCD_EN=0;               //clear  EN
    led0=0;
    Delay_xMs(128);
}


使用特权

评论回复
地板
jmx|  楼主 | 2007-7-28 22:19 | 只看该作者

试过了,还是不行啊:(

试过了,还是不行啊:(

使用特权

评论回复
5
jmx|  楼主 | 2007-7-29 00:10 | 只看该作者

为什么写执行数据命令看起来像是写地址呢

我看到书上有这样的介绍:
显示模块类型 | DDRAM地址  | 显示位置
             |            |0 |1 |2 |3 |... |13|14|15|
16X2         |  第一行    |00|01|02|03|... |0D|0E|0F|
             |  第二行    |40|41|42|43|... |4D|4E|4F| 
当我执行完我的W_cmd(0x85),光标会跑到第一行第六列,
可是接下来我打算写入数据的时候奇怪的事情发生了,当我执行W_data(0x40)以后,光标就跑到第二行第一列,执行W_data(0x4F)光标就跑到第二行最后一列,W_data(0x55)后就什么也没有了。
不知道有没有高手遇到类似情况,
我有换一个20X2的LCD也是一样,所以应该和LCD没有关系
请指点!谢谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

jmx

9

主题

58

帖子

0

粉丝