自制单片机之五(1)……LCD1602的驱动

发布者:BeaLaity0170最新更新时间:2016-09-05 来源: eefocus关键字:LCD1602  驱动  单片机 手机看文章 扫描二维码
随时随地手机看文章

LCD1602已很普遍了,具体介绍我就不多说了,市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,定义如下表所示:

                                 字符型LCD的引脚定义

5.自制单片机之五(1)……LCD1602的驱动 - 哥只是传说 - 我只是一个传说


HD44780内置了DDRAM、CGROM和CGRAM。

DDRAM就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下表:

5.自制单片机之五(1)……LCD1602的驱动 - 哥只是传说 - 我只是一个传说


也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码就行了。但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。第二行也一样用前16个地址。对应如下:
                         DDRAM地址与显示位置的对应关系

5.自制单片机之五(1)……LCD1602的驱动 - 哥只是传说 - 我只是一个传说

我们知道文本文件中每一个字符都是用一个字节的代码记录的。一个汉字是用两个字节的代码记录。在PC上我们只要打开文本文件就能在屏幕上看到对应的字符是因为在操作系统里和BIOS里都固化有字符字模。什么是字模?就代表了是在点阵屏幕上点亮和熄灭的信息数据。例如“A”

字的字模:
           01110     ○■■■○
           10001     ■○○○■
           10001     ■○○○■
           10001     ■○○○■
           11111     ■■■■■
           10001     ■○○○■
           10001     ■○○○■
上图左边的数据就是字模数据,右边就是将左边数据用“○”代表0,用“■”代表1。看出是个“A”字了吗?在文本文件中“A”字的代码是41H,PC收到41H的代码后就去字模文件中将代表A字的这一组数据送到显卡去点亮屏幕上相应的点,你就看到“A”这个字了。
刚才我说了想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码41H就行了,可41H这一个字节的代码如何才能让LCD模块在屏幕的阵点上显示“A”字呢?同样,在LCD模块上也固化了字模存储器,这就是CGROM和CGRAM。HD44780内置了192个常用字符的字模,存于字符产生器CGROM(Character Generator ROM)中,另外还有8个允许用户自定义的字符产生RAM,称为CGRAM(Character Generator RAM)。下图说明了CGROM和CGRAM与字符的对应关系。

5.自制单片机之五(1)……LCD1602的驱动 - 哥只是传说 - 我只是一个传说

从上图可以看出,“A”字的对应上面高位代码为0100,对应左边低位代码为0001,合起来就是01000001,也就是41H。可见它的代码与我们PC中的字符代码是基本一致的。因此我们在向DDRAM写C51字符代码程序时甚至可以直接用P1='A'这样的方法。PC在编译时就把“A”先转为41H代码了。
字符代码0x00~0x0F为用户自定义的字符图形RAM(对于5X8点阵的字符,可以存放8组,5X10点阵的字符,存放4组),就是CGRAM了。后面我会详细说的。
0x20~0x7F为标准的ASCII码,0xA0~0xFF为日文字符和希腊文字符,其余字符码(0x10~0x1F及0x80~0x9F)没有定义。

那么如何对DDRAM的内容和地址进行具体操作呢,下面先说说HD44780的指令集及其设置说明,请浏览该指令集,并找出对DDRAM的内容和地址进行操作的指令。

共11条指令:

1.清屏指令

5.自制单片机之五(1)……LCD1602的驱动 - 哥只是传说 - 我只是一个传说


功能:<1> 清除液晶显示器,即将DDRAM的内容全部填入"空白"的ASCII码20H;
               <2> 光标归位,即将光标撤回液晶显示屏的左上方;
               <3> 将地址计数器(AC)的值设为0。

2.光标归位指令

5.自制单片机之五(1)……LCD1602的驱动 - 哥只是传说 - 我只是一个传说

功能:<1> 把光标撤回到显示器的左上方;
                <2> 把地址计数器(AC)的值设置为0;
                <3> 保持DDRAM的内容不变。


3.进入模式设置指令

5.自制单片机之五(1)……LCD1602的驱动 - 哥只是传说 - 我只是一个传说

功能:设定每次定入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。参数设定的
                情况如下所示:
                位名              设置
                I/D               0=写入新数据后光标左移                  1=写入新数据后光标右移
                S                 0=写入新数据后显示屏不移动              1=写入新数据后显示屏整体右移1个字符


4.显示开关控制指令

5.自制单片机之五(1)……LCD1602的驱动 - 哥只是传说 - 我只是一个传说

