我做了个LCD1602,但是不能显示,搞了一下午,也没看出来是什么原因!请高手帮忙看看!
下面是proteus 仿真图
[localimg=370,300]2[/localimg]
我的keil源程序如下:
#include <reg51.h>
#include <intrins.h>
#define nop() _nop_()
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL;
sbit rs = P3^5;
sbit rw = P3^6;
sbit ep = P3^7;
BYTE code dis1[] = {"www.stuelab.cn"};
BYTE code dis2[] = {"cao si yi"};
/*********************************************************
函数功能:延时子程序
入口参数:ms
出口参数:
*********************************************************/
void delay(BYTE ms)
{
BYTE i;
while(ms--)
{
for(i=0;i<250;i++)
{
nop();
nop();
nop();
nop();
}
}
}
/*************************************************************
函数功能:测试LCD忙碌状态
入口参数:
出口参数:result
*************************************************************/
BOOL lcd_bz()
{
BOOL result;
rs = 0;
rw =1;
ep = 1;
nop();
nop();
nop();
nop();
result = (BOOL)(P0&0x80);
ep = 0;
return result;
}
/************************************************************
函数功能:写指令数据到LCD
入口参数:cmd
出口参数:
************************************************************/
lcd_wcmd(BYTE cmd)
{
while(lcd_bz)
rs = 0;
rw = 0;
ep = 0;
nop();
nop();
P0 = cmd;
nop();
nop();
nop();
nop();
ep = 1;
nop();
nop();
nop();
nop();
ep = 0;
}
/**********************************************************
函数功能:设定显示位置
入口参数:pos
出口参数:
**********************************************************/
lcd_pos(BYTE pos)
{
lcd_wcmd(pos+0x80);
}
/***********************************************************
函数功能:写显示数据到LCD
入口参数:dat
出口参数:
***********************************************************/
lcd_wdat(BYTE dat)
{
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
nop();
nop();
nop();
nop();
ep = 1;
nop();
nop();
nop();
nop();
ep = 0;
}
/************************************************************
函数功能:LCD初始化
入口参数:
出口参数:
************************************************************/
lcd_initial()
{
lcd_wcmd(0x38);//显示模式设置
delay(1);
lcd_wcmd(0x0c);//显示开及光标设置
delay(1);
lcd_wcmd(0x06);//显示光标移动设置
delay(1);
lcd_wcmd(0x01);//清除LCD显示内容
delay(1);
}
/************************************************************
函数功能:主程序
入口参数:
出口参数:
************************************************************/
main()
{
BYTE i;
lcd_initial();
delay(10);
lcd_pos(0);
i=0;
while(dis1!='\0')
{
lcd_wdat(dis1);
i++;
}
lcd_pos(0x41);
i=0;
while(dis2!='\0')
{
lcd_wdat(dis2);
i++;
}
while(1);
}
1602.rar
(2008-07-29 16:52:20, Size: 38 KB, Downloads: 0)

Snap1.jpg

最新回复
lzl520f4 (2008-7-30 13:26:35)
天罡星lmy (2008-7-30 13:43:39)
wscsyyych (2008-7-30 18:15:51)
在此感谢上楼的lzl520f4和天罡星lmy的提醒!
但是还不知道为什么仿真的时候非得把测忙去掉才能正常显示??........
高日红123 (2008-8-01 15:15:41)
liaoguobao00 (2008-8-03 09:13:27)
你的程序之所以通不过,那是应为你的测忙程序写错了,它是在E的上升沿(不是下降沿,切记!!!!!)在D7上给出忙标志,这点和12864恰好相反,所以你照搬12864的测忙程序肯定通不过啦,你把测忙程序改成这样就对了
BOOL lcd_bz()
{
BOOL result;
rs = 0;
rw =1;
ep = 0;
nop();
nop();
nop();
nop();
result = (BOOL)(P0&0x80);
ep = 1;
return result;
}
wscsyyych (2008-8-03 10:34:19)
顺便说一下,我原来不能显示的原因已经找出来啦,其实在软件上仿真加上测忙程序是可以显示的!原来程序出错的地方如下:
/************************************************************
函数功能:写指令数据到LCD
入口参数:cmd
出口参数:
************************************************************/
lcd_wcmd(BYTE cmd)
{
while(lcd_bz)
rs = 0;
rw = 0;
ep = 0;
nop();
nop();
P0 = cmd;
nop();
nop();
nop();
nop();
ep = 1;
nop();
nop();
nop();
nop();
ep = 0;
}
这个子程序中的测忙指令 “ while(lcd_bz) ”应该改为 “while(lcd_bz()); ”才是对的,
顺便把主函数也改了下,仿真成功!
把能够成功仿真的源程序传上来,共享一下!
(2008-08-03 10:34:19, Size: 39.1 KB, Downloads: 7)
liuliya21c (2008-8-03 14:48:34)
这种错误可以在keil中单步调试中调试出来,或者keil和protues联调中跳出来的
lining (2008-8-03 15:50:13)
锅牛 (2008-8-09 15:28:59)
lzl520f4 (2008-8-11 13:09:16)
6楼的说得思路是没错的.你再仔细想一下.