打印

关于LCD显示的问题

[复制链接]
3142|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我写了一段关于1602LCD显示的程序,但是只能第一次正常显示(屏幕滚动显示一段字符),第二次之后就出现问题了,调试了N久都没找到问题在哪里,难道是初始化的问题,proteus里调试时候用的是lm016l这个芯片,真的是纠结啊!麻烦哪位大虾帮忙看看,帮我找找问题在哪里,非常感谢啊!!!!!!:'( 下面是写的程序:(附件是仿真图)


#include<at89x51.h>
#include<intrins.h>
#define nop _nop_()
#define DB P1
sbit E=P3^0;
sbit RW=P3^1;
sbit RS=P3^2;
void init(void);
void write_com(unsigned char command);
void write_data(unsigned char dat);
void disp_char(unsigned char x,unsigned char y,unsigned char dat);
void check_busy(void);
void delay_n40us(unsigned int n);
/*****************************************
*************初始化函数******************/
void init(void)
{
write_com(0x38);
delay_n40us(500);
write_com(0x38);
delay_n40us(500);
write_com(0x38);
write_com(0x0c);
write_com(0x01);
write_com(0x0f);
write_com(0x06);
write_com(0x01);
delay_n40us(100);
}
void write_com(unsigned char command)
{
DB=command;
RS=0;
RW=0;
E=1;
nop;
E=0;
delay_n40us(1);
}
void write_data(unsigned char dat)
{
DB=dat;
RS=1;
RW=0;
E=1;
nop;
E=0;
delay_n40us(1);
}
void disp_char(unsigned char x,unsigned char y,unsigned char dat)
{
unsigned char address;
if(y==1)address=0x80+x;
else address=0xc0+x;
write_com(address);
write_data(dat);
}
void check_busy(void)
{
do
{
  E=0;
  RS=0;
  RW=1;
  DB=0xff;
  E=1;
}while((DB&0x80)==0x80);
}
void delay_n40us(unsigned int n)
{
unsigned int i,j;
for(i=n;i>0;i--)
for(j=2;j>0;j--);
}

void main()
{
while(1)
{
  init();
  disp_char(0,1,'T');
  disp_char(1,1,'h');
  disp_char(2,1,'i');
  disp_char(3,1,'s');
  disp_char(4,1,' ');
  disp_char(5,1,'i');
  disp_char(6,1,'s');
  disp_char(7,1,' ');
  disp_char(8,1,'d');
  disp_char(9,1,'e');
  disp_char(10,1,'m');
  disp_char(11,1,'o');
  disp_char(12,1,' ');
  disp_char(13,1,'f');
  disp_char(14,1,'o');
  disp_char(15,1,'r');
  delay_n40us(1000000);
  delay_n40us(1000000);
  delay_n40us(1000000);
  write_com(0x07);
  write_com(0x02);

  disp_char(16,1,' ');
  delay_n40us(5000);
  disp_char(17,1,'5');
  delay_n40us(5000);
  disp_char(18,1,'1');
  delay_n40us(5000);
  disp_char(19,1,' ');
  delay_n40us(5000);
  disp_char(20,1,'c');
  delay_n40us(5000);
  disp_char(21,1,'o');
  delay_n40us(5000);
  disp_char(22,1,'n');
  delay_n40us(5000);
  disp_char(23,1,'t');
  delay_n40us(5000);
  disp_char(24,1,'r');
  delay_n40us(5000);
  disp_char(25,1,'o');
  delay_n40us(5000);
  disp_char(26,1,'l');
  delay_n40us(5000);
  disp_char(27,1,'l');
  delay_n40us(5000);
  disp_char(28,1,'i');
  delay_n40us(5000);
  disp_char(29,1,'n');
  delay_n40us(5000);
  disp_char(30,1,'g');
  delay_n40us(5000);
  disp_char(31,1,' ');
  delay_n40us(5000);
  disp_char(32,1,'1');
  delay_n40us(5000);
  disp_char(33,1,'6');
  delay_n40us(5000);
  disp_char(34,1,'0');
  delay_n40us(5000);
  disp_char(35,1,'2');
  delay_n40us(5000);
  disp_char(36,1,'L');
  delay_n40us(5000);
  disp_char(37,1,'C');
  delay_n40us(5000);
  disp_char(38,1,'D');
  delay_n40us(5000);   
  disp_char(39,1,'!');
  delay_n40us(5000);
  delay_n40us(100000);
   }
}

