实验一 软件界面评估
一、实验目的:
1、通过界面评估,使学生掌握针对交互系统的评估方法。
2、根据提供的标准对QQ或者 OFFICE中的WORD、再自选一个软件共两个软件进行评估。
二、实验步骤:
1)依据已学的人机界面知识对评估指标进行分析研究;
2)对QQ、OFFICE中的WORD以及自选两个软件进行评估,10分制,给出每个软件的平
均分;
2)对每个软件的评估结果进行总结;
3)完成实验报告;
4)可以对指标进行改进,但必须有合理改进理由。
三、使用仪器、材料
Windows XP
实验一指导书
四、实验报告:
1)按格式书写实验报告;
2)提交实验报告。
第二篇:实验4 人机交互任务的设计
实验4 人机交互任务的设计
1.实验目的
(1)理解键盘模块和LED模块在µC/OS-II下的工作原理。
(2)掌握任务间通信机制——信号量。
(3)掌握在µC/OS-II下的MCU中键盘模块和LED模块的C编程方法。
(4)进一步体会基于实时操作系统的程序与前后台程序的不同之处。
2.实验任务
(1)通过本实验掌握键盘模块以及LED模块在µC/OS-II下的工作原理。
(2)根据实验提示,使用键盘与LED模块实现一个简单的人机交互任务。
在µC/OS-II下按下矩阵键盘上相应按键,其键值在LED上显示出来,同时发送给PC机。
3.预习要求
1.充分了解键盘的硬件电路以及识别键盘时存在的问题。在本次实验中大家应首先回顾一下矩阵式键盘结构,同时要熟悉RTOS下键盘模块的相关代码。可参考《嵌入式系统构件》第3章的键盘章节。
在RTOS下编写程序,对任务的管理主要是通过 OSStartHighRdy(), OSCtxSw(),OSIntCtxSw(), OSTickISR(),OSTaskStkInit()这五个函数实现的。大家首先要理解这些函数的工作原理。以及任务间的通信机制如信号量、邮箱、队列等概念和原理。
本实验在任务间通信时采用的是信号量,此内容可参考《嵌入式实时操作系统UC/OS-II》的第七章信号量管理。
2.实验之前需要查阅相关资料掌握一些有关LED数码管的基本知识,①首先需要熟悉一下LED模块的硬件结构,LED简称发光二极管,是可发光的半导体设备,一般门槛电压在1.6V~2.0V之间, LED数码管分共阳极与共阴极两种,其工作特点是,共阳极接高电平,使用低电平点亮数码管;共阴极接低电平,使用高电平点亮数码管。针对具体硬件看看共阴极与共阳极有什么区别。②熟悉七段数码显示器多路复用技术的特点,看看七段与通常所说的八段有什么不一样?③数码管主要是由段码与位码控制的,在电路图中什么是段码,什么是位码?同时请思考段码与位码是如何工作的?是如何控制LED的?
4.实验提示
1.本次实验使用的矩阵式键盘的电路图如下图4.1所示:
图4.1矩阵式键盘的电路图
采用4*4键盘,因此将键盘的行、列共8条线连接到PTA口上,其中行1-4连接到PTA0-3上,列1-4连接到PTA4-7上。即“行”对应XS128端口A的高四位。“列”对应端口A的低四位。按下相应的键会将按键的相应值输出到LED指示灯显示。如按下键A,将会把十六进制0xA的二进制编码的反码显示在指示灯上,即0101,因为LED指示灯为低电平时显示亮的状态,故将0xA的值取反会更直观。
键盘需要解决的核心问题包括扫描和去抖。之前学习的键盘扫描有行扫描法和反转法两种。在此不累述。下面主要分析一下去抖机制(状态机原理)。
键盘扫描任务还要解决按键抖动的问题。为了方便理解,先在一个完整的按键过程中定义几个状态。第N次采样时无键按下,此时键处于初态;N+1次采样时第一次采到有键按下,键进入次态,此时按键尚不稳定;N+2 采样时为连续第二次采到有键按下,键进入初稳态,次态之后初稳态之前的这段20ms的时间称为去抖周期; N+3次采样时为连续第三次采到,键进入持续稳定态,第N+I+1 次采样时为抬键后第一次被采到,此时键又回到了初态。因此把键态分为四种情况:初态,次态,初稳,稳定态;
为了使程序根据键态进行相应的处理,键盘扫描程序应为每一个按键设置状态单元,根据每个扫描周期采样到的键的即时状态是开或是关,再结合原来的键态得到现在的键态。可以建立一个状态机来扫描键盘。如图4.2所示状态机在每个扫描周期执行一次。
图4.2矩阵键盘状态机
有上述分析得:我们可用一个单独的任务KeyScanTask()来扫描键盘。当应用程序调用了KeyInit()时,KeyScanTask()将被创建。一旦被创建后,KeyScanTask()将每KEY_SCAN_TASK_DLY毫秒执行一次。KEY_SCAN_TASK_DLY应该被设置为产一个范围在的10~30Hz的扫描频率之间(即33~100ms之间) 。在键盘扫描模块中,KeyScanTask ()函数发挥着相当重要的作用,它负责扫描任务,通过keyInitport()函数、读取列状(KeyGetCol)、写行状态(KeySelRow)函数与硬件打交道来扫描相应的行和列。
键盘扫描任务并不解决所有的问题,它所做的工作包括扫描键盘、去除抖动、按盘编码等,当然最终要把按键编码送入缓冲区keyBuf[],应用程序可以透过接口函数从该缓冲区得到键编码值(可采用信号量机制来标志是否有按键发生),维护这个缓冲区还需要两个指针:读指针和写指针,以及一个键计数器。
通过上图4.1和图4.2我们可以知道:
刚开始的时候,该状态机处于KEY_STATE_UP()状态。当有键被按下时,则该状态机的状态改变为KEY_STATE_DEBOUNCE()次态,随后它将执行KEY_SCN_TASK毫秒。请注意µC/OS-II中的函数OSTimeDlyHSM()提供一个便利的方法来除去回弹且在规定的时间间隔内扫描键盘。
在该延迟后,KeyScanTask()在KEY_STATE_DEBOUNCE状态下执行代码,再次检查看是否有键被按下。如果键被释放,状态机将返回到KEY_STATE_UP状态。如果该键仍然被按下,则通过调用KeyDecode()可以找到该扫描代码,并且通过KeyBufIn()把它插入到这个循环的缓冲区中。如果缓冲区已经满了,KeyBufIn()将丢弃扫描码。KeyBufIn()也给键盘发信号量,允许应用程序通过KeyGetKey()来获得该键的扫描码。然后这个状态机改变为KEY_STATE_RPT_DLY状态。
如果该键按下的时间多于KEY_RPT_START_DLY扫描时间,则自动重复功能将会启动。在这种情况下,该扫描码将插入被到缓冲区中,且状态改变为KEY_STATE_RPT_DLY状态。如果改键不再被按下,则该状态机的状态改为KEY_STATE_DEBOUNCE状态,用来去除被释放键的回弹。
在一个扫描周期后,KeyScanTask()在Key_State_Rpt_Dly状态下执行代码,其中被按下键的扫描码将每隔KEY_RPT_DLY扫描时间被插入到缓冲区中。像其他状态一样,如果键被释放,就需要去除回弹。
图4.3矩阵键盘模块驱动程序流程图
图4.3展示了µC/OS-II平台上工作的矩阵键盘模块的流程图。
2.(1)七段LED显示器由7条发光二极管组成,并按“日”字型排列。显示段可分别记为a、b、c、d、e、f、g,有的还带有一个小数点dp,可以用来显示数字和部分字符。一个LED硬件的具体电路图如下图4.4所示,
图4.4一个LED硬件的具体电路图
(2)7段数码管可分为共阳极和共阴极两种,如下图4.5所示。共阴极7段数码管的信号端高电平有效,只要在各个位段上加上相应的信号即可使相应的位段发光,共阳极的7段数码管则相反,在相应的位段加上低电平即可使该位段发光。
图4.5 LED公共端
(3)7段数码显示器多路复用技术的工作方式就是一个一个地轮流点亮各个七段数码显示器,通过恰当地选择点亮7段LED的时间间隔(1~5ms),给人一种视觉暂留的效应,感觉每个LED都在同时显示。除了要给七段LED显示器提供段选码之外,还要提供一个位选码,位选码就是控制每个7段LED显示位轮流接地点亮的代码。更多相关具体信息请参照其它资料,下图4.6是本次实验用到的数码管模块的电路图:
图4.6数码管模块的电路图
如图4.6所示,上面的那个输出端口是用来控制LED的“段”,即每一段是否点亮的情况。下面的输出端口是控制“位”的,即每一个LED的电源接通情况。MCU通过使用一个输出端口,可以控制一个或多个LED,通过在该端口的合适比特位上写一个0或1电位用来开启LED(本实验使用的是共阳极数码管,所以输送的是1电位)。如果需要额外的LED,可以增加一个或更多的8位端口。这个额外的端口可以用来控制更多的数字或段。增加一个数字端口将增加MPU的系统开销,但是不会增加系统的电流消耗。如果愿意减少系统开销,可以增加段的端口。但要增加电流开销。
本实验提供的代码允许多路复用的LED多达64个(需要使用两个8位的输出端口),如果需要增加更多的七段数字或者离散的LED,可以很容易的对该模块进行修改。
在软件中设计实现多路技术如图4.7所示。假设数字少于8个,同时需要硬件计时器,它能够以一定的速率产生中断:
图4.7 LED多路技术
表DispSegTbl[ ]包含了相对应数字的段字型数据,DispSegTbl[ ]中的第一个元素包括最左边数字的段字型。DispSegTblIx是对应于段表的索引,该表将指向下一个要显示的数字,DispDigMsk是一个掩码,用来选择下一个要显示的数字,相当于位选码,在任意时刻,仅有一个数字可以被显示。在选择下一个数字之前,DispMuxISR()将关闭当前数字的段,这个步骤用来防止显示闪烁,如果显示段在下一个数字被选择之前没有被关闭,以前的段将出现在新的被选的位上。DispMuxISR()只关心以一定的刷新速率更新显示。段显示数据如何写入DispSegTbl[ ]由是任务级代码负责。
LEDInit ()初始化模块的内部变量,且初始化硬件端口。在这个函数中,建立一个消息邮箱,用于接收更新LED显示的数据。
DispClrScr()用来清除显示器。
DispStr ()用来显示一个ASCII字符串。
DispStatClr ()用来开启一个单独的LED。
DispStatSet ()用来关闭一个单独的LED。
最后我们还要配置一下系统文件:
首先在OS_CPU_C.C文件中添加需要调用CLK和LED中函数的声明。
extern void ClkSignalClk(void);
此函数用于通知ClkTask任务更新秒计数器,此处为配合LED使用,提高LED刷新频率,时钟节拍需要增加为原始周期的十倍,此时系统时钟的周期为 2ms(1S=1000ms,1ms=1000us)。
extern void DispMuxHandler (void);
此函数用于按将高的频率刷新LED显示数据,实际上同一时刻只有一个LED显示数据。
5.实验说明
程序描述:将编译生成的.S19文件下载在核心板上运行后,任务1和任务2通过串口在超级终端上显示信息,而键盘则通过lED灯把按键值显示出来。即在矩阵键盘上按下相应的键值对应LED上相应灯亮,如按下B,会将对应的二进制编码的反码显示在指示灯D40~D43上,即0100通过这4个任务来完成对键盘的测试。
思考:
是否可采用别的通信机制来实现人机交互? RTOS下键盘模块与其它模块如何结合使用?