### LCD12864驱动的关键知识点解析 #### 一、引言 在嵌入式系统开发中,LCD(Liquid Crystal Display)显示屏是常见的显示输出设备之一,特别适用于需要显示文字或简单图形的应用场景。本篇文章将围绕一个具体的LCD12864驱动程序进行深入分析,帮助读者理解其工作原理及实现细节。 #### 二、LCD12864基本概念 LCD12864是一种分辨率128x64像素的液晶显示屏,广泛应用于各种手持设备和小型电子产品中。它具有成本低、功耗小等特点,适合显示文本和简单的图形界面。 #### 三、硬件接口配置 根据所提供的部分代码,可以了解到LCD12864与微控制器之间的接口连接方式: - **CPU**: 采用89C51型号,时钟频率为12MHz。 - **控制信号线**: - RS (Register Select): P1.0 - R/W (Read/Write): P1.1 - E (Enable): P1.2 - CS1 (Chip Select 1): P1.3 - CS2 (Chip Select 2): P1.4 - **数据线**: DB0-DB7对应P0.0-P0.7。 - **复位**: 使用板载复位信号。 #### 四、软件实现细节 - **数据类型定义**: ```c #define uchar unsigned char #define uint unsigned int ``` 定义了`uchar`和`uint`两个宏,分别代表无符号字符型和无符号整型。 - **端口定义**: ```c #define DataPort P3 sbit RS = P2^0; sbit RW = P2^1; sbit E = P2^2; sbit CSL = P2^3; sbit CSR = P2^4; ``` 这里对LCD12864的数据端口及控制信号进行了定义。`DataPort`定义为P3端口,而控制信号如RS、RW等则分配给P2端口的不同位。 - **关键函数解析** 1. **忙检测**: ```c void BusyL(void); void BusyR(void); void CheckBusy(void); ``` 这些函数用于检测LCD是否处于忙碌状态。通过读取LCD的状态寄存器来判断是否可以发送指令或数据。`BusyL()`和`BusyR()`函数用于选择不同的页面进行忙检测。 2. **延时函数**: ```c void Delay(uint MS); ``` 延时函数用于提供必要的等待时间,确保数据传输正确完成。 3. **位置设置**: ```c void Locatexy(void); ``` 该函数用于设置显示的行和列地址,即屏幕上的显示位置。 4. **写命令和数据**: ```c void WriteCommandL(uchar CommandByte); void WriteCommandR(uchar CommandByte); uchar ReadData(void); void WriteData(uchar DataByte); ``` 这些函数分别用于向LCD发送命令或数据。`WriteCommandL`和`WriteCommandR`用于选择不同页面后发送命令;`ReadData`用于从LCD读取数据;`WriteData`用于向LCD发送数据。 5. **初始化和清除屏幕**: ```c void LcmClear(void); void LcmInit(void); ``` `LcmInit`用于初始化LCD12864,包括设置初始参数等;`LcmClear`用于清除LCD屏幕内容。 6. **显示图像和字符**: ```c void LcmPutBMP(uchar *puts); void LcmPutHZ_12(uchar x, uchar y, uchar HZcode); uchar *uchartostr(unsigned char unm); void LcmPutAsc(uchar asc); void LcmPutstr(uchar row, uchar y, uchar *str); void LcmPutpoint(uchar ro, uchar lie, uchar colour); ``` 这些函数实现了向LCD发送图像、字符等功能。例如`LcmPutBMP`用于显示位图图像;`LcmPutHZ_12`用于显示12×12点阵汉字;`uchartostr`将数值转换为字符串形式;`LcmPutAsc`显示ASCII字符;`LcmPutstr`用于显示字符串;`LcmPutpoint`用于显示单个像素点。 #### 五、总结 通过上述分析可以看出,LCD12864驱动程序主要涉及到硬件接口配置、基本操作命令、显示功能实现等方面。掌握这些核心内容对于开发基于LCD12864的应用非常重要。同时,通过具体的代码示例能够更好地理解各个功能模块的具体实现细节,有助于提高实际项目开发中的效率和质量。
//**********************************************************
//连线表: CPU=89C51 SysClock=12MHz *
//RS=P1.0 R/W=P1.1 E=P1.2 CS1=P1.3 CS2=P1.4 *
//DB0-DB7=P0.0-P0.7 /Reset=InBoard *
//**********************************************************
#include <reg52.h>
#include <stdlib.h>
#include <intrins.h>
#include <stdio.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
/********************引脚定义********************/
#define DataPort P3 //LCD128*64 I/O 信号管脚
sbit RS =P2^0; //数据指令
sbit RW =P2^1; //读写
sbit E =P2^2; //使能
sbit CSL =P2^3; //左片选
sbit CSR =P2^4; //右片选
uchar Page; //页 地址
uchar Col; //列 地址
uchar code BMP1[]; //一幅图
uchar code HZK_12[]; //12×12阵点字模
uchar code ASC_5x7[]; //5×7阵点字模
uchar str[4];
/********************函数定义*******************/
void BusyL(void); //左屏检测忙
void BusyR(void); //右屏检测忙
void Delay(uint MS); //延时
void Locatexy(void); //将屏幕横向0-12纵向0-7转换成左、右屏的的X、Y
void WriteCommandL( uchar CommandByte ); //向左屏写入指令
void WriteCommandR( uchar CommandByte ); //向右屏写入指令
uchar ReadData( void ); //读数据
void WriteData( uchar DataByte ); //写数据
void LcmClear( void ); //清屏
void LcmInit( void ); //初始化
void LcmPutBMP( uchar *puts ); //显示一幅图
void LcmReverseBMP( void ); //将整屏反显
void LcmPutHZ_12( uchar x,uchar y,uchar HZcode ); //在屏幕上任意点显示一个12×12汉字
uchar * uchartostr(unsigned char unm); //将值转成字符串
void LcmPutAsc( uchar asc ); //显示一个5×7的ASC字符
void LcmPutstr( uchar row,uchar y,uchar * str ); //在设定位置显示字符串
void LcmPutpoint( uchar ro,uchar lie,uchar colour ); //在设定位置显示一个点
/***************************/
/*检查Busy */
/***************************/
void BusyL(void)
{
CSL= 1;
CSR= 0;
CheckBusy();
}
void BusyR(void)
{
CSL= 0;
CSR= 1;
剩余21页未读,继续阅读
- 粉丝: 0
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助