<meta name="keywords" content="必胜时时彩开户,keywords" /> 51单片机驱动1602液晶的C法式模范 联系我们

51单片机驱动1602液晶的C法式模范模范

# include<AT89x51.h>

 

/*****************************************
电路毗连 

 

P1------DB0DB7
P2.0------RS

 

P2.1------RW

 

P2.2------E

 

*****************************************/

 

# define LCD_DB   P1

 

sbit LCD_RS=P2^0;

 

sbit LCD_RW=P2^1;

 

sbit LCD_E=P2^2;

 

/******界说函数****************/

 

# define ucharunsigned char

 

# define uint unsigned int

 

void  LCD_init(void);//声明初始化函数

 

void  LCD_write_command(uchar command);//写指令函数

 

void  LCD_write_data(uchar dat);//写数据函数

 

void  LCD_disp_char(uchar x,uchar y,uchar dat);//在某个屏幕职位上显示一

 

个字符,X0-16),y(1-2)

 

//void  LCD_check_busy(void);//检查忙函数。我没用到此函数,由于经由历程率极

 

低。

 

void  delay_n40us(uint n);//延时函数

 

//********************************

 

//*******初始化函数***************

 

void  LCD_init(void)

 

{

 

LCD_write_command(0x38);//设置8位名堂,2行,5x7

 

LCD_write_command(0x0c);//所有显示,关光标,不闪灼

 

//LCD_write_command(0x06);//设定输入要领,增量不移位

 

//LCD_write_command(0x01);//扫除屏幕显示

 

delay_n40us(100);//现实证实,我的LCD1602上,用for 循环200 次便可以可靠

 

完成清屏指令。

 

}

 

//********************************

 

//********写指令函数***********设置先向1602写入的数据为地址*

 

void   LCD_write_command(uchar dat)

 

{

 

LCD_DB=dat;

 

LCD_RS=0;//指令

 

LCD_RW=0;//写入

 

LCD_E=1;//允许

 

LCD_E=0;//发生降低沿

 

delay_n40us(1);//现实证实,我的LCD1602 上,用for 循环1 次便可以完成浅易

 

写指令。

 

}

 

//*******************************

 

//********再写数据函数*****向1602中写入数据********

 

void   LCD_write_data(uchar dat)

 

{

 

LCD_DB=dat;

 

LCD_RS=1;//数据

 

LCD_RW=0;//写入

 

LCD_E=1;//允许

 

LCD_E=0;//发生降低沿

 

delay_n40us(1);

 

}

 

//********************************

 

//*******显示一个字符函数*********

 

void LCD_disp_char(uchar x,uchar y,uchar dat)

 

{

 

uchar address;

 

if(y==1)

 

address=0x80+x;

 

else

 

address=0xc0+x;

 

LCD_write_command(address);

 

LCD_write_data(dat);

 

}

 

//********************************

 

/*******检查忙函数*************

 

voidLCD_check_busy()       
 //
现实证实,在我的LCD1602 上,检查忙指令通

 

{LCD_E=0;                     //for 循环作延时,浅易指令只需1次循便可完成。清屏指令

 

LCD_RS=0;                  //要用200次循环便能完成。

 

LCD_RW=1;

 

LCD_DB=0xff;

 

LCD_E=1;

 

while(LCD_DB^7==1);

 

 

******************************/

 

//********延时函数***************

 

void delay_n40us(uint n)

 

{ uint i;

 

uchar j;

 

for(i=n;i>0;i--)

 

for(j=0;j<2;j++); //在这个延时循环函数中我只做了

 

2次循环,

 

} //现实证实我的LCD1602 上普

 

通的指令只需1次循环便可以可靠完成。

 

//*******************************

 

//*********主函数*****************

 

void main(void)

 

{

 

LCD_init();

 

LCD_disp_char(0,1,"A");

 

while(1);

 

}

过率极低,以至于不克不及正常应用LCD。因此我没有再用检查忙函数。而使

do//用了延时的措施,延时照样非常好用的。我试了一下,用//