关于LCD显示的问题

[复制链接]
4389|21
 楼主| scutpeng 发表于 2010-5-6 09:48 | 显示全部楼层 |阅读模式
我写了一段关于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);
   }
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 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);
也不对~~~
 楼主| scutpeng 发表于 2010-5-6 10:30 | 显示全部楼层
我把delay_n40ns(1000000)改为了delay_n40(10000)之后还是有些不正常,就是第二遍之后总是比第一遍工作的时候闪的快了,第一个字母T总是看不到就过去了,无论怎么延时都没用。
 楼主| scutpeng 发表于 2010-5-6 10:31 | 显示全部楼层
循环而已,照道理看到的现象应该是一样的啊,为什么会有点不同呢
大众牌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);
   }
}
大众牌BF 发表于 2010-5-6 10:53 | 显示全部楼层
init();
我把它从WHILE(1)里拿出来就可以啦~
具体还没搞清楚为什么~
你大几的??
大众牌BF 发表于 2010-5-6 10:59 | 显示全部楼层
你考虑一下为什么吧~
我有的时候调程序凭感觉,蒙对了也不求甚解~
知道答案了告诉我哈~~
 楼主| scutpeng 发表于 2010-5-6 11:03 | 显示全部楼层
恩,确实是。为什么不能再进行初始化呢?我是研一的了:)
 楼主| 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);的话又会出现之前的问题。搞不懂为什么?
 楼主| scutpeng 发表于 2010-5-6 11:11 | 显示全部楼层
还有一个问题就是如果想让显示的字符超过40个的话怎么办?没办法滚动显示到大于40个以后的那些字符了  :'(
mohanwei 发表于 2010-5-6 11:13 | 显示全部楼层
霰弹枪编程风格……
mohanwei 发表于 2010-5-6 11:14 | 显示全部楼层
还有,把disp_char(32,1,'1');
改成disp_string("hello,world!");多好
大众牌BF 发表于 2010-5-6 11:19 | 显示全部楼层
呵呵~
我对这个研究不深啊~
我也想听听有没有高手可以回答这个问题~
做东西总是会碰上这种问题~
能解决这种问题的才是高手啊~
lxintian 发表于 2010-5-6 14:15 | 显示全部楼层
guan zhuing
 楼主| scutpeng 发表于 2010-5-6 15:19 | 显示全部楼层
终于找到一点问题的蛛丝马迹了,是写命令字和数据后延时不够的问题。。。延时时间设置得长一点可以解决  :victory:
大众牌BF 发表于 2010-5-6 16:37 | 显示全部楼层
哦~~呵呵~~
不用测忙就容易出现这种问题~~
我竟然没反应出来~
菜鸟就是菜鸟啊~
 楼主| scutpeng 发表于 2010-5-6 17:19 | 显示全部楼层
关键是测忙程序通不过,不知道为什么
勇者18 发表于 2010-5-6 18:56 | 显示全部楼层
1602 用实际的硬件 就可以了,很好调节的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

26

帖子

1

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