未命名.jpg (1.65 MB )

未命名.jpg

相关帖子

沙发
scutpeng|  楼主 | 2010-5-6 09:56 | 只看该作者
弄了好几天了没个结果,郁闷啊!请大虾们帮帮忙啊!

使用特权

评论回复
板凳
大众牌BF| | 2010-5-6 10:12 | 只看该作者
无符合整形(unsigned int)取值范围是0到65535 ~
程序最后一句“delay_n40us(100000);”~
void delay_n40us(unsigned int n)
形参定义为unsigned int,这样不可以。

使用特权

评论回复
地板
大众牌BF| | 2010-5-6 10:15 | 只看该作者
delay_n40us(1000000);
  delay_n40us(1000000);
  delay_n40us(1000000);
也不对~~~

使用特权

评论回复
5
scutpeng|  楼主 | 2010-5-6 10:30 | 只看该作者
我把delay_n40ns(1000000)改为了delay_n40(10000)之后还是有些不正常,就是第二遍之后总是比第一遍工作的时候闪的快了,第一个字母T总是看不到就过去了,无论怎么延时都没用。

使用特权

评论回复
6
scutpeng|  楼主 | 2010-5-6 10:31 | 只看该作者
循环而已,照道理看到的现象应该是一样的啊,为什么会有点不同呢

使用特权

评论回复
7
大众牌BF| | 2010-5-6 10:52 | 只看该作者
#include<at89x51.h>
#include<intrins.h>
#define nop _nop_()
#define DB P1
sbit E=P3^0;
sbit RW=P3^1;
sbit RS=P3^2;
void init(void);
void write_com(unsigned char command);
void write_data(unsigned char dat);
void disp_char(unsigned char x,unsigned char y,unsigned char dat);
void check_busy(void);
void delay_n40us(unsigned int n);
/*****************************************
*************初始化函数******************/
void init(void)
{
write_com(0x38);
delay_n40us(500);
write_com(0x38);
delay_n40us(500);
write_com(0x38);
write_com(0x0c);
write_com(0x01);
write_com(0x0f);
write_com(0x06);
write_com(0x01);
delay_n40us(100);
}
void write_com(unsigned char command)
{
DB=command;
RS=0;
RW=0;
E=1;
nop;
E=0;
delay_n40us(1);
}
void write_data(unsigned char dat)
{
DB=dat;
RS=1;
RW=0;
E=1;
nop;
E=0;
delay_n40us(1);
}
void disp_char(unsigned char x,unsigned char y,unsigned char dat)
{
unsigned char address;
if(y==1)address=0x80+x;
else address=0xc0+x;
write_com(address);
write_data(dat);
}
void check_busy(void)
{
do
{
  E=0;
  RS=0;
  RW=1;
  DB=0xff;
  E=1;
}while((DB&0x80)==0x80);
}
void delay_n40us(unsigned int n)
{
unsigned int i,j;
for(i=n;i>0;i--)
for(j=2;j>0;j--);
}

