看看我的LCD咱跑不起来,正常情况是要显示A的,结果什么也不显示。
《非原创,是摘录书的》 #include< at89x51.h>
#include< intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define DATA_PORT P0
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
/*********************************************************************
funciton:delay
*********************************************************************/
void DELAYms(uint i)
{ while(--i);
}
/*********************************************************************
function:check busy
*********************************************************************/
void CHECK_BUSY()
{ DATA_PORT=0xFF;
RS=0;
RW=1;
_nop_();
EN=1;
_nop_();
_nop_();
while(DATA_PORT&0x80);
EN=0;
}
/*以下是向LCD写入命令IR
功能:向LCD写入命令字符CMD
若check=1,表示要进行忙状态检查*/
void WRITE_IR(uchar cmd,uchar check)
{ if(check)
CHECK_BUSY();
RS=0;
RW=0;
_nop_();
DATA_PORT=cmd;
_nop_();
EN=1;
_nop_();_nop_();
EN=0;
}
/*以下是写入DDR寄存器
功能:在当前光标处显示一个字符*/
void WRITE_DDR(char c)
{ CHECK_BUSY();
RS=1;
RW=0;
_nop_();
DATA_PORT=c;
_nop_();
EN=1;
_nop_();_nop_();
EN=0;
}
/*以下是定位光标
功能:光标定位*/
void LCD_POSITION(uchar xpos,uchar ypos)
{ uchar temp;
xpos=xpos&0x0f;//16**型液晶的范围是0--15
ypos=ypos&0x01;//16**型液晶的范围是0--1
temp=xpos;
if(ypos==1)
temp=temp|0xc0;//第二行
else
temp=temp|0x80;//第一行
WRITE_IR(temp,0);
}
/*以下是初使化函数
功能:向LCD模块写入控制参数*/
void LCD_INITIAL()
{ WRITE_IR(0x38,0);//功能指令设置,8位接口,2行,5*7字符
WRITE_IR(0x38,1);
WRITE_IR(0x08,1);//显示开关控制指令,显示关闭
WRITE_IR(0x01,1);//清屏指令,将DDRAM数据全部写入空白
WRITE_IR(0x06,1);//输入方式设置指令,字符不动,光标自动右移一格
WRITE_IR(0x0F,1);//显示开关控制指令,显示器开,光标开,光标闪烁
}
//以下是在指定行,指定列显示字符
void WRITE_CHAR(uchar xpos,uchar ypos,char c)
{ LCD_POSITION(xpos,ypos);
WRITE_DDR(c);
}
//************************************************************************
//************************************************************************
void main()
{ LCD_INITIAL();
DELAYms(6000);
while(1)
{ WRITE_CHAR(5,0,'A');
}
}
|