功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下:
                位名              设置
                 D                0=显示功能关               1=显示功能开
                 C                0=无光标                   1=有光标
                 B                0=光标闪烁                 1=光标不闪烁


5.设定显示屏或光标移动方向指令

5.自制单片机之五(1)……LCD1602的驱动 - 哥只是传说 - 我只是一个传说

功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下:
                S/C               R/L                设定情况
                0                 0                  光标左移1格,且AC值减1
                0                 1                  光标右移1格,且AC值加1
                1                 0                  显示器上字符全部左移一格,但光标不动
                1                 1                  显示器上字符全部右移一格,但光标不动


6.功能设定指令

5.自制单片机之五(1)……LCD1602的驱动 - 哥只是传说 - 我只是一个传说

功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下:
                位名              设置
                DL                0=数据总线为4位                  1=数据总线为8位
                N                 0=显示1行                        1=显示2行
                F                 0=5×7点阵/每字符                1=5×10点阵/每字符


7.设定CGRAM地址指令

5.自制单片机之五(1)……LCD1602的驱动 - 哥只是传说 - 我只是一个传说

功能:设定下一个要存入数据的CGRAM的地址。


8.设定DDRAM地址指令
5.自制单片机之五(1)……LCD1602的驱动 - 哥只是传说 - 我只是一个传说

功能:设定下一个要存入数据的CGRAM的地址。


9.读取忙信号或AC地址指令

5.自制单片机之五(1)……LCD1602的驱动 - 哥只是传说 - 我只是一个传说

功能:<1> 读取忙碌信号BF的内容,BF=1表示液晶显示器忙,暂时无法接收单片机送来的数据或指令;
                    当BF=0时,液晶显示器可以接收单片机送来的数据或指令;
                <2> 读取地址计数器(AC)的内容。


10.数据写入DDRAM或CGRAM指令一览

5.自制单片机之五(1)……LCD1602的驱动 - 哥只是传说 - 我只是一个传说

功能:<1> 将字符码写入DDRAM,以使液晶显示屏显示出相对应的字符;
                <2> 将使用者自己设计的图形存入CGRAM。

11.从CGRAM或DDRAM读出数据的指令一览

5.自制单片机之五(1)……LCD1602的驱动 - 哥只是传说 - 我只是一个传说

功能:读取DDRAM或CGRAM中的内容。


基本操作时序:

读状态           输入:RS=L,RW=H,E=H                                      输出:DB0~DB7=状态字
写指令           输入:RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码            输出:无
读数据           输入:RS=H,RW=H,E=H                                      输出:DB0~DB7=数据
写数据           输入:RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据              输出:无

看了那么多是不是有些晕?我也是啊,不过慢慢理解还是没问题的。
实际上面说了那么多具体怎么操作我还是没会啊?好!咱就简单点。
举个实例,就在LCD1602屏幕上第一行第一列显示个“A”字。
1.先初始化。(老大!好像上面没初始化这条指令啊!)
           先别拿东西扔我,说明书上是这么说的。也就先写入些指令。
//先定义接口
# include
/*****************************************
         P1------DB0~DB7           P2.0------RS
                              P2.1------RW
                              P2.2------E
*****************************************/
# define LCD_DB        P1
        sbit         LCD_RS=P2^0;
        sbit         LCD_RW=P2^1;
        sbit         LCD_E=P2^2;

/******定义函数****************/

