邹全胜
(滁州职业技术学院,安徽 滁州 239000)
显示模块在单片机中不可或缺,如用数码管显示温度,12864液晶显示汉字或工作界面。而用12864液晶显示图片作为开始界能够是整个单片机项目增色不少,我们在这里将加以介绍。
图一 效果图
本方案的实现主要包括:单片机最小系统、12864液晶与单片机的连接、显示函数的编写、图片转换、图片字模的生成及系统的调试。
单片机微型计算机是微型计算机的一个重要分支,它是单片机微型计算机简称,通常用于控制领域,故又称为微控制器。
单片机由单块集成电路芯片构成,内部集成计算机的基本功能部件:中央处理器、存储器和I/O接口电路等。因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。
本项目采用AT89s52单片机,AT89S52是Atmel公司采用高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容,并且具有8K在系统可编程Flash存储器。
AT89s52具有32位I/O口,分别是P0口、P1口、P2口、P3口各8位,总共32位。每个口的8位都可作为通用的输入输出口,其中P3口还兼有第二功能:P3.0(RXD)串行数据接收端P3.1(TXD)串行数据发送端,P3.2(INT0)外部中断源0输入端,P3.3(INT1)外部中断源1输入端,P3.4(T0)定时/计数器T0计数脉冲输入端,P3.5(T1)定时/计数器T1计数脉冲输入端,P3.6(WR)外部RAM写选通端,P3.7(RD)外部RAM读选通端。另外P0和P2口用作地址线端口时,分别对应地址的低8位和高8位。[1]
图二 12864方块图
1、模块简介
12864液晶主要由显示模块、驱动器、控制器及背景光几部分组成。12864液晶显示分左右半屏,其中左半屏64列,右半屏64列,加在一起128列。左右半屏又各有64行,所以称之为12864液晶。其中液晶的64行又分为8页(0~7),每页8行。左右半屏的选择,依靠控制器的CS1、CS2来选择。屏幕的亮度取决与背景光的亮度,亮度的调节又取决于背景光的电压值。
2、接口的定义
图三 接口定义示意图
12864共有20个接口:
1脚VSS和2脚VDD分别为电压的负极和正极。
4脚R/S端为控制寄存器操作选择端,即选择是对数据还是指令进行操作:H(高电平)时为对数据进行操作,L(低电平)时为对指令进行操作。
5脚R/W端为读写控制端:H(高电平)时表示“读“,即数据从12864中读出,L(低电平)是表示”写“,即数据被写入到12864中。
6脚E为控制使能:只有此脚从高电平向低电平跳变时(即下降沿),相关的读写的数据才能有效。
7~14脚为数据总线。
15脚CS1为右半屏选择信号,H高电平时选中。
16脚CS2为左半屏选择信号,H高电平时选中。
17脚RET为复位信号,低电平复位。
18脚为LCD驱动负电压。
19、20脚分别为LED背光板电源。
图四 12864液晶的写时序图
3、写指令和写数据函数的编写通过以上接口的定义我们再来看看12864的时
序图:从图中我们看出,如果我们要往12864液晶中
写数据,首先R/W要为0,其次在数据DB0-7数据有
效时,E要从高电平向低电平跳变,由此我们可得出
写指令和写数据的函数的如下写法:
写指令函数:
写数据函数:
从两个函数可看出它们的不同之处在于,写指令函数的RS=0,而写数据的函数RS=1。而它们的相同之处在于同样RW=0,代表向12864中写,同时E都在P0口数据稳定时有1向0跳变,也即从高电平向低电平跳变。[2]
4、指令介绍
图五 12864显示控制指令
知道的12864液晶写数据和写指令函数的编写,我们在来看看12864各指令的含义。
之前我们说12864液晶分左右屏,有分8页和左右屏各64列,那么怎么样把数据精准的定位到我们要显示的位置呢?靠的就是12864液晶的显示控制指令,下面我们一一解释:
开关显示:从表中看出,首先RS要为L,因为我们要写的是控制12864显示的指令而不是要显示的数据。R/W为L代表向12864中写(下面同此,不再说明)。在看DB7-DB0只有DB0是可变的,L代表关,H代表开。所以开关显示的二进制码就为00111110(关)(十六进制 0X3E),00111111(开)(十六进制0X3F)。
设置Y地址:可见此指令预留的6位用于指定12864的64列的地址,那么起始地址的二进制码为:01000000(十六进制0X40)。
设置X地址:X地址即为128654的页地址,共有8页,所以此字节预留的3位用于指定8页的地址,起始地址的二进制码为10111000(十六进制0XB8)。
显示开始线:此指令用于指定从12864的64行中的那一行开始显示,我们一般从第一行开始显示,这样Z地址的起始地址的二进制码为:11000000(十六进制0XC0)。
12864液晶与单片机的连接如图。AT89S52单片机的P0口与12864的DB0-DB7相连,作为单片机与12864交换数据的数据口。RST接P2.4口,CS1和CS2分别接P2.4和P2.3,E接P2.2口,R/W接P2.1口,RS接P2.0口。VCC和GND分别接电源正极和负极。由于此图为仿真图,其它接口忽略(实际中不可)。[3]
图六12864与单片机连接图
图片转换的目的,由于我们12864的像素有限,只有128×64,所以我们要将下载的黑白图片进行转换。
这里我们以下载好的黑白图片为类:首先我们打开画图软件,用画图软件打开我们下载好的黑白图片。
图七
由于图片较大,我们选择查看,进行缩小。然后用选择工具选择要截取的部分然后复制。
新建文件,在新建的画图板中粘贴。选择图片右下角进行拖动,直到下面的像素显示为128×64为止。(如下图)
图八
这时打开文件的属性面板
图九属性面板设置
设置属性中的宽度为128,高度为64,单位为像素,颜色为黑白,最后进行保存。这样我们的图片的转换就做好了。
12864的显示原理是:每次向12864写一个字节的数据,一个字节8位,高电平1在12864上显示的黑点,低电平0在12864上显示的是个空白(或白点)。且这一个字节的8位是纵向方式写入的,所以我们在取字模时一定要纵向取模,字节倒序也要勾选上。
参数设置如下图所示:
设置完成后,点击“基本操作”,“打开图像图标”。
打开我们事先转换好的黑白图片,打开后的效果如图所示。
最后点击“取模方式”,选择“C51格式”即可在“点阵生成区”看到生成后的十六进制代码。赋值生成的所有代码,在主函数中以数据的形式保存即可。
主程序的编写我们主要介绍显示图片函数的写法。图片显示函数是我们本系统的关键,它用到了以上我们介绍的所有知识,下面我们来详细介绍。
首先,整个图片是以整个屏幕的大小实现处理好的,取模方式我们也是采用的纵向取模,所以整个字模的个数为8×128个字模(8×128字节的数据)。8代表有8也,128代表有128列,其中左半屏64列,右半屏64列。每列从0开始计数也就是0列-63列,页也是从0开始计数即0页-7页。所以我们用两个局部变量i和j,分别代表页和列。
其次,在写每一页的128列时要能自动识别左右半屏,采用的方法就是看列参数j是否小于64和大于63。小于64也即0-63在左半屏,大于63即64-128在右半屏,在右半屏时,左右半屏要切换(CS1、CS2的高低电平要互换),同时列数的值要在j的基础上减去 64(64-64=0、127-64=63,符号右半屏0列-63列的原则)。
再次,每写完128列要换行(也即换页),采用的方法是每写完128个数据,列数据要在参数j的基础上加上i×128,这样随主i的增加j就在127的基础上加上逐渐128,从而实现自动换行。
图片显示函数如下:
系统的调试我们采用PROTEUS单片机仿真,线路的连接我们采用的是网络标号的方法,相同的网络标号代表两端是连接在一起的。程序用keil软件别写好之后,生成相对应HEX文件。双击仿真软件中的单片机(我们实际使用的是AT89S52,仿真时我们用 AT89CF51代替),在“program file”栏中选择刚生成好的HEX文件,点击“确定按钮”。最后点击PROTEUS软件左下角的“开始按钮”,即可实现本系统设计。
最终的效果如下图: