基于单片机的多温度检测系统的设计与protues仿真
液晶模块分为字符型和点阵型两类:字符型显示模块通常只能显示ASCII码表中的数字、字母等符号;点阵型显示模块除了可以显示ASCII字符,还能显示汉字、绘制图形。 (一)引脚功能
RT1602液晶模块内带标准字库,内部的字符发生存储器(CGROM)已经存储了192个5×7点阵字符,可显示2行×16列共32个点阵字符,其外观及引脚排列如图6-8所示,其引脚功能说明如下:
VSS:电源地 VDD:5V正电源
V0:为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生阴影,使用时可以通过一个10K的电位器调整对比度。
RS:寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 R/W:读写信号线,高电平时进行读操作,低电平时进行写操作。
E:使能控制信号,当该引脚由高电平跳变成低电平时,液晶模块执行命令。 RS=0、R/W=1、E=1时,读取液晶模块的状态字。 RS=0、R/W=0、E=1,向液晶模块写入命令字。 RS=1、R/W=1、E=1时,从液晶模块读取数据。 RS=1、R/W=0,E=1时,向液晶模块写入数据。 DB0~DB7:8位双向数据线。 BLA:背光源正极。 BLK:背光源负极。
图4.6 RT1602的外观及引脚
RT1602的读/写时序如图6-9所:
(二)显示模块的指令功能 RS
R/W
RS R/W
E DB0~DB7
读时序
E DB0~DB7
写时序
(二)显示模块的指令功能
RT1602液晶模块内部的控制器共有11条控制指令,单片机对液晶模块的控制都是通过指令编程来实现的,指令的格式如表6-3所示,现分别说明如下: 1、清屏:指令码01H,清屏后,光标返回到地址00H。 2、光标返回:光标返回到地址00H。 3、光标和显示模式设置:
I/D:光标移动方向,高电平右移,低电平左移。
S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效 4、显示开/关控制:
D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 。 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 。 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
表4.8 RT1602显示模块的指令集
指令 清屏 光标返回 置输入模式 显示开/关控制
RS 0 0 0 0
R/W D7 0 0 0 0 0 0 0
0 0 0 0 0 0 1
D6 0 0 0 0 0 0
D5 0 0 0 0 0 1
D4 0 0 0 0 1 DL
D3 0 0 0 1
D2 0 0 1 D
D1 0 1
D0 1 *
I/D S C
B * *
光标或字符移位 0 置功能 置数据存储器地址
读忙标志或地址 0 写数据 读数据
1 1 0 0
S/C R/L * N
F
*
显示数据存储器地址(ADD)
1 0 1
BF 计数器地址(AC)
要写的数据 读出的数据
5、光标或显示移位:
S/C:高电平时移动显示的文字,低电平时移动光标。 R/L:移动方向,高电平右移,低电平左移。 6、置功能:
基于单片机的多温度检测系统的设计与protues仿真
DL:高电平时为4位总线,低电平时为8位总线。 N:低电平时为单行显示,高电平时双行显示。
F: 低电平时显示5×7的点阵字符,高电平时显示5×10的点阵字符。 7、置数据存储器地址:
如图4.9所示,液晶屏幕上的每个字符位置与内部数据存储器(DDRAM)之间有着一一对应关系-10 屏幕位。
LCD 16字*2行 00 40 01 41 02 42 03 43 04 44 05 45 06 46 07 47 08 48 09 49 09 4a A 4b B 4c …… 27 67 图4.9 置与内部数据存储器
为了将字符显示到屏幕指定位置,必须用该命令设置液晶模块的数据存储器地址。例如:为了能在第二行第二列(数据存储器地址为41H)显示字符,必须首先置数据存储器地址为41H,相应的命令字为1000 0000B + 0100 0001B=1100 0001B(C1H)。
8、读忙标志和光标地址:
BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,BF为低电平表示不忙。
AC:为当前计数器地址。 9、写数据:
RT1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,包括阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,一般为该字符的ASCII码,只要执行写数据指令,写入该字符的代码,就可在屏屏幕上显示该字符。
为了使程序清晰易读,将对命令口、数据口的写操作及等待操作完成设计成函数,每次写入指令码或数据后必须等待忙标志BF为0后才返回;由于每次写
入数据后,模块内的地址寄存器会自动指向下个单元,因此无需在每个字符输出前都设置数据存储器地址,比如在显示字符串str1前,只要用“lcd_cmd(0x80);”语句设置一次即可,将str1的第一个字符‘W’写入模块内地址为00H的单元,即显示在第一行的第一个字符位置,后续的其它字符就无需再设置地址了,程序清单如下:
#include
#define LCD P0 //P0口作为总线端口 sbit RS=P3^7; //数据/命令寄存器选择控制端 sbit RW=P3^6; //读写控制端 sbit E =P3^5; //使能控制端
sbit RDY=LCD^7; //就绪线BF,低电平有效
void lcd_cmd(uchar cmd) //向液晶屏发送指令 { LCD=cmd; RS=0; RW=0; E=1;
_nop_(); //延时 E=0; while(1) { LCD=0xff; RS=0; RW=1; E=0;
//总线变高
//使能信号有效
//选择命令寄存器 //执行写数据操作
//选择命令寄存器 //读操作 //使能信号有效
_nop_(); //延时 E=1;
//撤消使能信号
基于单片机的多温度检测系统的设计与protues仿真
if(RDY==0) break;//如果就绪,返回 } }
void lcd_dat(uchar dat) //向液晶屏写入数据 {
LCD=dat; //显示数据送总线 RS=1; //选择数据寄存器 RW=0; //执行写数据操作 E=1; _nop_();
E=0; //使能信号有效 while(1)
{ LCD=0xff;//总线变高 RS=0; //选择命令寄存器 RW=1; //读操作 E=0; //使能信号有效 _nop_(); //延时
E=1; //撤消使能信号
if(RDY==0) break;//如果就绪,返回 dat=LCD; } }
void init_lcd(void) //初始化液晶屏 {
lcd_cmd(0x01);//清屏幕
lcd_cmd(0x3c);//设置双行显示,5X10点阵 lcd_cmd(0x0C);//开显示,关闭光标