# define uchar unsigned char
# define uint unsigned int
void LCD_init(void);//初始化函数
void LCD_write_command(uchar command);//写指令函数
void LCD_write_data(uchar dat);//写数据函数
void LCD_disp_char(uchar x,uchar y,uchar dat);//在某个屏幕位置上显示一个字符,X(0-16),y(1-2)
//void LCD_check_busy(void);//检查忙函数。我没用到此函数,因为通过率极低。
void delay_n40us(uint n);//延时函数
//********************************
//*******初始化函数***************
void LCD_init(void)
{
LCD_write_command(0x38);//设置8位格式,2行,5x7
LCD_write_command(0x0c);//整体显示,关光标,不闪烁
LCD_write_command(0x06);//设定输入方式,增量不移位
LCD_write_command(0x01);//清除屏幕显示
delay_n40us(100);//实践证明,我的LCD1602上,用for循环200次就能可靠完成清屏指令。
}
//********************************
//********写指令函数************
void LCD_write_command(uchar dat)
{
LCD_DB=dat;
LCD_RS=0;//指令
LCD_RW=0;//写入
LCD_E=1;//允许
LCD_E=0;
delay_n40us(1);//实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。
}
//*******************************
//********写数据函数*************
void LCD_write_data(uchar dat)
{
LCD_DB=dat;
LCD_RS=1;//数据
LCD_RW=0;//写入
LCD_E=1;//允许
LCD_E=0;
delay_n40us(1);
}
//********************************
//*******显示一个字符函数*********
void LCD_disp_char(uchar x,uchar y,uchar dat)
{
uchar address;
if(y==1)
         address=0x80+x;
else
         address=0xc0+x;
LCD_write_command(address);
LCD_write_data(dat);
}
//********************************
/*******检查忙函数*************
void LCD_check_busy()      //实践证明,在我的LCD1602上,检查忙指令通过率极低,以
{                                          //至于不能正常使用LCD。因此我没有再用检查忙函数。而使
do                                       //用了延时的方法,延时还是非常好用的。我试了一下,用
        { LCD_E=0;                   //for循环作延时,普通指令只要1次循就可完成。清屏指令
          LCD_RS=0;                 //要用200次循环便能完成。    
          LCD_RW=1;
          LCD_DB=0xff;
          LCD_E=1;
        }while(LCD_DB^7==1);


******************************/
//********延时函数***************
void delay_n40us(uint n)
{ uint i;
      uchar j;            
        for(i=n;i>0;i--)
           for(j=0;j<2;j++);          //在这个延时循环函数中我只做了2次循环,
}                                         //实践证明我的LCD1602上普通的指令只需1次循环就能可靠完成。
//*******************************

//*********主函数*****************
void main(void)
{
        LCD_init();
        LCD_disp_char(0,1,"A");
        while(1);
}

//*******************************

<版面有长度限制,见下一期>。。。

关键字:LCD1602  驱动  单片机 引用地址:自制单片机之五(1)……LCD1602的驱动

上一篇:数码管电路的制做与驱动
下一篇:自制单片机之五(2)……LCD1602的驱动

推荐阅读最新更新时间:2024-03-16 15:08

大功率RGB LED驱动器支持彩色照明设计
下一代建筑和装饰照明通过适当组合红、绿、蓝LED的输出能够获得更全面的色彩。在这种高亮度、多LED串联的应用中,典型导通压降可能达到22V至36V,吸收电流为1A至2A。图1所示LED驱动器能够为多个LED串联的模块提供2A的驱动电流,正向导通电压可以达到36V。该电路仅驱动RGB LED的一种颜色,驱动三种颜色需要三路这样的驱动器。由于LED产生的光强与其导通电流并非线性关系,选择通过PWM(而非LED电流幅度)控制亮度等级,每个LED由脉冲调制的固定电流控制灯光亮度。IC控制器利用平均电流模式提供LED驱动,需要最少的外部元件。    工作原理   为了高效提供电流驱动,LED驱动器采用连续导通模式(CCM)的boo
[电源管理]
大功率RGB LED<font color='red'>驱动</font>器支持彩色照明设计
PIC单片机人机接口模块元器件选择分析
   PIC单片机人机接口模块元器件选择说明:     (1)芯片引脚。   12~20根为PIC16C5X的双向可独立编程I/O口,每根I/O口都可由程序来编程决定其输入/输出方向。PIC16C5X有5种型号,如表1所示   表一 PIC16C5X管脚   PIC16C5X管脚图如图1所示 图1 PIC16C5X管脚图   各引脚的功能描述如表2所示   表2 各引脚的功能   (2)内部结构。   PIC16CSX在一个芯片上生成了一个8位算术逻辑单元ALU和工作寄存器W;384bit~2KB的12位程序存储器ROM;32~80个8行数据寄存器RAM;12~20个I/O
