《ARM创新实验设计报告基于EasyARM和键盘显示板的秒表程序.doc》由会员分享,可在线阅读,更多相关《ARM创新实验设计报告基于EasyARM和键盘显示板的秒表程序.doc(22页珍藏版)》请在三一办公上搜索。
1、江 西 理 工 大 学ARM创新实验设计报告题 目:键盘扫描实验副 标 题:基于EasyARM2013和键盘显示板的秒表程序学 院: 机电工程学院专 业: 自动化班 级: 081学 生: 学 号: 08指导教师: 职称:副教授目 录第1章 摘要1第2章 EasyARM2103各模块的基本原理22.1概述22.2PINSELx22.3GPIO和引脚设定32.3.1GPIO32.3.2引脚设定32.4IRQ中断和定时器Time032.4.1IRQ中断32.4.2定时器Time032.5SPI42.5.1管脚描述42.5.2数据传输52.6总结5第3章 键盘显示板的原理以及原理图63.1键盘显示板原
2、理图63.2键盘显示电路原理73.2.1数码管与键盘显示板原理73.2.2段码和位码数值表83.3点亮键盘板的程序清单93.4延时函数在键盘板中的应用9第4章 秒表的实现原理104.1秒表的设计原理104.1.1键盘显示板的数码管104.1.2键盘显示板中的按键104.2秒表的软件设计原理104.3总结13第5章 相关程序清单的分析和简介14鸣谢18参考文献19第1章 摘要本文将阐述一个基于EasyARM2103实验套件,结合并利用键盘显示板实现简易秒表的所有功能实验。本文将分别对,一、EasyARM2103SPI模块的基本原理,二、键盘显示板的原理以及原理图,三、秒表实现原理,四、相关程序清
3、单的分析和简介。四大部分进行具体讲述。做该实验的意义,本实验未规定操作的具体方向,全程通过自己的理解和能力,实现相关实验部分,首先,做该实验可以真正意义上的实践所学ARM相关知识内容,其次、做这么一个项目可以从实践的过程中,发现并解决相关曾经所学过的知识中很多细节问题和之前学习中不为重视的问题以及通过调试、分析,最后并解决问题,提升自身的综合实践能力。再次,该实验有很强的实践性和检验性,即是对自己所学知识的巩固,又是对自身动手能力的考验和提升,从而达到巩固所学知识和提升动手能力的目的。相关问题,实验的过程中,前后涉及到EasyARM2103各相关寄存器的选择,引脚选择、定义,以及初始化,GPI
4、O、IRQ、定时器Time0,SPI等相关模块的具体操作过程。这是一个相对来说较为复杂的实验,因为,前后涉及到整本EasyARM2103教材的相关知识点。实验过程中,经常遇到各个模块共同使用时出现得不协调现象,但是,基于耐心的调试和更改程序,问题最终得以解决。第2章 EasyARM2103各模块的基本原理2.1 概述本实验中共涉及有,PINSEL、引脚设定、GPIO、IRQ中断、定时器Time0、SPI等主要模块。下面,我将对所涉及到的所有模块进行进一步的分析。2.2 PINSELxLPC2103 具有两个PINSEL寄存器,PINSEL0 和PINSEL1,它们都是 32 位宽度的。其相关引
5、脚设置如表2-1。表2-1 PINSEL0 引脚功能选择寄存器0PINSELx为引脚功能选择寄存器,换句话说,该寄存器的主要功能就是对所选择的引脚进行功能分配,其引脚设置方法如下;首先,PINSEL0或PINSEL1均为32位的寄存器,而每个PINSELx控制16个引脚,也就是说,每两位对应一个引脚,即:PINSEL0对应P0.0:P0.15号引脚,而PINSEL1对应P0.16:P0.31号引脚。因为PNSELx的每两位对应一个引脚,所以,可以通过这两位表示四种状态。即:00 01 10 11 四种状态,而00 态通常表示GPIO功能。本实验中,所用的五个引脚分别为:VCC,GND,P0.4
6、,P0.5,和P0.6。对应功能分别为:电源,接地,CLK(时钟),KEY(按键),DATA(数据)。其中,CLK(时钟),KEY(按键),DATA(数据)均设置其为SPI功能。2.3 GPIO和引脚设定2.3.1 GPIO实验中,经常会把引脚设置为GPIO,然后对相应引脚通过IODIR(方向控制寄存器)、IOSET(输出置位寄存器)、IOCLR(输出清零寄存器)、IOPIN(管脚状态寄存器)进行操作,如程序if(IOPIN&KEY)=0),利用IOPIN获取按键信息,并结合IRQ中断实现对秒表程序的暂停和恢复操作。2.3.2 引脚设定实验中,是通过以下程序对分别对P0.4,P0.5和P0.6
7、进行设置的。 PINSEL0=PINSEL0&(0x038)|(18);/*设置P0.4为SPI,CLK*/PINSEL0=PINSEL0&(0x0310)|(110);/*设置P0.5为SPI,KEY*/PINSEL0= PINSEL0&(0x0312)|(112);/*设置P0.6为SPI,DATA*/其中让PINSEL0进行 & 运算是为了实现程序的安全性,即对相应位进行 & 运算,而不影响其他位。0x038功能为,实现第八、第九位为 11 ,取反后得到 00,再同18 进行 | 运算,最终得到第八、第九两位值为 01 ,查阅表2-1可知 01 对应的为SCK0(SPI0)功能,这样,就
8、把P0.4设置为了SPI的SCK0功能,即时钟。同理,设置P0.5、P0.6为SPI的KEY和DATA功能。2.4 IRQ中断和定时器Time02.4.1 IRQ中断中断是本实验成功的必然,只有很好的利用IRQ中断,才能很好并恰当的实现按键功能。图2-1 向量IRQ中断的示意图可以很容易的知道,我们编写的程序主函数main()中,会有一个while(1)的死循环,如果不利用中断功能的话,我们很难实现对运行中的程序的合理控制,从而编写中断初始化程序以及中断服务程序,最后在主函数中只要编写一句IRQEnable(),对中断进行初始化,那么中断就进入继续状态了,随时等待中断的发生,并响应。2.4.2
9、 定时器Time0本实验中用到的另一个至关重要的模块就是定时器Time0了,由于本实验的性质为确的秒表程序,所以,只有利用EasyARM2103自带的硬件定时机制,才能达到更好的定时效果。如以下初始化程序,其中:T0MR0=Fpclk/360; 将时钟周期定位1/360秒,为下面对毫秒级显示做好铺垫。定时器0初始化程序void Time0(void) PINSEL1&=(0X03)|0X02; T0TCR=0X02; /*定时器0复位*/ T0PR=0X00; /*不设时钟分频*/ T0MCR=0X03; /*匹配后复位TC,并中断*/ T0MR0=Fpclk/360; /*设置1/360秒匹
10、配值*/ T0IR=0X01; /*清除中断标志*/ T0TCR=0X01; /*启动定时器0*/ VICIntSelect&=(14); /*设置为4路通道*/ VICVectCntl0=4|0x20; VICVectAddr0=(uint32)IRQ1; /*确定IRQ1向量地址*/ VICIntEnable=14; IRQEnable(); 2.5 SPI2.5.1 管脚描述书本上,SPI的定义为,串行外设接口。也就是说,SPI是人机对话的一个比较典型的模块,当进行相应操作后,可以让主机和从机机型一系列的通讯,一般SPI可以分为两种模式,第一种叫做:主出从入,第二种为:主入从出。也就是说
11、,一种模式是,主机发送信号,从机接受信号,而另一种为从机发出信号而主机接收信号。而在本实验中,我将其设置为主出从入的模式,也就是下表对应的MOSI0模式,对应P0.6引脚。表2-2 SPI管脚描述2.5.2 数据传输图 2-5-1 SPI的数据传输方向如图所示,当设置SPI为MOSI时,数据由SPI主机向SPI从机发送。而当设置为MISO时数据又由SPI从机向SPI主机发送了。试验中,LPC2103为主机,当要从主机发送段码和位码给从机(键盘板的时候),通过P0.6的MOSI将数据发送至键盘板。而当,我们要确定P0.5是否有按键的信息时,可以理解为这个时刻P0.5的模式为MISO了。2.6 总
12、结以上所介绍的EasyARM2103的几个模块或者引脚,是本实验中所涉及到的。其他部分,这里不做详细介绍。在以上几个小节的内容里,大致的勾勒出了,该实验过程中所遇到的所有硬件问题了,有了以上的基础知识基础,就不难理解和编写出程序了。下面,我将对另一重要硬件键盘显示板,做具体的描述。第3章 键盘显示板的原理以及原理图3.1 键盘显示板原理图图3-1 键盘显示板原理图以上,给出了我们所使用的键盘显示板的电路原理图。不难看出,该电路由四大部分组成。第一部分:两只,八段数码显示管WT3641ASR,组成了,最为关键的显示单元。每只十二个引脚,a,b,c,d,e,f,g,db,以及位码。其中adb下拉电
13、阻和164相连。位码和另一片164相连。同时和8个按键相连。第二部分:两片,74LS164移位寄存器,完成对输入AB口的数据进行移位操作,实现断码和位码的关键作用。其中一片,上拉电阻和两个数码显示管相连。第三部分:8只,按键。KEY1KEY8,是对实现键盘板和主机EasyARM2103通讯的关键器件,并且可以通过按键位置确定164中0的位置。第四部分:VCC,GND,CLK,DATA,KEY五个引脚,供连接外设和扩展电路用。也是,从机键盘板和主机2103的通讯接口。3.2 键盘显示电路原理3.2.1 数码管与键盘显示板原理图3-2-1数码管示意图、数码管原理图由上图可知,数码管上面显示的8和小
14、数点,其实对应为8个发光二极管。数码管工作原理:数码管由8个发光二极管组成,行成一个日字形,它门可以共阴极,也可以共阳极.通过解码电路得到的数码接通相应的发光二极而形成相应的字。键盘显示板原理:按键控制与数码管一一对应关系,通过对按键控制,达到对数码管的控制。实验中所用到的LED数码管为四个级联为一个的整体,但是,原理和单独一个的是一致的,另外,实验所用二极管是共阴极连接的,也就是说,只有通过对相应的位给一个高电平才能点亮相应位置的发光二极管。例如,下表中列举的0Xfc对应表中的二进制数字为1111 1100,其表示的意义为,数码管的a,b,c,d,e,f,g,dp八个发光二极管中只有A,B,
15、C,D,E,F六个点亮,而G,H两个不亮,这样结合上面给出的数码管示意图,不难看出,这六个发光二极管点亮的部分正好组成的是一个数字0。又如,0Xfe对应的二进制数字为1111 1110,其点亮的数值正好为数字8。同理,我们可以推断,确定位码必须是要发送低电平给数码管,因为发送位码的部分是和数码管中发光二极管的阴极相连的。而且同一时刻只能够发送一个0。即,一个时刻只能是一个数码管点亮。例如:发送段码0Xfe,就会点亮最右边的一个数码管,其他的均不亮。前提是在已经发送段码的前提下。3.2.2 段码和位码数值表段码和位码相对应的二进制和十进制数,对应写出来之后,可以整理成为下表,由于数码显示管的硬件
16、结构,只能够显示出09十个数字,所以,下表中只列举了09的段码对应的二进制和十六进制数值。同理,实验所用的键盘显示板,只有8个数码管,即,从右往左07号管子,因此下表也只列出了07的二进制和十六进制数据。 表3-2-1 段码数值表 进制段码值二进制数(0/1)十六进制数A B C D E F G H0 1111 11000xfc10110 00000x6021101 10100xda31111 00100xf240110 01100x6651011 01100xb661011 11100xbe71110 00000xe081111 11100xfe91111 01100xf6表3-2-2 位码
17、数值表 进制位码值二进制数(0/1)十六进制数01111 11100xfe11111 11010xfd21111 10110xfb31111 01110xf741110 11110xef51101 11110xdf61011 11110xbf70111 11110x7f3.3 点亮键盘板的程序清单 SPI_SPDR=data i; while(SPI_SPSR&(17)=0); SPI_SPDR=selecti; while(SPI_SPSR&(17)=0);以上四句语句即实现了让键盘显示板显示数据的操作,首先,SPI_SPDR=data i;句的作用是向键盘板发送段码,发送出去的段码,最先保
18、存在第一块74LS164中,即对应着位码的管脚,还未真正的起作用。接着,while(SPI_SPSR&(10;dly-)for(n=10000;n0;n-)有了延时函数之后,我们就可以在等待发送位码完成之后,加上一句:DelayNS(1);由于这一句中的参数 dly 的值为1,很小,结合上面给出的延时程序,可以知道延时的时间为CPU运算10000次的时间,然而CPU的运算速度是M级别的,所以延时产生的时间很短暂,我们肉眼很难察觉出来,所以,这样就实现了,视觉上的8个数码显示管看上去同时亮的效果。所以,由此可以看出,要产生视觉上8个数码管同时点亮的操作无非就是尽可能的缩短延时的时间,但是,根据多
19、次试验得知,如果延时的时间小于一定的时刻的时候,数码显示管所显示的数据会很黯淡,所以,既要使延时的时间尽可能短,又必须得避免延时太短所造成的不必要的显示失误。第4章 秒表的实现原理4.1 秒表的设计原理4.1.1 键盘显示板的数码管根据键盘显示板的硬件结构,可以看出,数码管一共有8个LED数码显示管,这样的话,正好可以对应到秒表中的,00-00-00,即,分、秒、0.1秒级三个级别,从左至右分别为:分的十位,分的个位;“-”;秒的十位,秒的个位;“-”;0.1秒的十位,0.1秒的个位;这样,数码显示管的8位全部赋予了作用,并且最低两位的进位速度是很快的,最低位为1/100秒,而第二位为1/10
20、秒。由于操作方便,我的实验程序中,将最低两位改写为1/60秒和1/6秒,但是运算时间和之前是一致的,并不会对秒和分产生任何的影响。有了以上LED数码管和秒表各个位相对应的关系,我们可以进行下一步的软件设计了。4.1.2 键盘显示板中的按键要做出秒表的程序,就必定离不开一个关键的器件,那就是KEY,按键,一旦启动了秒表就必然产生了要暂停和继续的问题。这时,按键和中断的问题就浮出水面了。在这里,我们要利用到第二章中介绍过的IOPIN引脚状态寄存器了,每个引脚的状态都被保存到了这个寄存器当中。我们只需要一句简单的指令便可以知道相对应的引脚是否为低电平,也就是说我们想要知道的引脚上是否有按键按下。在这
21、里就存在了一个问题了,一、键盘显示板上已经有了按键07。二、2103实验板上也自带有按键13;在这里的话,我们就有了一个选择的问题。由于我们的目的很简单,第一,按键可以暂停程序,第二,按键可以继续程序。所以我们不妨就用两个按键,一个启动,一个暂停。于是又了以下两种方案两种情况:1 方案一:利用2013上自带的按键13实现对秒表程序的控制。由于2013上自带的按键所连得引脚我们是已知的,即,P0.16为KEY1、P0.14为KEY2、P0.15为KEY3。所以,该方案相对来说比较简单,只要对相应的引脚进行设置,并在等待按键语句中加入一个变量值,再对另一个按键对应的引脚进行设置并写入另一个变量值。
22、这样就可以区分我们所按的键是哪一个,再通过所按下的键确定秒表的状态。2 方案二:利用键盘显示板上的按键07实现对秒表程序的控制。由于键盘显示板上的8个按键是连在一起的,并且通过跳线直接和2103的P0.5号引脚直接相连,很难区分我们所按下的键是哪一个。这个时候,我们必须在所写的程序中插入一个变量 whichkeydown。并且对其赋值为:whichkeydown=i;i为164中0的循环位置,可以理解为位码的位置,因为位码和按键是连接在一起的,我们首先利用IOPIN&15确定P0.5是否为低电平,即确定是否有按键按下,然后取whichkeydown的值确定按键的序号。这样就可以知道我们按下的是
23、哪一个键了。同样的,我们取最后两个按键有效,一个代表暂停,而另外一个代表继续。同样设置两个变量值,对应两种不同的状态。4.2 秒表的软件设计原理首先,我们应该设置六个变量,分别对应到分秒的十位和个位,根据每一位的进位规律,我们可以这样设置,假如0.1秒的个位加到9后清零个位十位加1。当十位进位到5,个位进位到9后,清零十位,个位。秒的个位加1,秒的个位加到9后,清零秒的个位,秒的十位加1,当秒的十位进位到5,秒的个位进位至9,0.1秒的十位进位至5,0.1秒的个位进位至9时,清零0.1秒的个位,0.1秒的十位,秒的个位,秒的十位,同时分的个位加一。同理一次进行下去。以上思路可以编写成以下程序片
24、段:j+;a+;/*j为 秒 个位*/ if(j=10)j=0; m+;/*M为秒十位*/ if(m=6)m=0; n+;/*N为秒个位*/ if(n=10) n=0; p+;/*P为秒十位*/ if(p=6) p=0; s+;/* S为分个位*/ if(s=4) s=0; d+;/*D为分十位*/ if(d=3) d=0; time0=digetald; time1=digetals; time3=digetalp ; time4=digetaln ; time6=digetalm ; time7=digetalj; time2=digetal10; time5=digetal10;该段程序
25、中,很清楚的,我们可以看到已经设置好的六个变量:j,m,n,p,s,d,;分别代表了0.1秒的个位,0.1秒的十位,秒的个位,秒的十位,分的个位,分的十位。由于键盘显示板的硬件结构,导致该实验所能够支持的单页显示的最高位为分的十位,如果超出该范围的话,所有的数据会清零并从头开始计时。当然,我们,在该段程序开始处会加一段Switch (sta)Case 0:/*该段为程序暂停代码*/break;Case 1:/*该段为程序继续代码*/break;Default :break:写这一段代码的作用很简单,就是确定,当前状态下,秒表程序处于何种状态。Sta为1为暂停,sta为0是程序继续。在此之前,在
26、中断服务程序中应该这样定义,按键:void _irq IRQ1(void) i+; FLAG+; if(i=8) i=0; if(IOPIN&116)=0) sta=0;/*当按下KEY1的时候,sta=0,继续*/ if(IOPIN&114)=0) sta=1;/*当按下KEY2的时候,sta=1,暂停*/ T0IR=0X01; VICVectAddr=0x00; 如以上所述,当P0.16所对应的KEY1有键按下时,将秒表状态变量sta赋值为0,表示暂停秒表。当P0.14所对应的Key2有键按下时,将秒表状态变量sta赋值为1,表示继续秒表。这里强调一点,暂停秒表的意思也就是说不再让所对应的
27、六个变量继续累加,我的操作为,通过switch(sta),首先确定当前秒表的状态,之后,运行过程中,暂停的时刻让程序跳到暂停的程序段中,而暂停的程序段中是这样的:case 1: /*sta=1代表 暂停*/ if(flag=i) if(FLAG%6=0) SPI_SPDR=timei; while(SPI_SPSR&(17)=0); SPI_SPDR=selecti; while(SPI_SPSR&(17)=0); flag+; if(flag=8)flag=0; delay(5);i=(i+1)%8; break;其中,if(FLAG%6=0)的作用为定时为1/60秒,每1/60秒进行一次,
28、之后发送段码,再发送位码,这里要注意的是,i在这里是i=(i+1)%8;即i等于07累加循环,一直在这个过程中,所以这里达到的效果就是,让timei中的八个数据循环的显示出来,而之前我们已经时时刻刻的将当前的数据保存到了timei中。所以,暂停时刻的程序片段就是一直重复的显示最后时刻所存入的时间数据,给人的视觉感受就是时间停留在了该时刻。当我们按下KEY2的时候,sta的值变为0,即秒表继续,这个时候,我们让秒表在此从timei中取出数据,并接下去累加过程,这样子就实现了,看上去,又继续刚才的计时时间的效果了。4.3 总结综上所述,在之前的四个章节的内容里,我已经分别在,第二章,对EasyAR
29、M2103的各个相关引脚,寄存器和模块的硬件部分进行了详细的介绍,之后,我有单独的列出第三章,对实验所用的键盘显示板的硬件的数码管、74LS164移位寄存器芯片,以及按键,引脚,以及电路设计图和原理进行了相关的介绍,从涉及到的软件设计部分的程序以及硬件的几个相关问题进行阐述。最后,第四章,主要介绍了,秒表程序的硬件部分的实现和软件部分的设计。总体上,我的实验过程和程序设计思想已经在各个章节中描述清楚了。接下来的一章,我附上,软件设计部分,即程序清单部分。第5章 相关程序清单的分析和简介/*程序名称:基于键盘显示板的秒表*程序功能:实现按键暂停、继续的秒表功能*作者:罗来贞*最后修改时间:201
30、0-11-21*/*程序相关功能介绍:*1.本程序的主要功能为实现一个六位的秒表功能,包含按键暂停,按键继续功能。*2.其中,当ARM2103上KEY1按下时,变量sta写0表示暂停秒表。当ARM2103*上KEY2按下时,变量sta写1继续秒表。*3.数码管上从右往左依次显示为:00-00-00。格式,即最右边一位表示0.1秒级的*个位,第二位表示0.1秒级的十位。第三位显示-。第四位为1秒级的个位,第五位*显示1秒级的十位。第六位显示-。第七位显示1分级的个位,第八位显示1分级的*十位。*4.也就是说,该程序对的应的秒表,由于硬件的原因最大只能记录至59:59:99的时*刻,也就是说,最大
31、计时时间为1个小时。*/#include config.h#define KEY1 115/*定义P0.15引脚为KEY1*/#define KEY2 10;dly-)for(n=1000;n0;n-);/*函数名称:SPI_Init*函数功能:初始化SPI*输入参数:无*输出参数:无*/ void SPI_Init(void) SPI_SPCCR=0X08; SPI_SPCR|=(02)| (03)| (14)| (15)| (06)| (07); /*函数名称: *函数功能:中断*输入参数:无*输出参数:无*/ /*函数介绍:*在该中断服务程序中,主要是* 1.对变量i,标志量FLAG进行
32、循环更改的作用。当i从0累加至8时,清零i。同*理FLAG的操作也是如此。*2.该服务程序中写入了两句按键的操作语句,即,当kEY1按下时,sta=0;当KEY2*按下时,sta=1;这样通过按键就得到了一个关于秒表状态的变量值,通过该状态变量*值可以确定将程序将进入何种状态。*/ void _irq IRQ1(void) i+; FLAG+; if(i=8) i=0; if(IOPIN&116)=0) sta=0;/*当按下KEY1的时候,sta=0,继续*/while(IOPIN&116)=0);/*等待按键KEY1松开*/ if(IOPIN&114)=0) sta=1;/*当按下KEY2的时候,sta=1,暂停*/while(IOPIN&114)=0);/*等待按键KEY2松开*/ T0IR=0X01; VICVectAddr=0x00; /* 函数名称:Time*函数功能:定时器*输入参数:无*输出参数:无*/*函数介绍:*该定时器服务程序包含两个功能,第一,定时。第二,匹配。*定时操作为,将T0MR0设置为1/360秒,使定时器每1/360秒产生一次匹配。为*什么要设置为1/360秒呢?这是由于秒表的性质决定的。即最低位为1/100秒,只要通*过if(FLAG=6)的操作,可以得到0.1秒级的定时时间。*