这个1602液晶的程序有什么问题?

[复制链接]
3455|17
 楼主| tc9148 发表于 2007-8-18 22:13 | 显示全部楼层 |阅读模式
这个程序,写到单片机后没有任何显示。





//***********P2连接液晶数据输入
#include "reg51.h"
#define  uchar unsigned char
sbit     RS=P3^7;    //数据/命令控制 H/L
sbit     RW=P3^6;    //读/写控制 H/L
sbit     E=P3^5;    //使能信号 高--低


//*********************************************
//**************开机延时子程序*****************
//*********************************************
void delay()
{
    int j=1000;
    while(j--);
    
}     
//*********************************************
//**************忙延时子程序*******************
//*********************************************
void delay_1()
{
    int i=100;
    while(i--);
    
}
//*********************************************
//*************指令子程序**********************
//*********************************************
void enable(uchar i)
{    
     
     RS=0;
     RW=0;
          E=1;     
     P2=i;
     E=0;
     delay_1();
}

//*********************************************
//*************显示字符函数********************
//*********************************************
void line_ch()
{

     
     RS=1;
     RW=0;
          E=1;     
     P2=0x45;
     E=0;          
     delay_1();
     
}
    
    

void main()
{
         P2=0xFF;
         RS=1;
    RW=1;     
    E=1;
    delay();
    enable(0x38);//方式设定
    enable(0x0C);
    enable(0x06);
    enable(0x01);//清屏
         enable(0x85);//第一行第一位    
     line_ch();
    while(1);
}

 楼主| tc9148 发表于 2007-8-18 22:14 | 显示全部楼层

我写过一个汇编语言程序,可以显示,说明液晶是好的。
 楼主| tc9148 发表于 2007-8-19 17:35 | 显示全部楼层

哎~
没人回答,我自己顶一下吧。
dai_weis 发表于 2007-8-19 21:13 | 显示全部楼层

是不是延时有些短了

enable(0x38);//方式设定
    enable(0x0C);
之后,检查一下忙标志,看看。
延长delay_1函数的延时时间
hotpower 发表于 2007-8-19 21:20 | 显示全部楼层

肯定是时序的问题.那个E=1后的delay()也太夸张了

没用过1602,别拍我~~~
 楼主| tc9148 发表于 2007-8-19 22:52 | 显示全部楼层

!

我自己再试试看。
ayb_ice 发表于 2007-8-20 07:54 | 显示全部楼层

汇编都可以搞定,C还有问题吗?

dedeke 发表于 2007-8-20 08:30 | 显示全部楼层

初始化的时候写三遍38

初始化的时候写三遍38,每个写都要检测液晶评是否为忙(我不知道延时可不可以)。好象时序也有点问题,我的是:你试试
        E = 0;
    _nop_();
    _nop_();
    P2 = i;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    E = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    E = 0;
 楼主| tc9148 发表于 2007-8-20 11:30 | 显示全部楼层

to ayb_ice:

事实确实是这样的,我也很郁闷。
 楼主| tc9148 发表于 2007-8-20 11:32 | 显示全部楼层

to dedeke

谢谢,我试试。
 楼主| tc9148 发表于 2007-8-20 11:35 | 显示全部楼层

汇编里面我没有用检测忙标志,我使用延时大概100uS的时间,(液晶手册上说40uS就可以),使能E端产生下降沿,汇编里是可行的。不知道在C里就有问题了?
dai_weis 发表于 2007-8-20 11:57 | 显示全部楼层

关闭优化看看

 楼主| tc9148 发表于 2007-8-21 12:42 | 显示全部楼层

!

自己再顶一下。
jesseli 发表于 2007-8-21 16:35 | 显示全部楼层

不知道你的液晶模组是那种INTERFACE呢?

是6800还是8080?

假如是6800,试试将子函数enable()和line_ch()修改如下:
void enable(uchar i)
{    
     delay_1(); //一般需要加入判忙函数,延时也是OK的
     RS=0;
     RW=0;
     E=0;          
     P2=i;
     E=1;
     E=0;
     
}

void line_ch()
{

     delay_1();   //一般需要加入判忙函数,延时也是OK的
     RS=1;
     RW=0;
     E=0;     
     P2=0x45;
     E=1; 
     E=0;          
     
     
}

goodluck~
eleclike 发表于 2007-8-21 21:47 | 显示全部楼层

延长延时试一试,(附我的完整程序,已经通过调试)

我用的是P2口读写数据口,P3.0--P3.2连接RS,RW,E.也没有使用查忙,而使用延时足够长的时间来满足写指令和数据.


#include <reg52.h>
#include "intrins.h"

#define nop _nop_()
#define PtData P2
#define  uint unsigned int
#define  uchar unsigned char
sbit RS=P3^0;
sbit RW=P3^1;
sbit E=P3^2;

void WriteInstr(uint);
void WriteData(uint);
void Delay(uint);

main()
{
nop;
P0=0;//调试时候用于观察,P0口共阳极LED亮
WriteInstr(0x01);//初始化
WriteInstr(0x02);
WriteInstr(0x06);
WriteInstr(0x0c);
WriteInstr(0x38);
WriteInstr(0x01);
    
Delay(30000);
P0^=0x01;//调试时候用于观察,P0.0口LED状态取反
while(1)
    {
    WriteInstr(0x81);//写第一行DDRAM
    WriteData(0x65);
    WriteData(0x6c);
    WriteData(0x65);
    WriteData(0x63);
    WriteData(0x6c);
    WriteData(0x69);
    WriteData(0x6b);
    WriteData(0x65);

    WriteInstr(0xc1);//写第二行DDRAM
    WriteData(0x31);
    WriteData(0x36);
    WriteData(0x30);
    WriteData(0x32);

    Delay(10000);    
    P0^=0x02;//调试时候用于观察一次循环,P0.1口LED状态取反
    }
}


//---写指令
void WriteInstr(uint Temp)
{
Delay(10);//晶振为6M时,延时0.272ms
RS=0;
RW=0;
E=0;
nop;
nop;
nop;
E=1;
nop;
PtData=Temp;
nop;
E=0;
}
//---写数据
void WriteData(uint Temp)
{
Delay(10);
RS=1;
RW=0;
E=0;
nop;
nop;
nop;
E=1;
nop;
PtData=Temp;
nop;
E=0;
}

//---延时
void Delay(uint N)
{uint i;
for(i=0;i<N;i++){}
}
戴栋宇 发表于 2007-8-23 11:55 | 显示全部楼层

应该是时序问题,你的程序里也没有检测是否忙的信号

不论是写控制字,还是写数据,都要检查是否忙
古道热肠 发表于 2007-8-23 14:33 | 显示全部楼层

eleclike 给的范例能用

   我用1602的液晶屏试了一下,可以用,希刻楼主能用仿真器单过程运行程序,全速运行不成功,但单过程时正常显示了内容。
 楼主| tc9148 发表于 2007-8-23 17:54 | 显示全部楼层

谢谢楼上的各位。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

137

主题

589

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部