1、,LCD,LCM 介绍,LCM1602,LCM1602 编程步骤,8.1,8.2,8.3,第八章 LCD 编程,自定义字符 及其 显示方法,8.4,(,),8.1 LCD,LCM 介绍,1、什么是 LCD、LCM,2、LCD模块 分类,LCD:Liquid Crystal Display,液晶显示器,背光:,液晶是一种介于固态与液态之间的物质,本身不能发光,需要借助额外的光源才行。在液晶显示屏背面,需要有背光。,LCM:Liquid Crystal Display Module,LCD模块,1、什么是 LCD、LCM:,严格地说,1602,12864都应该称为 LCD模块,2、LCD模块 分类
2、:,段码型,点阵型,段码型显示的产品:例如计算器、电子表,字符点阵型,图形点阵型,字符点阵型的产品:例如LCM1602,图形点阵型的产品:例如LCM12864,段码液晶叫法起源于早期液晶显示屏开始应用之时,主要是替代LED数码管(由7个笔段组成,仅能显示数字09), 产品如计算器、电子表等,显示内容均为数字,也较简单。,段码型:,段码式液晶,最普遍的,类似数码管的“8”字段,一个“8”字由7个笔段组成,也就是7个液晶像素。只能这7个笔段显示,或不显示。,“米”字型 段式液晶的“8”字由15个像素组成。,当然段式液晶的笔段可以做成任意形状,只要驱动芯片的驱动能力许可。比如公司的logo,其它图案
3、,文字等等。段式液晶材料制作,价格低廉。段式液晶的驱动成本也很低廉,字符点阵型 和 图形点阵型产品 的区别:,(i)字符点阵型 :,(ii)图形点阵型 :,字符点阵型 和 图形点阵型产品 的区别:,(i)字符点阵型:整个屏虽然是由点阵构成。但整个屏被分成若干个小区域(例如1602:被分成16*2=32个区域),每个小区域显示1个字符,该小区域是由很少的点阵来显示,(例如1602:该小区域是由5*7点阵构成)。 所以,通常字符(点阵)型只用来显示数字、字母,不用来显示汉字、图形。 但是,若要用字符点阵型,显示汉字、图形也可:处理方法-用2个或更多个小区域来显示汉字、图形。,(ii)图形点阵型:它
4、是由许多等间隔的点,围成的一个大的点阵列构成。例如LCM12864是由128*64个点构成。,8.2 LCM1602,1、LCM1602简介,2、LCM1602各引脚的定义,3、LCM1602 与 单片机 的连接图,4、LCM1602控制器 控制时序,5、LCM1602控制器 指令和状态字,6、LCM1602的4种存储器类型,LCM1602为字符型(点阵式)LCD模块。 字符型液晶显示模块是一种专门用于显示字母、数字、符号等的点阵式液晶显示模块。 但是,通过自定义,也可显示简单的汉字和图形。 LCM1602的每一个显示的字符(或字母、数字等)是由5*7或5*11点阵组成。 每个点阵字符(5*7
5、或5*11点阵)之间有一个间隔,起到字符间距和行间距的作用。,1、LCM1602简介,正面,反面,2、LCM1602各引脚的定义,3、LCM1602 与 单片机 的连接图,(1)LCM1602 与 MCS51单片机 的连接图,(2)LCM1602 与 STM32单片机 的连接图,LCM与STC89C52的连接图,如右图所示:,(1)LCM1602 与 MCS51单片机 的连接图,LCM1602有八个数据引脚(D0D7)与STC89C52相连,用于接收指令和数据; STC89C52通过LCM1602的RS,RW和E这三个端口控制LCM模块。,P22,P22,(2)LCM1602 与 STM32单
6、片机 的连接图,原理图-LCM1602 与 STM32单片机 的连接图.ppt,写指令 输入:RS=L,RW=L,E=下降沿脉冲,DB0DB7=指令码 输出:无 读状态 输入:RS=L,RW=H,E=H 输出:DB0DB7=状态 写数据 输入:RS=H,RW=L,E=下降沿脉冲,DB0DB7=数据 输出:无 读数据 输入:RS=H,RW=H,E=H 输出:DB0DB7=数据 (从LCD读数据,一般无必要),状态,指令,4、LCM1602控制器控制时序:,数据,数据,LCM1602的控制器,(控制驱动电路为HD44780/KS0066),其控制时序如下:,5、LCM1602控制器指令和状态字,工
7、作方式设置指令:,DL:设置数据总线宽度,一般设置为 1;,DL=1:数据总线宽度为 8 位,即 DB7DB0 有效;,DL=0:数据总线宽度为 4 位,即 DB7DB4 有效。,N:设置显示字符的行数,1602 LCD一般都设置为 1;,N=0:为一行字符;,N=1:为两行字符;,F:设置显示字符的点阵,一般设置为 0;,F=0:为 5X7点阵字符体;,F=1:为 5X11 点阵字符体;,1,这位,很多的数据参考手册都写错了,显示状态设置指令:,该指令控制着画面、光标和闪烁的开与关。,D:画面显示控制位; D=1 为显示开, D=0 为显示关; 该指令仅影响显示屏的开关,并不影响显存中的数据
8、。,C:光标显示控制位; C=1 光标显示; C=0 光标不显示。,B:光标闪烁显示控制位; B=1 光标闪烁启动; B=0 光标闪烁关闭;,光标或画面滚动设置指令:,S/C (Screen/Cursor):滚动对像的选择,S/C=1 画面滚动 S/C=0 光标滚动,R/L(Right/Left):滚动方向的选择,R/L=1 向右滚动 R/L=0 向左滚动,写或读一个字符后, 光标或画面滚动设置指令:,I/D(Increase/Decrease): I/D=0 当写或读一个字符后,光标左移1格,AC自动减一; I/D=1 当写或读一个字符后,光标右移1格,AC自动增一;,S(shift):设置
9、写或读一个字符后,是否允许画面平移 S = 1:当写或读一个字符后,允许画面平移; S = 0:当写或读一个字符后,画面不动。,例如,S=1:当写或读一个字符后,整屏显示(I/D=1)左移或者右移(I/D=0)一格。达到光标不移动而屏幕移动的效果。 S=0:当写或读一个字符后,整屏显示不移动。当I/D=1,光标右移1格,AC自动增一;当I/D=0,光标左移1格,AC自动减一。,清屏指令:,功能: 清除液晶显示器,即将 DDRAM 的内容全部填入“空白“的 ASCII 码 20H; 光标归位,即将光标撤回液晶显示屏的左上方; 将地址计数器(AC)的值设为 0。,光标归位指令:,功能: 把光标撤回
10、到显示器的左上方; 把地址计数器(AC)的值设置为 0; 保持 DDRAM 的内容不变。,CGRAM 地址设置指令:,该指令将 6位的 CGRAM 地址写入地址指针计数器 AC 内, 随后的数据操作是对 CGRAM的读/写操作。 注:CGRAM 为用户自定义字符的空间,用来保存用户自定义的字符的字模。不同于显存(DDRAM)。,例如,把自定义的字符的字模,写入CGRAM中。,DDRAM 地址设置指令:,该指令将 7位的 DDRAM 地址写入地址指针计数器 AC 当中, 随后的数据操作是对 DDRAM(显存)的读/写操作,例如,把当前所要显示的字符的字符代码(即该字符的ASCII码,即该字符在字
11、符库中的地址码)写入DDRAM。 注意:该指令不是把欲显示的字符的字模写入DDRAM中。这点不同于CGRAM 地址设置指令。 欲显示的字符的字模事先已保存在CGROM中。 一旦某字符的ASCII码写入DDRAM,LCM1602控制器 就会自动去CGROM字模存储器中,查找该字符的字模,在LCM1602液晶屏上,显示该字符。,固化在CGROM中的字符,和在CGRAM中自定义的字符,显示方式都是一样: 首先,光标定位:用函数LCD_SetCursor( )光标定位。 其次,显示字符:用函数LCD_DISP_CHAR(m)显示字符。 该函数的参数:在字符库中,当前所要显示的字符的字符代码(即该字符的
12、ASCII码,即该字符在字符库中的地址码),状态查询字,BF(Busy Flag):为状态查询位,代表内部操作是否完成。,1: 忙,代表内部操作未完成。,0:空闲,代表内部操作已完成。,AC60:为7位的 AC 值,即当前地址指针计数器AC的值。,6、LCM1602的4种存储器类型,在LCM1602中,包括4种类型的存储器:DDRAM、CGROM、CGRAM、字模存储器。,1、DDRAM 显示数据RAM,2、CGROM 用于保存已固化好的字模库,3、CGRAM 用于保存自定义的字模库,4、字模存储器 是由CGROM和CGRAM构成,固化了192 个常用字符的字模,3、LCD初始化,5、设置光标
13、位置,显示字符,4、LCD清屏,1、加入头文件,2、使能使用到的外设对应的时钟,1、加入头文件,#include “stm32f10x_lib.h“ /若使用RCC_Configuration( ); 使能GPIO外设对应的时钟,还必须加入以下头文件。/若使用具体的使能外设命令(例如,RCC_APB2PeriphClockCmd( )等 ),则不需要加入以下命令。 #include “HelloRobot.h“,#include “LCD.h“ /该头文件的作用:对main()函数中使用的函数,进行声明。 声明,本文件要用到的,其它文件中的函数。(省略了extern) 实际可以直接在main函
14、数之前,声明这些函数,以代替本头文件。,声明,调用,/以上这些函数在LCD.C中定义,2、使能使用到的外设对应的时钟,RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);,在LCD_Init( )函数中,只定义了外设的结构体变量,没有对外设的时钟使能,必须在这里,补加 对外设的时钟使能。,void LCD_Init(void) GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_
15、Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, /光标移动的设置:在写入或读出一个字符后,光标加1右移,并且地址指针加1 ,定义结构体变量,对GPIO参数,进行设置,写LCM1602控制器指令,设置其工作方式,LCD_Init( )功能: GPIO端口参数设置, 写LCM1602控制器指令,设置其工作方式,3、LCD初始化:,使用函数LCD_Init( ),设置与LCD相连的 STM32管脚,初始化LCD
16、模块,初始化过程包括以下2方面:,void LCD_Init(void) GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, /光标移动的设置:在写入或读出一个字符后,光标加1右移,并且地址指针加1 ,设置与LCD相连的 STM32管脚,初始化
17、LCD模块,!详细注释:LCD_Init( )函数.doc,4、LCD清屏,【法一】使用函数 LCD_Clr( ),【法二】使用函数 LCD_CMD(0x01),void LCD_Clr(void) unsigned char i;LCD_SetCursor(0x00);for(i=0;iLCD_MAX_Col;i+)LCD_DISP_CHAR( );LCD_SetCursor(0x40);for(i=0;iLCD_MAX_Col;i+)LCD_DISP_CHAR( ); ,【法一】使用函数 LCD_Clr( ),【法二】使用函数 LCD_CMD(0x01),void LCD_CMD(unsi
18、gned char ch) int i;LCD_SET_IRS();for(i=0;i100;i+);/延时LCD_INPUT(ch); ,在长沙太阳人电子有限公司的“1602液晶说明.pdf” P3,设置数据总线上,传送的是指令,LCD_SET_IRS();,设置数据总线上,传送的是指令,LCD_SET_DRS();,设置数据总线上,传送的是数据,(1)设置光标位置:使用函数LCD_SetCursor( ),5、设置光标位置,显示字符,1602LCM:可显示2行,每行16个字符。,第1行16个字符的地址,每个字符对应的地址:,第2行16个字符的地址,例1,把光标定位在第1行第1个字符的位置:
19、,LCD_SetCursor(0x00);,例2,把光标定位在第2行第1个字符的位置:,LCD_SetCursor(0x40);,函数LCD_SetCursor( ) : 既实现了光标定位,又实现了DDRAM的地址设定。,(2)显示字符:使用函数LCD_DISP_CHAR( ),该函数的参数:单个字符常量(即用单引号括起的一个字符),或 单个字符的ASCII码,例如, LCD_SetCursor(0x40);LCD_DISP_CHAR(2); /在LCD1602第2行,显示2 LCD_DISP_CHAR(0x32);/在LCD1602第2行,显示2,LCD,LCM 介绍,LCM1602,LCM1602 编程步骤,8.1,8.2,8.3,第八章 LCD 编程,自定义字符 及其 显示方法,8.4,(,),