微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机驱动1602液晶的C程序

51单片机驱动1602液晶的C程序

时间:11-30 来源:互联网 点击:
# include

/*****************************************
电路连接

P1------DB0~DB7
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);//在某个屏幕位置上显示一

个字符,X(0-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//用了延时的方法,延时还是非常好用的。我试了一下,用//

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top