LCD与单片机的连接电路图和LCD显示程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LCD与单片机的连接电路图和LCD显示程序/LCD测试程序
3.2.5 LCD显示电路
液晶显示器简称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-9 LCD显示电路
LCD测试程序
#include
/********IO引脚定义***********************************************************/
sbit LCD_RS=P2^7;//定义引脚
sbit LCD_RW=P2^6;
sbit LCD_E=P2^5;
/********宏定义***********************************************************/
#define LCD_Data P0
#define Busy 0x80 //用于检测LCD状态字中的Busy标识
/********数据定义*************************************************************/ unsigned char code uctech[] = {"Happy every day"};
unsigned char code net[] = {""};
/********函数声明*************************************************************/
void WriteDataLCD(unsigned char WDLCD); //写数据
void WriteCommandLCD(unsigned char WCLCD,BuysC); //写命令
unsigned char ReadDataLCD(void); //读数据
unsigned char ReadStatusLCD(void); //读状态
void LCDInit(void); //初始化
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
//相应坐标显示字节内容
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
//相应坐标开始显示一串内容
void Delay5Ms(void); //延时
void Delay400Ms(void); //延时
/***********主函数开始********************************************************/
void main(void)
{
Delay400Ms(); //启动等待,等LCD讲入工作状态
LCDInit(); //初始化
Delay5Ms(); //延时片刻(可不要)
DisplayListChar(0, 0, uctech);
DisplayListChar(1, 5, net);
ReadDataLCD(); //测试用句无意义
while(1);
}
/***********写数据********************************************************/ void WriteDataLCD(unsigned char WDLCD)
{
ReadStatusLCD(); //检测忙
LCD_Data = WDLCD;
LCD_RS = 1;
LCD_RW = 0;
LCD_E = 0; //若晶振速度太高可以在这后加小的延时
LCD_E = 0; //延时
LCD_E = 1;
}
/***********写指令********************************************************/ void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCD(); //根据需要检测忙
LCD_Data = WCLCD;
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 0;
LCD_E = 0;
LCD_E = 1;
}
/***********读数据********************************************************/ unsigned char ReadDataLCD(void)
{
LCD_RS = 1;
LCD_RW = 1;
LCD_E = 0;
LCD_E = 0;
LCD_E = 1;
return(LCD_Data);
}
/***********读状态*******************************************************/ unsigned char ReadStatusLCD(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);
}
/***********初始化********************************************************/ void LCDInit(void)
{
LCD_Data = 0;
WriteCommandLCD(0x38,0); //三次模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCD(0x38,0);
Delay5Ms();
WriteCommandLCD(0x38,0);
Delay5Ms();
WriteCommandLCD(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCD(0x08,1); //关闭显示