void main()
{  init();
while(1)
{
  
  disp_char(0,1,'T');
// disp_char(0,1,'T');
  disp_char(1,1,'h');
  disp_char(2,1,'i');
  disp_char(3,1,'s');
  disp_char(4,1,' ');
  disp_char(5,1,'i');
  disp_char(6,1,'s');
  disp_char(7,1,' ');
  disp_char(8,1,'d');
  disp_char(9,1,'e');
  disp_char(10,1,'m');
  disp_char(11,1,'o');
  disp_char(12,1,' ');
  disp_char(13,1,'f');
  disp_char(14,1,'o');
  disp_char(15,1,'r');
  delay_n40us(10000);
  delay_n40us(10000);
  delay_n40us(10000);
  write_com(0x07);
  write_com(0x02);

  disp_char(16,1,' ');
  delay_n40us(5000);
  disp_char(17,1,'5');
  delay_n40us(5000);
  disp_char(18,1,'1');
  delay_n40us(5000);
  disp_char(19,1,' ');
  delay_n40us(5000);
  disp_char(20,1,'c');
  delay_n40us(5000);
  disp_char(21,1,'o');
  delay_n40us(5000);
  disp_char(22,1,'n');
  delay_n40us(5000);
  disp_char(23,1,'t');
  delay_n40us(5000);
  disp_char(24,1,'r');
  delay_n40us(5000);
  disp_char(25,1,'o');
  delay_n40us(5000);
  disp_char(26,1,'l');
  delay_n40us(5000);
  disp_char(27,1,'l');
  delay_n40us(5000);
  disp_char(28,1,'i');
  delay_n40us(5000);
  disp_char(29,1,'n');
  delay_n40us(5000);
  disp_char(30,1,'g');
  delay_n40us(5000);
  disp_char(31,1,' ');
  delay_n40us(5000);
  disp_char(32,1,'1');
  delay_n40us(5000);
  disp_char(33,1,'6');
  delay_n40us(5000);
  disp_char(34,1,'0');
  delay_n40us(5000);
  disp_char(35,1,'2');
  delay_n40us(5000);
  disp_char(36,1,'L');
  delay_n40us(5000);
  disp_char(37,1,'C');
  delay_n40us(5000);
  disp_char(38,1,'D');
  delay_n40us(5000);   
  disp_char(39,1,'!');
  delay_n40us(5000);
  delay_n40us(10000);
   }
}

使用特权

评论回复
8
大众牌BF| | 2010-5-6 10:53 | 只看该作者
init();
我把它从WHILE(1)里拿出来就可以啦~
具体还没搞清楚为什么~
你大几的??

使用特权

评论回复
9
大众牌BF| | 2010-5-6 10:59 | 只看该作者
你考虑一下为什么吧~
我有的时候调程序凭感觉,蒙对了也不求甚解~
知道答案了告诉我哈~~

使用特权

评论回复
10
scutpeng|  楼主 | 2010-5-6 11:03 | 只看该作者
恩,确实是。为什么不能再进行初始化呢?我是研一的了:)

使用特权

评论回复
11
scutpeng|  楼主 | 2010-5-6 11:06 | 只看该作者
delay_n40us(5000);   
  disp_char(39,1,'!');
  delay_n40us(5000);
  delay_n40us(10000);
   }
}


如果在延时指令delay_n40us(10000);前加一条清屏指令write_com(0x01);的话又会出现之前的问题。搞不懂为什么?

使用特权

评论回复
12
scutpeng|  楼主 | 2010-5-6 11:11 | 只看该作者
还有一个问题就是如果想让显示的字符超过40个的话怎么办?没办法滚动显示到大于40个以后的那些字符了  :'(

使用特权

评论回复
13
mohanwei| | 2010-5-6 11:13 | 只看该作者
霰弹枪编程风格……

使用特权

评论回复
14
mohanwei| | 2010-5-6 11:14 | 只看该作者
还有,把disp_char(32,1,'1');
改成disp_string("hello,world!");多好

使用特权

评论回复
15
大众牌BF| | 2010-5-6 11:19 | 只看该作者
呵呵~
我对这个研究不深啊~
我也想听听有没有高手可以回答这个问题~
做东西总是会碰上这种问题~
能解决这种问题的才是高手啊~

使用特权

评论回复
16
lxintian| | 2010-5-6 14:15 | 只看该作者
guan zhuing

使用特权

评论回复
17
scutpeng|  楼主 | 2010-5-6 15:19 | 只看该作者
终于找到一点问题的蛛丝马迹了,是写命令字和数据后延时不够的问题。。。延时时间设置得长一点可以解决  :victory:

使用特权

评论回复
18
大众牌BF| | 2010-5-6 16:37 | 只看该作者
哦~~呵呵~~
不用测忙就容易出现这种问题~~
我竟然没反应出来~
菜鸟就是菜鸟啊~

使用特权

评论回复
19
scutpeng|  楼主 | 2010-5-6 17:19 | 只看该作者
关键是测忙程序通不过,不知道为什么

使用特权

评论回复
20
勇者18| | 2010-5-6 18:56 | 只看该作者
1602 用实际的硬件 就可以了,很好调节的

使用特权

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

本版积分规则

0

主题

26

帖子

1

粉丝