《微处理器程序设计技术.ppt》由会员分享,可在线阅读,更多相关《微处理器程序设计技术.ppt(86页珍藏版)》请在三一办公上搜索。
1、键盘输入接口与状态机编程,摘自,1、通用I/O数字输入接口设计,假如把一个单片机嵌入式系统比做一个人的话,那么单片机就相当于人的心脏和大脑,而输入接口就好似人的感官系统,用于获取外部世界的变化、状态等各种信息,并把这些信息输送进人的大脑。嵌入式系统的人机交互通道、前向通道、数据交换和通信通道的各种功能都是由单片机的输入接口及相应的外围接口电路实现的。,对于一个电子系统来讲,外部现实世界各种类型和形态的变化和状态都需要一个变换器将其转换成电信号,而且这个电信号有时还需要经过处理,使其成为能被MCU容易识别和处理的数字逻辑信号,这是因为单片机常用的输入接口通常都是数字接口(A/D接口,模拟比较器除
2、外,他们属于模拟输入口,而是在芯片内部将模拟信号转换成数字信号的),上述的“变换器”和“转换处理”从专业的角度讲就是“传感器技术”和“信号调理电路”。因此,一个单片机嵌入式系统的设计和开发人员要具备这些专业知识和技能,不仅要熟悉一些常用传感器的特性和应用,以及相关的信号调理、转换、接口电路,还要跟踪国际上新技术的发展,将新型传感器器件和新型电路元器件应用于系统设计中。,采用新型传感器器件和新型电路元器件,可以大大提高嵌入式系统设计的效率,简化系统的硬件结构和软件设计难度,缩短开发周期,提高系统的性能和可靠性。根据系统外围电路输入的电信号形式,可以把输入信号分为以下几种形式:,1.1.1 I/O
3、输入接口硬件设计要点,(1)模拟信号和数字信号。传感器将某个外部参数(如温度、转速)的变化转换成电信号。如果传感器输出电信号的幅度变化特征代表了外部参数的变化,如电压的升高下降(电流增大减小)表示温度高低的变化,那么这个传感器就是模拟传感器,它产生是模拟信号。由于MCU是数字化的,因此模拟信号要转换成数字信号才能由MCU处理。转换电路称为模数转换“A/D”。,A/D变换是嵌入式系统重要的外围接口电路之一,用途广泛。在系统硬件设计中可以选取专用的A/D变换芯片作为模拟传感器和单片机之间的接口,也可以选取片内带A/D转换功能的单片机以简化硬件电路的设计。,(2)电压信号和电流信号,单片机I/O接口
4、的逻辑是数字电平逻辑,既以电压的高和低电平作为逻辑“1”和“0”,因此进入单片机的信号要求是电压信号。一些传感器的输出是电流信号,甚至是微小的电流,那么在进入单片机前还需要将电流信号放大、并把电流转换成电压的信号调理电路。,在一些长远距离的应用中,考虑到电压信号的抗干扰能力差,长线衰减等因素,往往在一端把电压信号变成电流信号,在长线中传送电流,而在另一端再把电流信号再转换成电压信号,这样大大提高了信号传输的可靠性,如RS-485通信等。另外,为了防止外部强电信号对嵌入式系统的冲击而使用的光电隔离技术,也采用电流/电压变换方法。,(3)单次信号和连续信号,间隔时间较长单次产生的脉冲信号,以及较长
5、时间保持电平不变化的信号称为单次信号。常见的单次信号一般是由按键、限位开关等人为动作或机械器件产生的信号。而连续信号一般指连续的脉冲信号,如计数脉冲信号,数据通信传输等。,单次信号要注意信号的纯净和抗干扰,如消除按键的抖动,外部的干扰等。在图中,外部状态开关与系统之间采用电流传输方式,在系统入口串接磁阻线圈。当外部开关闭合后,回路中有大电流通过,光电器件导通输出“0”;,而在开关断开后,回路中无电流流通,光电器件不会导通输出“1”。空间的电磁信号会在传输线上产生高频的干扰信号,磁阻线圈则对高频信号起到阻碍作用,使电流不能突变。,另外空间电磁干扰往往能产生较高的干扰电压,但不会产生大的干扰电流(
6、mA),而没有毫安级的电流在回路中流过,光电器件是不会导通的。所以采用上面的电路设计,就能有效提高系统的抗干扰性。此外,采用光电隔离设计后,当外部有强信号冲击时,只能把隔离器件损坏,有效地保护了弱电系统本身。,连续信号往往在数据交换和通信通道中使用,其特点是对时间定位、捕捉、时序的要求较高,通常要对信号的边沿(上升沿或下降沿)进行检测,或由信号的边缘触发。此时外围器件的选择应符合频率的要求,同时还要求程序员熟悉信号的时序以及相关的通信接口协议等。,1.1.2 I/O输入接口软件设计要点,根据不同的硬件接口电路和嵌入式系统功能需求的不同,输入接口软件的设计也是千百万化、丰富多彩的。设计开发一个好
7、的嵌入式系统产品,不仅要求软件设计人员要具备很强的硬件能力,还要有相当高的软件设计编程能力和经验。这是开发嵌入式系统的特点:硬件软件不可分割,同等重要。,按键和键盘接口的软硬件设计与实现,按键和键盘是单片机嵌入式系统中一个重要的组成部分,虽然在硬件电路上的连接实现非常简单,但由于按键其本身的特殊性(如需要考虑消除抖动,确认释放等)和功能的多样性(如连续按键,多功能等),它的软件接口程序的设计和实现要相对复杂些。,在学习本章的内容时,更重要的是掌握系统软件设计编写的方法和技术,采用模块化的思想实现功能模块的单一性、独立性,以及学习基于状态机思想的程序设计方法。,1.2 按键输入接口设计,在单片机
8、嵌入式系统中,按键和键盘是一个基本和常用的接口,它是构成人机对话通道的一种常用的方式。按键和键盘能实现向嵌入式系统输入数据、传输命令等功能,是人工干预、设置和控制系统运行的主要手段。,1.2.1 简单的按键输入硬件接口与分析,键盘是由一组按键组合构成的,所以我们先讨论简单的单个按键的输入。上图是简单按键输入接口硬件连接电路图,图中单片机的三个I/O口PC7、PC6、PC5作为输入口(输入方式),分别与K3、K2、K1三个按键连接。其中K2是标准的连接方式,当没有按下K2时,PC6的输入为高电平,按下K2输入为低电平。PC6引脚上的电平值反映了按键的状态。,根据按键连接电路可知,按键状态的确认就
9、是判别按键是否闭合,反映在输入口的电平就是和按键相连的I/O引脚呈现出高电平或低电平。如果输入高电平表示断开的话,那么低电平则表示按键闭合,所以简单的讲,在程序中通过检测引脚电平的高低,便可确认按键是否按下。,但对于实际的按键确认并不是象上面描述的那么简单。首先要考虑的是按键消抖的问题。通常,按键的开关为机械弹性触点开关,它是利用机械触点接触和分离实现电路的通、断。由于机械触点的弹性作用,加上人们按键时的力度、方向的不同,按键开关从按下到接触稳定要经过数毫秒的弹跳抖动,既在按下的几十毫秒时间里会连续产生多个脉冲。,释放按键时,电路也不会一下断开,同样会产生抖动,这两次抖动的时间分别为10-20
10、ms左右,而按键的稳定闭合期通常大于秒。因此,为了确保MCU对一次按键动作只确认一次,在确认按键是否闭合时,必须要进行消抖处理。否则,由于MCU软件执行的速度很快,非常可能将抖动产生的多个脉冲误认为多次的按键。,消除按键的抖动既可采用硬件方法,也可采用软件的方法。使用硬件消抖的方式,需要在按键连接的硬件设计上增加硬件消抖电路,如采用R-S触发器或RC积分电路等。采用硬件消抖方式增加了系统的成本,而利用软件方式消抖则是比较经济的做法,但增加了软件设计的复杂性。,软件方式消抖的基本原理是在软件中对按键进行两次测试确认,既在第一次检测到按键按下后,间隔10ms左右再次检测该按键是否按下,只有在两次都
11、测到按键按下时才最终确认有键按下,从而消除了抖动的影响。在按键接口软件中,除了要考虑按键消抖外,一般还要判别按键的释放,只有检测到按键释放以后,才能确定为一次完整的按键动作完成。,1.2.2 基于状态机的按键输入软件接口设计,一般的教课书中给出的按键输入软件接口程序通常非常简单,在程序中一旦检测到按键输入口为低电平时,便采用(调用)软件延时程序延时10ms。然后再次检测按键输入口,如果还是低电平则表示按键按下,转入执行按键处理程序。,如果第二次检测按键输入口为高电平,则放弃本次按键的检测,从新开始一次按键检测过程。这种方式实现的按键输入接口,作为基础学习和一些简单的系统中可以采用,但在多数的实
12、际产品设计中,这种按键输入软件的实现方法有很大的缺陷和不足。,上面所提到简单的按键检测处理方法,不仅是由于采用了软件延时而使的MCU的效率降低,而且也不容易同系统中其它功能模块协调工作,系统的实时性也差。,另外,由于在不同的产品系统中对按键功能的定义和使用方式也会不同,而且是多变的,加上在测试和处理按键的同时,MCU还要同时处理其它的任务(如显示、计算、计时等),因此编写键盘和按键接口的处理程序需要掌握有效的分析方法,具备较高的软件设计能力和程序编写的技巧。,可以先仔细观察一下实际产品中各种按键的功能和使用。如一般的电子手表上只有2-3个的按键,却要实现时间、日期、闹钟时间的设置和查看显示等多
13、种功能,因此这些按键是多功能(或复用)的,在不同的状态下,按键的功能也不同。,更典型的是手机的键盘,就拿手机键盘上的数字键“2”来将,当手机用于打电话需要拨出电话号码时,按“2”键代表数值“2”。而使用手机发短信用于输入短信文字信息时(英文输入),第一次按下“2”键为字母“A”,紧接着再次按下为字母“B”,连续短时间按下该键,它的输入代表的符号不同,但在同一个位置,而稍微等待一段时间后,光标的位置就会右移,表示对最后输入字符的确认。,因此,按键输入接口设计和实现的核心,更多的体现在软件接口处理程序的设计中。下面将以此为例,介绍有限状态机的分析设计原理,以及基于状态机思想进行程序设计的基本方法与
14、技巧。,一、有限状态机分析设计的基本原理,对于电子技术和电子工程类的读者,最先接触和使用到状态机应该是在数字逻辑电路课程里,状态机的思想和分析方法被应用于时序逻辑电路设计。其实,有限状态机(FSM)是实时系统设计中的一种数学模型,是一种重要的、易于建立的、应用比较广泛的、以描述控制特性为主的建模方法,它可以应用于从系统分析到设计(包括硬件、软件)的所有阶段。,很多实时系统,特别是实时控制系统,其整个系统的分析机制和功能与系统的状态有相当大的关系。有限状态机由有限的状态和相互之间的转移构成,在任何时候只能处于给定数目的状态中的一个。当接收到一个输入事件时,状态机产生一个输出,同时也可能伴随着状态
15、的转移。,一个简单的有限状态机在数学上可以描述为:,在状态机中,时间序列也是非常重要的一个因素,从硬件的角度看,时间序列如同一个触发脉冲序列或同步信号,而从软件的角度看,时间序列就是一个定时器。,状态机由时间序列同步触发,定时检测输入,以及根据当前的状态输出相应的信号,并确定下一次系统状态的转移。在时间序列进入下一次触发时,系统的状态将根据前一次的状态和输入情况发生状态的转移。,其次,作为时间序列本身也可能是一个系统的输入信号,影响到状态的改变,进而也影响到系统的输出。所以对于时间序列,正确分析和考虑选择合适的时间段的间隔也是非常重要的。,间隔太短的话,对系统的速度、频率响应要求高,并且可能减
16、低系统的效率;间隔太长时,系统的实时性差,响应慢,还有可能造成外部输入信号的丢失。一般情况下,时间序列的时间间隔的选取,应稍微小于外部输入信号中变化最快的周期值。,通常主要有两种方法来建立有限状态机,一种是“状态转移图”,另一种是“状态转移表”,分别用图形方式和表格方式建立有限状态机。实时系统经常会应用在比较大型的系统中,这时采用图形或表格方式对理解复杂的系统具有很大的帮助。,总的来说,有限状态机的优点在于简单易用,状态间的关系能够直观看到。应用在实时系统中时,便于对复杂系统进行分析。下面将给出两个按键与显示相结合的应用设计实例,结合设计的例子,讨论如何使用有限状态机进行系统的分析和设计,以及
17、如何在软件中进行描述和实现。,二、基于状态机分析的简单按键设计(一),我们把单个按键作为一个简单的系统,根据状态机的原理对其动作和确认的过程进行分析,并用状态图表示出来,然后根据状态图编写出按键接口程序。把单个按键看成是一个状态机话,首先需要对一次按键操作和确认的实际过程进行分析,根据实际的情况和系统的需要确定按键在整个过程的状态,每个状态的输入信号和输出信号,以及状态之间的转换关系。最后还要考虑时间序列的间隔。,采用状态机对一个系统进行分析是一项非常细致的工作,它实际上是建立在对真实系统有了全面深入的了解和认识的基础之上,进行综合和抽象化的模型建立的过程。这个模型必须与真实的系统相吻合,既能
18、正确和全面的对系统进行描述,也能够适合使用软件或硬件方式来实现。,在一个嵌入式系统中,按键的操作是随机的,因此系统软件对按键需要一直循环查询。由于按键的检测过程需要进行消抖处理,因此取状态机的时间序列的周期为10ms左右,这样不仅可以跳过按键抖动的影响,同时也远小于按键秒的稳定闭合期,不会将按键操作过程丢失。,很明显,系统的输入信号是与按键连接的I/O口电平,“1”表示按键处于开放状态,“0”表示按键处于闭合状态。而系统的输出信号则表示检测和确认到一次按键的闭合操作,用“1”表示。,上图给出了一个简单按键状态机的状态转换图。在图中,将一次按键完整的操作过程分解为3个状态,采用时间序列周期为10
19、ms。下面对该图做进一步的分析和说明,并根据状态图给出软件的实现方法。,首先,读者要充分体会时间序列的作用。在这个系统中,采用的时间序列周期为10ms,它意味着,每隔10ms检测一次按键的输入信号,并输出一次按键的确认信号,同时按键的状态也发生一次转换。,图中“状态0”为按键的初始状态,当按键输入为“1”时,表示按键处于开放,输出“0”(1/0),下一状态仍旧为“状态0”。当按键输入为“0”,表示按键闭合,但输出还是“0”(0/0)(没有经过消抖,不能确认按键真正按下),下一状态进入“状态1”。,“状态1”为按键闭合确认状态,它表示了在10ms前按键为闭合的,因此当再次检测到按键输入为“0”时
20、,可以确认按键被按下了(经过10ms的消抖),输出“1”表示确认按键闭合(0/1),下一状态进入“状态2”。而当再次检测到按键的输入为“1”时,表示按键可能处在抖动干扰,输出为“0”(1/0),下一状态返回到“状态0”。这样,利用状态1,实现了按键的消抖处理。“状态2”为等待按键释放状态,因为只有等按键释放后,一次完整的按键操作过程才算完成。,从对图的分析中可以知道,在一次按键操作的整个过程,按键的状态是从“状态0”-“状态1”-“状态2”,最后返回到“状态0”的。并且在整个过程中,按键的输出信号仅在“状态1”时给出了唯一的一次确认按键闭合的信号“1”(其它状态均输出“0”)。,所以上面状态机
21、所表示的按键系统,不仅克服了按键抖动的问题,同时也确保在一次按键整个的过程中,系统只输出一次按键闭合信号(“1”)。换句话讲,不管按键被按下的时间保持多长,在这个按键的整个过程中都只给出了一次确认的输出,因此在这个设计中,按键没有“连发”功能,它是一个最简单和基本的按键。,一旦有了正确的状态转换图,就可以根据状态转换图编写软件了。在软件中实现状态机的方法和程序结构通常使用多分支结构(IF-ELSEIF-ELSE、CASE等)实现。下面基于状态机方式编写的简单按键接口函数read_key()。,该简单按键接口函数read_key()在整个系统程序中应每隔10ms调用执行一次,每次执行时将先读取与
22、按键连接的I/O的电平到变量key_press中,然后进入用switch结构构成的状态机。,switch结构中的case语句分别实现了3个不同状态的处理判别过程,在每个状态中将根据状态的不同,以及key_press的值(状态机的输入)确定输出值(key_return),和确定下一次按键的状态值(key_state)。,函数read_key()的返回参数提供上层程序使用。返回值为0时,表示按键无动作;而返回1表示有一次按键闭合动作,需要进入按键处理程序做相应的键处理。,在函数read_key()中定义了3个局部变量,其中key_press和key_return为一般普通的局部变量,每次函数执行时
23、,key_press中保存着刚检测的按键值。key_return为函数的返回值,总是先初始化为0,只有在状态1中重新置1,作为表示按键确认的标志返回。,变量key_state非常重要,它保存着按键的状态值,该变量的值在函数调用结束后不能消失,必须保留原值,因此在程序中定义为“局部静态变量”,用static声明。如果使用的语言环境不支持static类型的局部变量,则应将key_state定义为全局变量。,单按键的实时时钟秒校时设置设计(一),1)硬件电路在前面的章节中曾几次给出了简易实时时钟的设计例子,但都没有加入按键,不能实现时钟校时的设置。下面结合上面的按键接口的设计,实现对时钟的校时设置。
24、在该例子中,只是实现了秒单元的校时设置,其重点是让读者体会和实践按键输入接口和处理的实现。,时钟系统的硬件电路在I/O口PD7上连接一个按键K1,该按键的功能为秒加1,既每按下一次,秒加1,到60秒时分加1,秒回到为0。,2)软件设计 以下是采用一个简单按键实现秒单元的校时设置系统的程序。程序中,给出了采用一个简单按键实现时钟校时(仅秒位)设置功能的基本设计,时钟本身的计时显示方法用秒闪烁表示(每秒种LED数码管的小数点段闪烁一次)。,T/C0的工作于CTC方式,每2ms产生中断。在T/CO中断服务中增加了10ms到的标志变量key_stime_ok,作为按键状态机的时间触发序列信号。在主程序
25、中,每隔10ms调用read_key()按键接口程序,当函数返回值为1时,说明产生了一次按键操作过程,秒位加1,然后进行时间调整。,三、基于状态机分析的简单按键设计(二),在上面的例子中,对秒的校时设置操作还是不方便,例如,如果将秒从00设置为59,需要按键59次。如果将按键设计成一个具有“连发”功能的系统,就能很好的解决这个问题。,现在考虑这样的一个按键系统:当按键按下后在1秒内释放了,此时秒计时加1,而当按键按下后在1秒内没有释放,那么以后每隔0.5秒,秒计时就会自动加上10,直到按键释放为止。这样的按键系统就具备了一种“连发”功能,其中时间也成为系统的一个输入参数了。,具有“连发”功能的
26、按键系统状态转换图,在图中,按键系统输出“1”表示按键在1秒内释放了,输出“2”表示按键产生一次“连发”的效果。下面是基于状态机方式编写的带“连发”功能按键接口函数read_key_n()。,函数read_key_n()与前面的read_key()结构非常类似,设计为每隔10ms被调用执行一次,在构成状态机的switch结构中使用了局部静态变量key_time作为按键时间计数器,记录按键按下的时间值。,函数read_key_n()的返回参数提供上层程序使用。返回值为0时,表示按键无动作;返回1表示一次按键的“单发”(1s)动作;返回2表示一次按键的“连发”动作,提供按键处理程序做相应的键处理。,单按键的实时时钟秒校时设置设计(二),主程序中,每隔10ms调用read_key_n()按键接口程序,并根据其返回值对秒位的时间进行加1或加10的处理。,