LCD1602程序错在哪?求助
/************************************************************************** 功能:在LCD第一行显示hello world *
* *
* P0口接DB0——DB7 P1.0——RS P1.2——RW P2.5——E *
* *
*************************************************************************/
/*************************************** my1602.h *********************************************************/
#define dataline P0 //使用P0作为数据线
sbit RS = P1^0;
sbit RW = P1^1;
sbit E = P2^5;
bit isBuzy(); //测试是否繁忙
void LCD_init(); //LCD初始化
void delay(unsigned char ms); //延时x ms
void sendCMD(unsigned char cmd); //发送指令
void setPos(unsigned char pos); //设置光标显示的位置
void sendData(unsigned char Data); //发送数据
/************************************* my1602.c ************************************************************/
#include <reg52.h>
#include <intrins.h>
#include "my1602.h"
void LCD_init()
{
delay(15); //延时15ms
sendCMD(0x38); //设置为16 * 2显示, 5 * 7点阵,8位数据口
while(1);
delay(5);
sendCMD(0x38);
delay(5);
sendCMD(0x38);
delay(5);
sendCMD(0x38);
sendCMD(0x08); //显示关闭
sendCMD(0x01); //显示清屏
sendCMD(0x06); //显示光标移动设置
delay(5);
sendCMD(0x0c); //显示开,光标关
}
/*****************************************************
* 延时 x ms *
*****************************************************/
void delay(unsigned char ms)
{
unsigned char i;
for(ms; ms > 0; ms--)
{
for(i = 250; i > 0; i--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/**********************************************************
* 测试是否处于繁忙 *
**********************************************************/
bit isBuzy()
{
bit result;
E = 0;
RS = 0;
RW = 1;
_nop_(); //给LCD反应时间
E = 1;
_nop_(); //E的周期要达到一定值
result = (bit)(dataline & 0x80); //读取端口
return result;
}
/**********************************************************
* 发送命令函数 *
**********************************************************/
void sendCMD(unsigned char cmd)
{
E = 0;
while(isBuzy()); //等待LCD空闲
RS = 0;
RW = 0;
dataline = cmd; //发送指令
_nop_(); //给LCD芯片反应时间
E = 1;
_nop_(); //使E信号周期达到一定值
E = 0;
}
/******************************************************
* 设置光标位置函数 只能正确显示第一行 *
******************************************************/
void setPos(unsigned char pos)
{
sendCMD(pos | 0x80); //发送指令
}
/*****************************************************
* 写入数据函数 *
*****************************************************/
void sendData(unsigned char Data)
{
E = 0;
while(isBuzy() == 1); //等待LCD空闲
RS = 1;
RW = 0;
_nop_(); //给LCD芯片反应时间
E = 1;
dataline = Data;
_nop_(); //使E信号周期达到一定值
E = 0;
}
/******************************************** main.c ***************************************************/
#include <reg52.h>
#include "my1602.h"
sbit DU = P2^6;
sbit WE = P2^7;
void closeLED() //关闭用于数码管的锁存器
{
DU = 0;
WE = 0;
}
void main()
{
unsigned char i;
char *disp = "hello world!"; //定义要显示的字符串
closeLED(); //关闭锁存器
LCD_init(); //初始化
setPos(0x02); //第一行第三个字符开始显示
i = 0;
while(disp[i] != '\0')
{
sendData(disp[i]);
delay(5);
i++;
}
while(1);
}
// 下载到芯片后什么都没有显示, 附件有芯片手册