基于MSP430F149单片机的人机界面设计
扫描二维码
随时随地手机看文章
近年来,随着电子技术和集成电路制造工艺的飞速发展,越来越多的领域应用到以单片机为控制核心的现代智能仪器设备,如果在这些以单片机为核心的控制系统中配上人机交互界面,通过液晶显示器和按键配合操作可更方便有效地完成各种功能选择、参数设置和分析结果显示,采用汉字显示菜单,界面友好且直观。随着液晶显示技术的进步,高质量的点阵液晶显示模块由于具有显示信息丰富、功耗低、体积小、质量小、无辐射以及使用寿命长等优点被日趋广泛地应用于各种嵌入式系统中,同时低功耗特性也贯穿于中文人机界面的设计始终。现以电力系统配电变压器监测终端(TTU)的人机交互部分为例,介绍一种使用OCM12864-3型图形点阵液晶显示模块实现中文窗口菜单界面的方法。 1 系统的硬件结构
1.1 MSP430F14X微控制器简介
MSP430F14X微控制器是德州仪器公司新开发的一类具16位总线的单片机,它基于真正的正交16位RISCCPU内核,具有16个可单周期全寻址的16位寄存器,仅27条的精简指令以及7种均采用双重取数据技术(DDFT)的一致性寻址方式。DDFT技术利用每个时钟脉冲对存储器进行两次数据存取操作,从而不再需要复杂的时钟乘法和指令流水线方案。MSP430F14X系列MCU具有丰富的片上外围模块,片内包括有精密硬件乘法器、多达60KB的FLASH,2KB的RAM、1个看门狗、6个P口(P1和P2还具有中断功能)、12位A/D转换器、2个16位定时器、高精度比较器、高速的USART通信端口,1个DCO内部振荡器和2个外部时钟等常用资源,可实现对液晶显示器的检测、解调和显示。与现代程序设计技术以及高级语言(如C语言)结合使用,使得MSP430的体系结构更加高效,从而在工程技术,特别是PDA产品开发中得以广泛应用 [1]。
1.2 OCM12864-3型液晶显示模块简介
OCM12864是一种128×64点阵(EL背光)的液晶显示器。它由两片带控制器的列驱动电路KS0108和一片行驱动电路KS0107组成主要硬件电路,KS0108将控制显示屏分为左右半屏,通过CS1,CS2选择。整个屏从上到下64行分为8页,每列8行页地址范围为B8H-BFH,列地址范围为40H-7FH,数据为纵向读写,即每页的第一行对应D0,第八行对应D7。每个驱动芯片带有64×64位(512 B)的RAM缓冲区,其中存储的数据即为被显示内容的点阵信息。通过选择对应的RAM 页地址和列地址,微控制器可以访问全部RAM 字节。显示RAM 的每一位对应显示屏上的一个点。显示的实现,就是显示RAM 内容中相应位为1,该点阵亮,相应位为0,该点阵无显示。对存储器的读取是从头至尾的,但在屏幕上显示的位置是可以设置的,通过对显示起始行的设定来设定显示位置[2]。
1.3 硬件接口电路
由于该款液晶显示屏将接口电路直接引出,因此对于用户而言,整体设计大大简化,只需考虑单片机与接口电路间的连接即可。MSP430F149与OCM12864 的线路连接如图1所示。该款液晶显示模块有13条信号线:(1)DB0一DB7:数据总线。(2)CS:片选信号,低电平有效。当单片机访问OCM-12864时,将其置低。(3)RS:数据/指令选择信号,高电平:数据 D0-D7将送入显示RAM;低电平:数据 D0-D7将送入指令寄存器执行。(4)R/W:读 写选择信号,高电平:读数据;低电平:写数据。 (5)E:读写使能信号,高电平有效,下降沿锁定数据。(6)RET:复位信号,低电平有效[3]。
500)this.style.width=500;" border="0" />
由于MSP430的I/O口都是复用端口,因此必须将用到的引脚设为输入/输出口。此外,MSP430是3.3供电,而LCD是5V驱动的,我们可以在MSP430的输出口对地接3.6V的嵌位二极管,在保证MSP的端口电压不超过极限值的前提下,实现MSP430到LCD的电平转换. 2 系统的软件设计
2.1基本驱动函数编写首先使用C语言在头文件中对OCM12864控制线进行定义,然后编写LCD驱动函数,这些函数包括模块初始化、写指令代码、写显示数据、读显示数据、写菜单项、清屏、清页等函数。
2.2 LCD显示菜单设计
2.2.1菜单界面设计 本系统应用于无功补偿控制器,要求显示电网三相电压、电流值,无功功率、有功功率、无功因数,20次的电压谐波含量,无功补偿控制方式自动/手动选择,参数设置等。针对显示要求把整个系统设计成多级屏幕(窗口),又设计成多级主菜单,类似的功能放在一个主菜单菜单项下构成子菜单目录。如果菜单目录项过多,多屏显示此菜单目录。通过分级,使操作人员能很直观快速找到自己当前需要的菜单项,液晶屏菜单界面设置如图2所示。
2.2.2建表
字符或数字在点阵液晶中的显示是通过写相应的内码(1点亮,0灭)实现的,结合整个菜单设计,需要显示的文字并不多,可以先做好码表,把用到的汉字对应的内码保存在一个名为HZ_TAB的表中,每个16xl6点阵的字符需要32个byte表示;把要用到的数字0~9和字母对应的16x8点阵内码保存在一个名NUM_JAB的表中,每个需要16个byte表示;把图片保存在PIC_TAB表中,需要byte数根据大小而定。16x16点阵汉字和16x8点阵数字、字母和任意大小黑白图片字模数据库可由专门的字模提取软件提取字模建立。 [!--empirenews.page--]
菜单一般由西文字符和中文汉字组合而成,每一条菜单项定义一个数组Menu_string,格式如下:{菜单项字符数,第一个字符在字库中的序号,第二个字符,....}。需要注意的是, 在自建西文字库NUM_TAB 和小汉字库HZ_TAB 时,每个中西文字符都是各自编号的。由于中西文显示调用同一个函数,为区别中西文字符,在菜单数组编号时可以在汉字在HZ_TAB库中的编码前加128(0X80)作为标识, LCD在显示内容时,需要判断编号的值, 确定当前位内容是汉字还是西文,然后做调用相应的处理。菜单项的反亮显示采取的办法是将显示内容的所有字模数据按字节取反后再进行常规显示即可。图3为某一项中西文菜单混合显示流程,其中m=1表示该位为汉字, m=0表示该位为ASCII字符.
500)this.style.width=500;" border="0" />
2.2.3数据结构
本系统采用8个按钮来接受用户输入,8个按钮为上、下、左、右、回车、退回、加、减。为方便数据显示和处理。需要首先建立一个菜单窗口结构体并定义一个结构变量WinStruct,该结构中共有11个结构元素,分别是10个字符型和1个指针变量,指针变量指向需执行函数。 Typedef struct{ uchar Menulndex;//当前菜单索引号 uchar BackWinlndex;//当前窗口的上一窗口索引号 uchar NextDnlndex;//下一个菜单索引号,按下“上,下”键时当前菜单项上下移动 uchar NextUplndex;//或可修改参数数值向上下循环变化 uchar NextLIndex; //下一个菜单索引号,按下“左,右”键时当前菜单项左右移动 uchar NextRtlndex;//或在可修改参数位置上左右移动 uchar Key CrState; //按下“回车”键时用户选择确认或参数输入确定 uchar KeyBackState; //按下“退回”键时用户退出当前窗口,返回上一窗口 uchar KeyPlus; / / 按下“加”键,可修改参数加1;uchar KeyMinus; / / 按下“减”键,可修改参数减1;void( CurrentOperate)();//当前状态应该执行的功能操作 }WinStruct; 菜单项在LCD上显示,通过建立菜单项结构体,定义一个结构变量 MenuStruct。如下: Typedef struct{ uchar Menulndex; //当前菜单索引号 uchar NextWinlndex;//下一窗口索引号 uchar cursor_page ://菜单项起始页位置 uchar cursor_col; / / 菜单项起始行位置 uchar type ; / / 菜单项显示的数据类型,16x16或16x8点阵等 uchar *data; / / 指向显示数据区 uchar dataNum;/ / 需要显示的数据的个数 uchar black; / / 是否反显菜单项 uchar modify ; / / 数据是否需要修改 } MenuStruct;
2.3 人机界面设计
人机交互设计的重点在于界面的显示、滚屏、光标的管理及参数的显示、修改和保存。系统在内存中特定区域开辟了1个LCD显示缓冲区,将要显示的整个窗口的点阵数据存放在此区间。LCD的显示程序从此区间中读取数据到LCD点阵数据存储区,借此,LCD显示程序可管理用户交互界面。用户可以用8个按键(向上、向下、向左、向右、确定、返回、加、减)在菜单方式下实现人机交互。
参数的输入、输出显示和保存是人机交互界面设计的重要环节。
下面以第二级菜单中的参数设置为例,进行详细介绍。在主菜单下,将光标移到“参数设置”,按下“确定”键,进入“参数设置”菜单。显示的内容有:设备参数,投切条件,保护定值,电容参数,时钟校准,通讯参数,等等。
装置出厂前已经对各参数进行初始化,存储在二维数组Array[19][5]中,每个参数一行,参数每一位的值都对应存储在数组中的相应位置。定义一个指针P指向Array,表示光标的位置,当然,进入“参数设置”菜单时P=Array[0][0],光标在首行的第一个X的位置,表示选中该参数位。按下“向上”、“向下”、“向左”、“向右”四个方向键来移动光标到待修改的那一位数字上时,P=Array[i][j]则根据按下的键不同而作相应的修改,一般如下:向上,i-1;向下,i +1;向左,j-1;向右,j+1。当然,首先要对原来的i,进行判断。遇到特殊情况要特殊处理。如光标原在某行的第一个参数位上,j= 0,按下向左的键则不改变光标。
选定待修改的那一位参数后,按“修改”键进行参数值的修改。过程如下:读取光标所在的那一位数字的值,每按一次加键,该值加1(在0—9之间循环),每按一次减键,该值减1(在0—9之间循环)。修改完一位后,把改值写入Array[i][j],移动光标继续修改其他的参数。一行参数修改完,经核对无误后按“确定”键(每按一次“确定”确认一行),新的参数值被修改存入机内对应的EEPROM 地址中。参数全部修改完后需要重新开机,否则修改无效。3 结束语
本文构建了基于MSP430F149、OCM12864图形点阵液晶模块和键盘的中文人机交互界面,实现了中文菜单显示及参数的输入、显示、修改和保存等功能,完成了系统所要求的显示任务。此方法也同样适应用于ARM7与DSP其他微控制器LCD液晶人机界面上。
本文创新点:充分利用了OCM12864的硬件资源,实现了友好的人机界面,并且文中介绍的方法具有非常好的灵活性和良好的可维护性,程序员可以在需要的时候很方便地修改菜单和增加子菜单,而不至于影响系统软件原有的结构,而且在此菜单编程方法基础上进行改进,还可增加滚屏,自动翻页等功能。