基于元件技术手册的嵌入式驱动开发的探索
2016-05-30杨佳邓力
杨佳 邓力
(1.南宁第三职业技术学校 广西 南宁 530001;2.桂林理工大学 南宁分校,广西 南宁 530001)
【摘 要】文章通过对国内嵌入式系统岗位的技能进行分析,针对国内院校嵌入式系统课程的教学内容、实验实训开设的现状,根据企业对嵌入式岗位招聘需求,提出了基于元件技术手册的嵌入式驱动开发的新思路。以LPC2106驱动LCD1602液晶的项目,探索了基于元件技术手册来进行新产品开发的培训新思路,提出了基于元件技术手册进行产品研发的新方法,对拓展国内外嵌入式系统教学提供了新的课程培训思路。
【关键词】嵌入式;驱动开发;LCD1602;LPC2106
【中图分类号】TP311 【文献标识码】A 【文章编号】1674-0688(2016)03-0046-05
1 嵌入式系统岗位分析
随着我国信息化与工业化融合的推进,嵌入式技术的广泛应用已成为必然趋势[1]。企业不仅对嵌入式系统人才需求的数量在增加,对嵌入式系统人才的技能要求也在不断地提高。从事嵌入式产品的相关研发,离不开硬件层、中间层、软件层、功能层4个层次的研发工作[2]。它的开发流程都必须先定义产品功能,再对定义进行系统分割,然后进行软硬件的规划和设计,按照岗位职能可进一步细分如下。
软件研发分为系统构建工程师、上层驱动开发工程师、上层应用程序开发工程师。
硬件研发分为电路原理图设计工程师、PCB设计工程师、底层驱动开发工程师。
软件研发的3类工程师按照操作系统的种类又分出与各种操作系统相对应的工程师。目前,在各领域应用的主流操作系统有UCOS-II、LINUX、WINCE、VXWORKS等。企业一般会按照不同的操作系统平台招聘相应的工程师。
2 当前嵌入式系统培训的不足
目前,国内高校开设嵌入式系统课程的高校、培训机构较少,嵌入系统课程的教学内容、实验实训的开设还处在探索的阶段[3]。通过对毕业学生、学员的回访和到企业的调研发现,由于在学习时学员对元件的手册没有全面地练习,对设备、元件的相关代码都是通过修改(教师提供或网上下载)而得到的,因此当采用新元件时,学员对新元件的驱动编写无从下手。
3 嵌入式系统培训改进的基本思想
(1)要让学员学习如何查看厂家提供的技术手册并根据元器件技术手册来进行设计。
(2)培训项目元件的选取要有一定的复杂性,但最好选取学员不太陌生的元器件。
(3)为了使学员能更深刻地理解驱动程序的代码是如何与元件的硬件电路相对应的,驱动程序的代码编写先不采用操作系统。
4 项目设计
根据项目设置的基本思想,设置一个嵌入式驱动液晶显示的电路并完成相关驅动代码的编写。
液晶采用LCD1602,嵌入式CPU采用LPC2106,驱动项目编写软件采用ADS1.2,为了验证驱动代码运行的结果是否正确,采用Proteus软件完成电路设计,并通过Proteus电路仿真来验证[4]驱动代码在液晶电路的运行情况。
项目主要通过LCD1602的显示程序来学习如何根据LCD1602厂家的技术手册编写驱动程序代码。
液晶LCD1602的主要技术参数如下。
1602字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,可以显示2行,每行显示16个ASCII字符,并且可以自定义图形,只需要写入相对应字符的ASCII码就可以显示[5](见表1)。
根据液晶接口信号引脚说明,完成液晶和CPU的电路连接(如图1所示)。
根据电路的连接,在程序中完成管脚的定义:
#define rs (1<<8)
#define rw (1<<9)
#define en (1<<10)
#define busy (1<<7)
根據手册管脚的接口信号说明,确定和液晶相连接的LPC2106的引脚为输入输出IO口,同时将与液晶连接的CPU引脚定义为输出IO口的类型:
PINSEL0=0x00000000; //设置所有引脚连接GPIO
PINSEL1=0x00000000;
IO0DIR=0x7ff; //设置P0.0—P0.10为输出IO口
1602液晶的D0~D7端为8位数据口,进行数据传送,而RS、R/W、E端则配合可以做出不同的操作[5],对1602进行操作主要有4种,如下:{1}读状态,输入:RS=L,RW=H,E=H。输出:D0~D7=状态字。{2}写指令,输入:RS=L,RW=L,D0~D7=指令,E=高脉冲。输出:无。{3}读数据,输入:RS=H,RW=H,E=H。输出:D0~D7=数据。{4}写数据,输入:RS=H,RW=L,D0~D7=数据,E=高脉冲。输出:无。
在进行读操作的时候,RW置于1,RS则根据读的内容(状态或数据)置为1或0,E置为1,可以在数据口读到正确的数据,在将E置为1之后,就可以紧跟着指令去读取数据,在读到数据后,再将E置为0。
在进行写操作的时候,RW要置为0,RS根据写的内容不同(指令或数据)置为1或0,同时在将E置为1之前,要先将数据送到数据口上,然后将E置为1,经过一定的延时后,再将E置为0,在这个时间段内必须保证数据口上的数据稳定不变,且为有效的数据。
从上文可以看出,如果想对1602进行何种操作,只要按其相对应的操作规程来做即可。
虽然以上有4种操作,但实际上归类起来只有2种,一种读一种写,并且进行读或写都要进行数据的传送。
液晶状态字说明如图2所示。
用CPU来控制LCD模块的方式十分简单,LCD模块的内部可以看成2组寄存器,一个为指令寄存器,另一个为数据寄存器,由RS引脚来控制。所有对指令寄存器或數据寄存器的存取均需检查LCD内部的忙碌标志STA7,此标志用来告知LCD内部正在工作,并不允许接收任何的控制命令。而此位的检查可以令RS=0,用读取D7来加以判断。当D7为0时,才可以写入指令或数据寄存器。因此,在对控制器每次进行读写操作之前,都必须进行读写检测,确保STA7为0。
根据手册的要求,编写、读写检测函数:
/****************************************************************************
* 名称:ChkBusy( )
* 功能:检查总线是否忙
****************************************************************************/
void ChkBusy( )
{
IO0DIR=0x700;
while(1)
{
IO0CLR=rs;
IO0SET=rw;
IO0SET=en;
if(!(IO0PIN & busy))break;
IO0CLR=en;
}
IO0DIR=0x7ff;
}
代码说明:
根据读状态,输入RS=L,RW=H,E=H; 输出D0~D7状态字的定义。为了能读出D7的状态,要使RS=L,RW=H,E=H,因此定义IO0DIR=0x700,使P0.8-P0.10为输出IO口,而P0.0-P0.7输入IO口。
忙检测完成后,需要对LCD1602输入指令和数据,因此定义IO0DIR=0x7ff,将P0.0-P0.10全部定义为输出IO口。
在对液晶进行忙检测后,就可以对液晶进行读写操作。写操作分为写指令与写数据2种操作,写指令是定义对液晶进行何种操作,写数据是将数据传递给1602液晶。对液晶进行写操作一般是先执行写操作,然后再写数据。写指令与写数据相对应的函数如下:
/****************************************************************************
* 名称:WrOp( )
* 功能:写指令函数
****************************************************************************/
void WrOp(uint8 dat)
{
ChkBusy( );
IO0CLR=rs; //全部清零
IO0CLR=rw;
IO0CLR=0xff; //先清零
IO0SET=dat; //再送数
IO0SET=en;
IO0CLR=en;
}
通过写指令函数完成对液晶的写操作。
写数据函数:
/****************************************************************************
* 名称:WrDat()
* 功能:写数据函数
****************************************************************************/
void WrDat(uint8 dat) //读数据
{
ChkBusy();
IO0SET=rs;
IO0CLR=rw;
IO0CLR=0xff; //先清零
IO0SET=dat; //再送数
IO0SET=en;
IO0CLR=en;
}
LCD1602手册中液晶初始化的要求如图3所示。
在使用1602之前,必须对其进行初始化操作,初始化过程是往1602固定写入一定的指令,里面包括指定使用模式、清屏等[5]。LPC2106晶振为11.0592 MHz,为了能准确地延时,可能通过调用延时函数完成延时。
/*****************************************************************************
*名稱:DelayNS( )
*功能:长软件延时
******************************************************************************/
void delay(uint8 z)
{
uint8 x,y;
for(x=z;x>0;x--)
for(y=200;y>0;y--) ;
}
/****************************************************************************
* 名称:lcd_init( )
* 功能:lcd初始化函数
****************************************************************************/
void lcd_init(void)
{
Delay(15);
WrOp(0x38);
Delay(5);
WrOp(0x38);
Delay(5);
WrOp(0x38); //显示模式设置
Delay(5);
WrOp(0x08); //显示关屏
WrOp(0x01); //显示清屏
WrOp(0x06); //光标加1
WrOp(0x0c); //开显示
}
在1602上,分为二行,每行有16个字符位置,如何在我们需要的位置上显示出对应的字符呢?可由RAM地址映射图及数据指针设置,确定液晶显示的位置(如图4所示)。
要显示字符时先输入显示字符地址,也就是告诉模块在哪里显示字符:比如第二行第一个字符的地址是40 H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1,所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)
图5是1602显示RAM缓冲区对应的地址,要在对应的位置显示出字符,首先要写入一个设置数据地址的指令码(80H+地址),然后紧跟着写入要显示的数据即可。
写指令:WrOp (0x80+地址,0)
写数据:WrDat (字符ASCII码,1)
比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
最后完成主函数的编写使用:
/****************************************************************************
* 名稱:main()
* 功能:显示文本
****************************************************************************/
int main(void)
{
lcd_init( );
IODIR=0x7ff; //设置为输出
IOCLR=0x7ff;
WrOp(0xc1);
WrDat('a');
}
代码说明:WrOp(0xc1)写指令函数定义字符在液晶中显示的地址为第二行第一个字符,WrDat('a')将要显示的字符a传递至液晶显示。
完成程序的编译后将生成的.hex文件下载到proteus电路中完成仿真,液晶在第二行第一列正常显示出字符a。
5 项目的扩展
在完成了嵌入式液晶驱动代码的实验后,还可以引导学员对该项目进行扩展。
(1)如何在液晶中显示字符串?
为了能够显示字符串,可编写字符串显示函数:
/****************************************************************************
* 名称:DisText( )
* 功能:显示文本函数
****************************************************************************/
void DisText(uint8 addr,uint8 *p)
{
WrOp(addr);
while(*p !='\0')WrDat(*(p++));
}
(2)引导学员修改程序:如何让液晶上显示的字符动态移动显示?
(3)如何将ARM中LCD1602液晶的显示代码移植到其他的CPU中(以移植到8051为例),让学员感受到C语言作为高级语言的优势。
(4)在项目中,针对元件技术手册引导学员进行其他课程的实验:如由元件外形尺寸,引导学生在设计PCB时根据手册上的元件外形尺寸设计LCD1602的元件PCB封装。
6 结论
本文通过对国内嵌入式系统岗位的分析,针对国内嵌入式系统教学、培训的情况,通过LPC2106驱动LCD1602液晶的项目,系统地展现了基于元件技术手册进产品研发的方法,探索了基于元件技术手冊来进行新产品开发的培训新思路,对拓展国内外嵌入式系统教学提供了新的课程培训思路。
参 考 文 献
[1]黄福莹,黎相成,何华光.嵌入式技术课程的教学探讨[J].广西大学学报(哲学社会科学版),2007,29(5):77-78.
[2]潘晓宁.高职高专院校嵌入式系统课程教学方法的探讨[J].职业教育研究,2007(8):24-25.
[3]张其亮,韩斌.“嵌入式系统”课程的实验教学研究[J].实验室研究与探索,2009,28(6):132-133.
[4]倪蕴涛.基于嵌入式系统实验课程教学方法改革和教学思路探索的研究[J].牡丹江教育学院学报,2007(4):130-131.
[5]赵亮.液晶显示模块LCD1602应用[J].电子制作,2007(3):58-59.
[责任编辑:钟声贤]