看看我的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');
}
}
|