LCD与单片机的连接电路图和LCD显示程序.docx
《LCD与单片机的连接电路图和LCD显示程序.docx》由会员分享,可在线阅读,更多相关《LCD与单片机的连接电路图和LCD显示程序.docx(8页珍藏版)》请在冰豆网上搜索。
LCD与单片机的连接电路图和LCD显示程序
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测试程序
#include<>
/********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不能大于1
if(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不能大于1
while(DData[ListLength]>=0x20){//若到达字串尾则退出
if(X<=0xF){//X坐标应小于0xF
DisplayOneChar(X,Y,DData[ListLength]);//显示单个字符
ListLength++;
X++;
}
}
}
/***********短延时********************************************************/
voidDelay5Ms(void)
{
unsignedintTempCyc=5552;
while(TempCyc--);
}
/***********长延时********************************************************/
voidDelay400Ms(void)
{
unsignedcharTempCycA=5;
unsignedintTempCycB;
while(TempCycA--){
TempCycB=7269;
while(TempCycB--);
}
}
LCD与单片机连接的引脚并不是固定的,如有不同只需要在程序里改一下引脚即可。