LCD与单片机的连接电路图和LCD显示程序/LCD测试程序3.2.5LCD显示电路液晶显示器简称LCD显示器,它是利用液晶经过处理后能改变光线的传输方向的特性来显示信息的。要使用点阵型LCD显示器,必须有相应的LCD控制器、驱动器来对LCD显示器进行扫描、驱动,以及一定空间的ROM和RAM来存储写入的命令和显示字符的点阵。现在往往将LCD控制器、驱动器、RAM、ROM和LCD显示器连接在一起,称为液晶显示模块。液晶显示模块是一种常见的人机界面,在单片机系统中的应用极其广泛。液晶显示模块既可以显示字符,又可以显示简单的图形。本系统采用的是1602的LCD接口。1602是一种点阵字符型液晶显示模块,可以显示两行共32个字符。根据LCD型号的不同,所需要的背光电阻大小会不同,可自行调节。本系统采用的LCD为RT-1602C,其主要引脚的功能如下:RS:数据/命令选择端,高电平时选择数据寄存器,低电平时选择指令寄存器。RW:读/写选择端,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时,可以写入指令或者显示地址;当RS为低电平、RW为高电平时,可以读忙信号;当RS为高电平、RW为低电平时,可以写入数据。E:使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。图3-9LCD显示电路LCD测试程序#includereg51.h/********IO引脚定义***********************************************************/sbitLCD_RS=P2^7;//定义引脚sbitLCD_RW=P2^6;sbitLCD_E=P2^5;/********宏定义***********************************************************/#defineLCD_DataP0#defineBusy0x80//用于检测LCD状态字中的Busy标识/********数据定义*************************************************************/unsignedcharcodeuctech[]={Happyeveryday};unsignedcharcodenet[]={};/********函数声明*************************************************************/voidWriteDataLCD(unsignedcharWDLCD);//写数据voidWriteCommandLCD(unsignedcharWCLCD,BuysC);//写命令unsignedcharReadDataLCD(void);//读数据unsignedcharReadStatusLCD(void);//读状态voidLCDInit(void);//初始化voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData);//相应坐标显示字节内容voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData);//相应坐标开始显示一串内容voidDelay5Ms(void);//延时voidDelay400Ms(void);//延时/***********主函数开始********************************************************/voidmain(void){Delay400Ms();//启动等待,等LCD讲入工作状态LCDInit();//初始化Delay5Ms();//延时片刻(可不要)DisplayListChar(0,0,uctech);DisplayListChar(1,5,net);ReadDataLCD();//测试用句无意义while(1);}/***********写数据********************************************************/voidWriteDataLCD(unsignedcharWDLCD){ReadStatusLCD();//检测忙LCD_Data=WDLCD;LCD_RS=1;LCD_RW=0;LCD_E=0;//若晶振速度太高可以在这后加小的延时LCD_E=0;//延时LCD_E=1;}/***********写指令********************************************************/voidWriteCommandLCD(unsignedcharWCLCD,BuysC)//BuysC为0时忽略忙检测{if(BuysC)ReadStatusLCD();//根据需要检测忙LCD_Data=WCLCD;LCD_RS=0;LCD_RW=0;LCD_E=0;LCD_E=0;LCD_E=1;}/***********读数据********************************************************/unsignedcharReadDataLCD(void){LCD_RS=1;LCD_RW=1;LCD_E=0;LCD_E=0;LCD_E=1;return(LCD_Data);}/***********读状态*******************************************************/unsignedcharReadStatusLCD(void){LCD_Data=0xFF;LCD_RS=0;LCD_RW=1;LCD_E=0;LCD_E=0;LCD_E=1;while(LCD_Data&Busy);//检测忙信号return(LCD_Data);}/***********初始化********************************************************/voidLCDInit(void){LCD_Data=0;WriteCommandLCD(0x38,0);//三次模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,1);//显示模式设置,开始要求每次检测忙信号WriteCommandLCD(0x08,1);//关闭显示WriteCommandLCD(0x01,1);//显示清屏WriteCommandLCD(0x06,1);//显示光标移动设置WriteCommandLCD(0x0C,1);//显示开及光标设置}/***********按指定位置显示一个字符*******************************************/voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData){Y&=0x1;X&=0xF;//限制X不能大于15,Y不能大于1if(Y)X|=0x40;//当要显示第二行时地址码+0x40;X|=0x80;//算出指令码WriteCommandLCD(X,0);//这里不检测忙信号,发送地址码WriteDataLCD(DData);}/***********按指定位置显示一串字符*****************************************/voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData){unsignedcharListLength;ListLength=0;Y&=0x1;X&=0xF;//限制X不能大于15,Y不能大于1while(DData[ListLength]=0x20){//若到达字串尾则退出if(X=0xF){//X坐标应小于0xFDisplayOneChar(X,Y,DData[ListLength]);//显示单个字符ListLength++;X++;}}}/***********短延时********************************************************/voidDelay5Ms(void){unsignedintTempCyc=5552;while(TempCyc--);}/***********长延时********************************************************/voidDelay400Ms(void){unsignedcharTempCycA=5;unsignedintTempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);}}LCD与单片机连接的引脚并不是固定的,如有不同只需要在程序里改一下引脚即可。