打印

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

[复制链接]
1666|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函数的延时时间

使用特权

评论回复
5
hotpower| | 2007-8-19 21:20 | 只看该作者

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

没用过1602,别拍我~~~

使用特权

评论回复
6
tc9148|  楼主 | 2007-8-19 22:52 | 只看该作者

!

我自己再试试看。

使用特权

评论回复
7
ayb_ice| | 2007-8-20 07:54 | 只看该作者

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

使用特权

评论回复
8
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;

使用特权

评论回复
9
tc9148|  楼主 | 2007-8-20 11:30 | 只看该作者

to ayb_ice:

事实确实是这样的,我也很郁闷。

使用特权

评论回复
10
tc9148|  楼主 | 2007-8-20 11:32 | 只看该作者

to dedeke

谢谢,我试试。

使用特权

评论回复
11
tc9148|  楼主 | 2007-8-20 11:35 | 只看该作者

汇编里面我没有用检测忙标志,我使用延时大概100uS的时间,(液晶手册上说40uS就可以),使能E端产生下降沿,汇编里是可行的。不知道在C里就有问题了?

使用特权

评论回复
12
dai_weis| | 2007-8-20 11:57 | 只看该作者

关闭优化看看

使用特权

评论回复
13
tc9148|  楼主 | 2007-8-21 12:42 | 只看该作者

!

自己再顶一下。

使用特权

评论回复
14
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~

使用特权

评论回复
15
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++){}
}

使用特权

评论回复
16
戴栋宇| | 2007-8-23 11:55 | 只看该作者

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

不论是写控制字,还是写数据,都要检查是否忙

使用特权

评论回复
17
古道热肠| | 2007-8-23 14:33 | 只看该作者

eleclike 给的范例能用

   我用1602的液晶屏试了一下,可以用,希刻楼主能用仿真器单过程运行程序,全速运行不成功,但单过程时正常显示了内容。

使用特权

评论回复
18
tc9148|  楼主 | 2007-8-23 17:54 | 只看该作者

谢谢楼上的各位。

使用特权

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

本版积分规则

137

主题

589

帖子

1

粉丝