外设驱动库开发笔记33:LCD1602液晶显示屏驱动

LCD1602液晶显示屏驱动设计与实现详解
本文详细介绍了LCD1602字符型液晶显示屏的工作原理、功能概述以及驱动设计与实现。LCD1602使用RS、RW、EN三条控制线进行操作,通过初始化配置和指令码进行显示控制。驱动设计中,定义了LCD1602对象类型,包括属性和操作,并提供了对象初始化、读写数据等操作函数。应用实例展示了如何使用驱动在LCD1602上显示数据。

  LCD1602是一种工业字符型液晶,能够同时显示16x02即32个字符。LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,即可以显示出图形。在这一章我们就来讨论LCD1602液晶显示屏驱动的设计与实现。

1、功能概述

  LCD1602液晶又被称作1602字符型液晶,这是一种只用来显示字母、数字、符号等的点阵型液晶模块。LCD1602里面存储器一般有三种:CGROM、CGRAM、DDRAM。其中DDRAM(Display Data RAM)就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下如图所示:

  LCD1602使用三条控制线:EN、RW、RS。 其中EN的作用其实就是中线的功能,RW和RS指示了读、它写的是写的方向和内容。在读数据(或者Busy标志)期间,EN线必须保持高电平;而在写指令(或者数据)过程中,EN线上必须送出一个正脉冲。RW、RS的组合一共有四种情况,分别对应四种操作:
  (1)、RS=0、RW=0——表示向LCD写入指令。
  (2)、RS=0、RW=1——表示读取Busy标志。
  (3)、RS=1、RW=0——表示向LCD写入数据。
  (4)、RS=1、RW=1——表示从LCD读取数据。
  LCD1602利用指令码来区分不同的操作,主要的有两类:一是用于初始化配置的指令码;二是用于数据控制的指令码。第一类用于LCD初始化配置的指令码基本上都是在系统启动时,用于对LCD1602的一次性配置。而第二类数据操作的指令码主要用于设置数据指针的位置,现实信息的实现与清楚等。这两类指令码从使用上并无太大区别,后续我们将详细说明。

2、驱动设计与实现

  我们已经了解了LCD1602的基本情况,接下来我们将给予对LCD1602的基本了解设计LCD602的驱动程序。

2.1、对象定义

  在使用一个对象之前我们需要获得一个对象。同样的我们想要LCD1602液晶显示屏就需要先定义LCD1602液晶显示屏的对象。

2.1.1、对象的抽象

  我们要得到LCD1602液晶显示屏对象,需要先分析其基本特性。一般来说,一个对象至少包含两方面的特性:属性与操作。接下来我们就来从这两个方面思考一下LCD1602液晶显示屏的对象。
  先来考虑属性,作为属性肯定是用于标识或记录对象特征的东西。我们来考虑LCD1602液晶显示屏对象属性。对于LCD1602显示屏,它主要的功能就是显示信息,为了标识当前的状态,我们将状态寄存器的值作为对象的属性。
  接着我们还需要考虑LCD1602液晶显示屏对象的操作问题。首先我们需要控制LCD1602的3个控制引脚以实现对LCD1602的控制,但这些控制引脚的操作都与具体的操作平台相关,所以我们将其作为对象的操作来实现。同样的我们还需要向LCD1602发送命令和数据以及从LCD1602获取消息,而读取和发送都是依赖于具体的操作平台的所以我们将其作为LCD1602的两个操作。我们对LCD1602进行操作,免不了要进行时序控制,所以我们需要有延时操作,但我们都明白演示操作依赖于具体的软硬件平台,所以我们将延时处理函数也作为对象的操作。
  根据上述我们对LCD1602液晶显示屏的分析,我们可以定义LCD1602液晶显示屏的对象类型如下:

/* 定义LCD1602的对象类型 */
typedef struct LCD1602Object {
   
   
  uint8_t status;
  LCD1602PinSetType *PinHandle;
  void(*SendByte)(uint8_t data);
  uint8_t(*GetByte)(void);
  void (*Delayus)(volatile uint32_t period);    //微秒延时函数
  void (*Delayms)(volatile uint32_t nTime);     //毫秒秒延时函数
}LCD1602ObjectType;

2.1.2、对象初始化

  我们知道,一个对象仅作声明是不能使用的,我们需要先对其进行初始化,所以这里我们来考虑LCD1602液晶显示屏对象的初始化函数。一般来说,初始化函数需要处理几个方面的问题。一是检查输入参数是否合理;二是为对象的属性赋初值;三是对对象作必要的初始化配置。据此我们设计LCD1602液晶显示屏对象的初始化函数如下:

/*对显示屏作初始化配置*/
void LCD1602Initialization(LCD1602ObjectType *lcd,              //LCD1602对象指针
                           LCD1602PinSetType *PinHandle,         //控制引脚操作函数指针数组
                           LCD1602SendByteType sendByte,        //发送一个字节函数指针
                           LCD1602GetByteType getByte,          //读取一个字节函数指针
                           LCD1602DelayType delayus,            //微秒延时函数指针
                           LCD1602DelayType delayms             //毫秒延时函数指针
                             )
{
   
   
  if((lcd==NULL)||(PinHandle==NULL)||(sendByte==NULL)||(getByte==NULL)||(delayus==NULL)||(delayms==NULL))
  {
   
   
    return;
  }
  
  lcd->PinHandle=PinHandle;
  lcd
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值