[单片机]
PIC<font color='red'>单片机</font>人机接口模块元器件选择分析
单片机小白学习之路(十二)---中断系统的理解
目标:中断系统的理解 1.中断简介 中断 中断:cpu在正常执行程序的过程中,计算机内部或外部发生了另一件事请求cpu迅速去处理,cpu暂停停止当前程序的运行,而转去处理所发生的事件,处理完就返回原来暂停的地方,继续执行原来的任务 随着计算机技术的应用,人们发现中断技术不仅解决了快速主机与慢速I/O设备的数据传送问题,而且还具有如下优点: ①分时操作。CPU可以分时为多个I/O设备服务,提高了计算机的利用率; ②实时响应。CPU能够及时处理应用系统的随机事件,系统的实时性大大增强; ③可靠性高。CPU具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高。 2.中断系统结构 系统构造 ①INT0(P3.2),
[单片机]
<font color='red'>单片机</font>小白学习之路(十二)---中断系统的理解
全球LED驱动IC新品创新技术分析[附图表]
前言 半导体照明 技术与产业的发展比人们预期快得多, LED光源 的某些特性是以往任何人造光源所无法比拟的,如色彩丰富、色饱和度高、光束集中、固态发光、响应速度快、 亮度 和颜色均可数字化、智能化、 网络 化控制与调节等等。这些新特性的广泛应用将改变人们传统照明的经验和习惯,引发照明理念和光文化的变革,推动照明产品向以人为本和更人性化的方向发展。 最重要的一点还是 LED照明 符合节能环保的大趋势,为此各国政府纷纷出台推动政策,美国能源部早在2000年就开始大力推动研发 固态照明 技术研究,支持了很多研发项目,取得了多项成就。可以说推行SSL计划在固态照明领域已经取得了相当大进展。中国科技部启动“ 十城万盏 ”半
[电源管理]
全球LED<font color='red'>驱动</font>IC新品创新技术分析[附图表]
pic单片机多路ad切换程序介绍
PIC单片机(Peripheral Interface Controller)是一种用来开发和控制外围设备的集成电路(IC)。一种具有分散作用(多任务)功能的CPU。与人类相比,大脑就是CPU,PIC 共享的部分相当于人的神经系统。PIC 单片机是一个小的计算机。PIC单片机有计算功能和记忆内存像CPU并由软件控制运行。然而,处理能力—般,存储器容量也很有限,这取决于PIC的类型。但是它们的最高操作频率大约都在20MHz左右,存储器容量用做写程序的大约1K—4K字节。时钟频率与扫描程序的时间和执行程序指令的时间有关系。但不能仅以时钟频率来判断程序处理能力,它还随处理装置的体系结构改变。如果是同样的体系结构,时钟频率较高的处理能力会
[单片机]
pic<font color='red'>单片机</font>多路ad切换程序介绍
IC卡设备驱动模块的代码
  面以我们采用的公用电话机通用的IC卡为例,通过已实现代码来说明整个IC卡设备驱动模块。   (1)数据结构的确定   编辑头文件ICDATA.H,确定在驱动模块程序中应用的公用数据结构。驱动模块的最终目的是读取和写入卡数据处理,所以规范整齐的数据结构是必须的。可以定义一个数据结构体来实现卡数据的存储区域、数据地址索引、控制标志位等,如:      这样在驱动模块中,只需要struct ICDATA iccdata;一条语句便可定义全部的卡处理数据结构定义;而ic_fops则定义了设备操作映射函数结构。从这个数据结构看,我们实现了IC卡设备的打开、读、写和监控函数。   (2)硬件接口控制线控制子函数   这些函
[单片机]
IC卡设备<font color='red'>驱动</font>模块的代码
如何学习单片机
经常有单片机爱好者问我们,如何学习单片机?学习单片机的步骤是什么? 我们初略总结了一下,单片机学习的过程基本上可分四个阶段: 第一阶段    是先浏览教科书里的硬件部分,大至了解单片机的硬件结构。如 ROM、RAM、地址、I/O口等,以及看一些厂家的MCU资料(Data Sheet),来加强MCU所提供各项资源的印象。 第二阶段    就是了解二进位数字、十六进位数和软件方面的内容。尽管有很多 高级语言可用于单片机的编程,但我觉得初学还是以汇编语言为好,更有利于和硬件结合,掌握硬件结构。知道汇编语言、机器语言、 指令、 程序等概念后,就从MOV指令开始,学习汇编语言和编程,在此如51的MCU汇编语言系统有 111条指令,简单又好理解
[单片机]
在进行单片机设计时需要注意哪些事项
1.降低外时钟频率 外时钟是高频的噪声源,除能引起对本应用系统的干扰之外,还可能产生对外界的干扰,以8051单片机为例最短指令周期1μs时,外时钟是12MHz。而同样速度的Motorola单片机系统时钟只需4MHz微控制器产生的最有影响的高频噪声大约是时钟频率的3倍。 2.低噪声系列单片机 改进的技术将电源、地安排在两个相邻的引脚上,外部去耦电容在PCB设计上更容易安排。 3.时钟监测电路、看门狗技术与低电压复位 时钟监控有效与省电指令STOP是一对矛盾。只能使用其中之一。 看门狗技术是监测应用程序中的一段定时中断低电压复位技术是监测单片机电源电压,当电压低于某一值时产生复位信号。由于单片机技术的发展,单片机本身对电源电压
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved