基于状态机的程序架构

合集下载

c++状态机编程思路及方法

c++状态机编程思路及方法

C++状态机编程思路及方法==================在C++中,状态机是一种重要的编程模式,用于模拟具有特定状态的系统或过程。

它通过将系统分解为一系列离散的状态,并定义状态之间的转换和事件处理方式,来实现系统的行为控制。

本篇文档将介绍C++状态机编程的思路和方法,主要包括以下方面:1. 确定状态--------在状态机编程中,首先需要确定系统的状态。

这包括定义状态的名称、含义以及状态之间的关系。

通常,一个状态机具有初始状态、结束状态以及一系列中间状态。

确定状态是状态机编程的基础,它能帮助我们清晰地理解系统的行为和流程。

2. 设计状态转换-----------状态转换是状态机编程的核心,它描述了系统在不同状态之间转移的条件和行为。

在设计状态转换时,需要确定触发状态转换的事件、转换的目标状态以及转换过程中的行为。

通常,状态转换图是用来描述状态转换的有效工具。

3. 定义状态类---------在C++中,可以使用类来定义状态和状态转换。

状态类包含了一个状态的属性和行为,以及与其他状态的转换关系。

在定义状态类时,需要确定类的成员函数和数据成员,以及成员函数的实现方式。

4. 实现状态转换-----------实现状态转换是状态机编程的关键步骤。

在C++中,可以通过在成员函数中调用其他成员函数或传递参数来实现状态转换。

在实现状态转换时,需要注意状态的保存和恢复,以确保状态机的正常运行。

5. 处理事件--------事件是触发状态转换的条件。

在状态机中,需要注册和处理各种事件。

处理事件的方式通常是在事件触发时调用相应的成员函数,以实现状态的转换和系统的行为控制。

6. 维护状态--------维护状态是状态机编程的重要环节。

它包括状态的保存和恢复两个方面。

在C++中,可以通过使用数据成员或外部变量来保存和恢复状态。

此外,还需要注意状态的异常处理和边界情况。

7. 测试和调试---------测试和调试是保证状态机编程正确性的重要步骤。

状态机编程思路及方法

状态机编程思路及方法

状态机编程思路及方法以状态机编程思路及方法为标题,写一篇文章。

一、引言状态机是一种常用的编程思路,它可以将程序的状态和状态之间的转换清晰地表达出来,使代码更加易于理解和维护。

本文将介绍状态机的基本概念、原理和实际应用,帮助读者更好地掌握状态机编程思路及方法。

二、状态机的基本概念1. 状态状态指的是程序运行过程中的一个特定阶段或情况,可以是系统状态、对象状态或任务状态等。

状态机将程序的运行过程抽象成一系列离散的状态,这些状态之间通过事件进行转换。

2. 事件事件是触发状态转换的信号或条件,可以是用户的输入、系统的通知或其他外部因素。

当一个事件发生时,状态机会根据当前的状态和事件,决定应该转换到哪个新的状态。

3. 转换转换表示状态之间的切换,它是从一个状态到另一个状态的过程。

转换可以是确定性的,也可以是非确定性的。

确定性转换是指根据当前状态和事件,只能转换到一个确定的新状态;非确定性转换是指根据当前状态和事件,可能转换到多个新状态中的任意一个。

三、状态机的原理状态机的原理是基于有限状态自动机(Finite State Automaton,简称FSA)。

FSA由一组状态、一组输入符号、一组输出符号和一组转移函数组成。

状态机在某个状态下,根据输入符号,通过转移函数确定下一个状态,并输出相应的输出符号。

通过这种方式,状态机能够根据不同的输入,自动地在不同的状态之间切换。

四、状态机的实际应用1. 编译器编译器是一个典型的实际应用场景,其中的词法分析和语法分析阶段使用状态机来处理输入的字符序列。

状态机可以根据不同的字符,切换到不同的状态,从而实现对输入的有效解析。

2. 游戏开发游戏中的角色状态管理、敌人行为控制等都可以使用状态机来实现。

例如,角色可以有站立、行走、奔跑等不同的状态;敌人可以有巡逻、追击、攻击等不同的状态。

通过状态机,游戏开发者可以方便地管理角色和敌人的行为逻辑。

3. 设备控制在嵌入式系统中,状态机常用于对设备的控制和调度。

状态机程序设计

状态机程序设计
6.2 典型状态机设计
典型状态机设计由状态信号定义、准备下一状态进程、状态切换进程、输出进程等四部分构成。 【例6-1】用FPGA/CPLD控制AD574进行12位A/D转换,并将转换结果保存在Q0~Q11中
CE
CS
RC
X12/8
A0
工作状态
0
X
X
X
X
禁止
X
1
X
X
X
禁止
1
0
0
X
0
启动12位转换
状态信号定义:采用枚举数据类型定义系统中有哪些状态,并定义当前状态信号、下一状态信号。一般放在结构体的ARCHITECTURE和BEGIN之间。
在数字系统中,每一状态对应一个二进制数,称状态编码。如AD574控制有5个状态,可用3位二进制表示:(000、001、010、011、100)。
但设计者在状态机的设计中,为了更利于阅读、编译和VHDL综合器的优化,往往将表征每一状态的二进制数组用文字符号来代表,即所谓状态符号化。如(s0,sl,s2,s3,s4,s5),或者(READY,START,WAIT_H, WAIT_L ,READ, LOCK)等更直观的符号表示。
PROCESS(c_st,STATUS) --准备下一状态 BEGIN CASE c_st IS WHEN s0=>n_st<=s1; CE<=‘0’;RC<='0‘;LOCK<='0'; WHEN S1=>n_st<=s2; CE<=‘1’;RC<=‘0’;LOCK<='0‘; WHEN s2=>IF(STATUS='1') THEN n_st<=s3; ELSE n_st<=s2; END 1F; CE<=‘0’;RC<=‘0’;LOCK<=‘0’; WHEN s3=> IF(STATUS='1') THEN n_st<=s3; ELSE n_st<=s4; END 1F; CE<=‘0’;RC<=‘0’;LOCK<=‘0’; WHEN S4=>n_st<=s5;CE<=‘1’;RC<=‘1’;LOCK<=‘0’; WHEN S5=>n_st<=s0;CE<=‘1’;RC<=‘1’;LOCK<=‘1’; WHEN OTHERS=>n_st<=s0; CE<=‘0’;RC<=‘0’;LOCK<=‘0’; END CASE; END PROCESS;

cola statemachine 原理

cola statemachine 原理

Cola StateMachine 原理详解一、引言随着软件工程的不断发展,状态机(StateMachine)作为一种有效的建模工具,在各个领域得到了广泛的应用。

Cola StateMachine 是一种基于状态机的设计框架,它提供了一种清晰、简洁的方式来管理和控制对象的状态转换。

本文将详细介绍 Cola StateMachine 的原理、特点以及应用。

二、状态机基本概念状态机,又称有限状态机(Finite State Machine,FSM),是一种数学模型,用于描述系统或对象在不同状态间的转换行为。

状态机由一组状态(State)和一组事件(Event)构成,当事件发生时,状态机会根据当前状态和事件类型进行状态转换。

三、Cola StateMachine 原理Cola StateMachine 基于状态机的思想,通过引入状态、事件和转换等核心概念,实现了一种灵活且可扩展的状态管理框架。

以下是Cola StateMachine 的核心原理:1.状态(State):在 Cola StateMachine 中,状态是对象在其生命周期内可能处于的不同状况。

每个状态对应一个特定的行为集合,当对象处于该状态时,可以执行这些行为。

2.事件(Event):事件是触发状态转换的外部或内部刺激。

当事件发生时,状态机会根据当前状态和事件类型决定如何进行状态转换。

3.转换(Transition):转换是状态机中从一个状态到另一个状态的过渡过程。

在 Cola StateMachine 中,转换由事件触发,并定义了从一个状态到另一个状态的规则和动作。

4.状态图(State Diagram):Cola StateMachine 使用状态图来可视化地表示状态和转换关系。

状态图可以清晰地展示对象在不同状态下的行为以及状态之间的转换路径。

四、Cola StateMachine 特点1.清晰性:Cola StateMachine 通过状态图提供了直观的状态和转换视图,使得开发人员能够清晰地理解和管理对象的状态。

状态机编程思路及方法

状态机编程思路及方法

状态机编程思路及方法状态机是一种常用的编程思路和方法,用于描述系统或对象在不同状态下的行为和转换。

它可以帮助开发人员更好地理解和设计复杂的系统,并在实际应用中提高代码的可读性和可维护性。

本文将介绍状态机的基本概念、应用场景以及实现方法,并通过示例代码来说明其具体应用。

一、状态机的基本概念状态机,又称有限状态机(Finite State Machine,FSM),是一种计算模型,用于描述系统或对象的状态和状态之间的转换。

它由一组状态、一组转换规则和一个初始状态组成。

1. 状态(State):状态是系统或对象的某种特定情况或属性,可以是一个离散的值或一个更复杂的数据结构。

在状态机中,状态用于描述系统或对象所处的不同状态,例如开机、关机、运行等。

2. 转换(Transition):转换是状态之间的切换过程。

它可以由外部事件触发,也可以由内部条件满足时自动触发。

转换可以是简单的一对一关系,也可以是复杂的多对多关系。

在状态机中,转换规则定义了从一个状态到另一个状态的条件和操作。

3. 初始状态(Initial State):初始状态是系统或对象的初始状态。

在状态机中,初始状态是状态机开始执行时所处的状态。

二、状态机的应用场景状态机广泛应用于各个领域的软件开发中,特别是在需要处理复杂逻辑和状态转换的场景下。

以下是一些常见的应用场景:1. 交通信号灯控制:交通信号灯的状态可以有红灯、黄灯和绿灯,它们之间的转换规则由交通规则和时间控制。

2. 游戏角色行为控制:游戏角色的行为可以有站立、行走、跳跃等,它们之间的转换规则由玩家输入和游戏逻辑控制。

3. 订单状态管理:订单的状态可以有待支付、已支付、待发货、已发货等,它们之间的转换规则由用户行为和系统逻辑控制。

4. 业务流程管理:业务流程的状态可以有开始、进行中、暂停、结束等,它们之间的转换规则由业务规则和用户操作控制。

三、状态机的实现方法状态机的实现方法有多种,可以使用面向对象编程、函数式编程或表驱动等方式来描述和实现状态和转换规则。

简述状态机设计流程

简述状态机设计流程

简述状态机设计流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!简述状态机设计流程一、需求分析阶段。

在设计状态机之前,首先要对具体的需求进行深入分析。

复杂程序plc编程思路框架

复杂程序plc编程思路框架

复杂程序plc编程思路框架PLC编程是自动化控制中重要的一环,而在复杂程序的编写中,更需要一定的思路框架来确保程序的正确性和稳定性。

以下是一个复杂程序PLC编程的思路框架,可以供参考:1. 确定需求和功能在编写复杂程序之前,需要明确需求和功能。

这不仅包括任务的目标和范围,还包括输入信号、输出信号、控制流程等方面。

只有了解了这些,才能制定出正确的程序框架。

2. 划分功能区块将整个程序按照功能进行划分,将不同的功能区块分别编写。

这既有利于程序的模块化,也有利于程序的调试和维护。

3. 建立状态机状态机是一个非常重要的编程思路框架。

在复杂程序中,很多任务都需要分成不同的状态,并按照一定的顺序进行流转。

因此,建立一个状态机来描述状态之间的转换关系是必要的。

状态机的建立可以根据需求和功能的不同来确定。

4. 设计数据结构和算法在编写复杂程序时,需要处理大量的数据和算法。

因此,在编程前需要设计好程序所需的数据结构和算法,以提高效率和程序的可读性。

5. 编写代码在以上工作都完成后,可以开始编写代码了。

根据划分的功能区块和建立的状态机,逐步完成程序的编写。

在这个过程中,需要注意代码的可读性和可维护性,同时也要注意程序的稳定性和安全性。

6. 调试和优化在程序编写完成后,需要进行调试和优化。

通过对程序的测试和调试,发现程序中的问题并进行修复。

同时也要进行程序的优化,提高程序的运行效率和响应速度。

总之,在复杂程序PLC编程中,需要有一个清晰的思路框架来引导程序的编写和调试。

只有这样,才能保证程序的正确性和稳定性。

状态机编程例程

状态机编程例程

状态机编程例程
状态机编程是一种用于描述系统行为的方法,它基于一组状态和状态之间的转换规则来实现。

在状态机中,系统的行为由当前状态和输入决定,并且根据定义好的转换规则来进行状态的转移。

在状态机编程中,首先需要定义系统的状态和输入。

状态可以是系统的某种运行状态或者某种条件的判断结果,而输入则是触发状态转移的外部事件或条件。

系统的状态和输入可以根据实际需求进行定义,以满足具体的业务逻辑。

接下来,需要定义状态之间的转换规则。

转换规则描述了在某个状态下,系统接收到某个输入后应该转移到哪个状态。

转换规则可以使用条件语句或者表格来表示,以便清晰地描述状态之间的关系。

在实际编程中,可以使用代码来实现状态机。

首先,需要定义系统的状态和输入,并使用变量来保存当前状态。

然后,根据定义好的转换规则,编写代码来处理输入,并根据当前状态和输入来更新系统的状态。

最后,根据系统的状态来执行相应的操作或输出结果。

状态机编程可以应用于各种场景,例如游戏开发、网络通信、控制系统等。

通过使用状态机编程,可以简化系统的设计和实现,提高代码的可读性和可维护性。

同时,状态机编程也能够更好地反映系统的行为逻辑,使程序的执行流程更加清晰和可预测。

状态机编程是一种用于描述系统行为的方法,它通过定义系统的状
态和输入以及状态之间的转换规则来实现。

在实际编程中,可以使用代码来实现状态机,并根据系统的状态来执行相应的操作。

通过使用状态机编程,可以简化系统的设计和实现,提高代码的可读性和可维护性,同时也能够更好地反映系统的行为逻辑。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

项目4简易数字钟的设计(2)计算机专业有门必修课程叫“软件工程”,这门课程告诉软件学习者们如何系统性的、规范化的、可定量的过程化方法去开发和维护软件。

我们在学习单片机编程的过程当中,也应该借鉴“软件工程”课程当中的讲述的方法和手段,去维护和规范我们的单片机程序。

在本单元当中,我们安排了4个任务。

任务1介绍了一种基于状态机的程序框架,通过状态机的学习,初学者可以写出思路清晰、多任务运行流畅的程序。

任务2介绍了程序的风格和可移植性,规范了变量和函数等的命名,并简单介绍了C51中提高程序可移植性的方法。

任务3介绍了程序模块化的实现方法,让初学者学会合理的管理程序。

任务4中运用本单元所讲的知识,结合前一单元,完成简易数字钟的设计。

【内容安排】4.1基于状态机的程序框架4.2程序的风格和可移植性4.3程序的模块化4.4简易数字钟的设计任务4.1 基于状态机的程序框架4.1.1任务介绍上一单元中已经多次提到多任务运行时,延时函数(DelayMs())对程序的危害性,堵塞CPU系统任务的实时性得不到有效的保证。

在 3.4节中,提到中断可以提高任务的实时性,但是单片机的中断数量是有限的,不可能每一个任务都有中断。

在 3.5节中,通过定时器中断服务函数提供的时标信号,定时扫描LED和数码管,可以消除延时函数,时标信号给我们提供了一种新的思路来消除延时函数(本质上还是借助于中断)。

但是LED闪烁和动态数码管扫描都是属于状态时间分配均匀的(LED闪烁有两个状态,亮和灭分配时间相等;数码管每个位扫描的时间也相等),程序易于实现。

对于像按键检测这样的(时间分配不均匀的)任务,怎样来消除程序中的延时呢?本节任务是:利用本节所讲“状态机”,改写独立按键程序,并增加“长按”、“连击”等功能。

4.1.2知识准备1、状态机的思想网络上经常报道特级象棋大师车和多人一起下象棋,采用的方式是“车轮战”。

车轮战有两种方式:(1)象棋大师先和甲开始下象棋,直到有了结果,然后才轮到乙和象棋大师对阵,下完了之后,然后是丙……,一直到和最后一个人下完。

(2)象棋大师先和A下一步棋,然后再和B下一步棋,然后再和C,和……,和所有人下完一遍后,再回头从A开始,一个人接一个人。

很显然“车轮战”的第1种方式效率不如第2种方式效率高,报道上的“车轮战”也是指的第2种方式。

原因在于象棋大师的水平远远高于其他人,如果采用第一种方式,象棋大师下一步棋很快,甲需要考虑很长时间才能落子,象棋大师在和甲下棋的过程中,其他人只能等待。

如果采用第二种方式,象棋大师和甲只下一步棋,然后再和乙也下一步棋,和所有人下完一步棋之后,再从甲开始,这样看起来是所有人都在下象棋,效率自然远高于第一种方式。

“车轮战”的第2种方式,实际上就是程序中状态机的基本原理。

程序中的多个任务可以看成是其他棋手,CPU是象棋大师,CPU在执行多个任务时,不再是先执行任务1,执行完任务1后,再执行任务2,而是把每个任务又划分出多个小任务(小任务中没有时间等待),CPU每次只执行每个任务中的小任务,执行完任务1中的一个小任务后,然后快速转向任务 2 中的小任务,按照这种模式轮询下去,由于CPU很快(象棋大师),整个程序中的任务都得到了实时的执行。

任务中的小任务是按照任务的状态来划分的,故称为“状态机”。

上一单元中,利用定时器的时标信号扫描动态数码管的程序实际上也是采用了状态机的原理。

时标信号到来后,CPU扫描1位数码管,然后去执行别的任务,下一个时标信号到来后,再扫描下一位数码管。

6位数码管的扫描被分成了6个子任务,CPU每一次只执行一个子任务。

2、任务的划分数码管扫描的任务划分非常简单,因为每一个子任务执行的时间时均匀的,而且任务很相似。

但是程序中大多数任务划分出来的子任务时间分布不均匀,而且划分出来的子任务不相似。

举个例子,2个LED,第一个LED按照亮1秒,灭2秒的方式闪烁,第2个LED按照亮2秒,灭1秒的方式闪烁,要求不用延时函实现。

我们先给出程序,通过程序学习状态机的实现方法。

整个程序的框架思路清晰,定时器0产生1ms时标信号供主函数使用,主函数每间隔1ms 执行任务1和任务2。

任务1和任务2实现内容类似,下面我们分析任务1的内容。

任务1中的Led1Twinkle()函数是通过状态机完成的,状态机由switch-case 语句构造。

在程序中先定义状态机变量( Led1State,静态局部变量),并赋初值0,以及时间计数变量(Led1Cnt )。

LED1的状态为亮1秒,灭2秒,分2个状态,所以switch-case 语句中对应LED1 的两个状态有两个case分支,状态机变量(Led1State有2个值,分别为0和1。

系统上电运行,1ms时标到来,第一次执行任务1,由于Led1State初值为0,则进入到第一个分支,在case语句中,CPU只执行两条语句:点亮LED1;让计数变量加1( Led1Cnt=1),并判断是否等于1000,如果不是则直接跳出switch-case 语句(break不可以忽略),任务1 执行完毕,然后再执行任务2。

下一个1ms 再到来,再进入第一个分支,计数变量再加1(Led1Cnt=2),再退出,时标信号到来,计数变量再加1, 一直循环下去…。

直到计数变量满足了大于等于1000的条件,则计数变量置0,并把状态机变量置1( LedState=1),指向第二个分支,退出任务。

下一个1ms再次到来时,进入任务1后,根据状态机变量的值,进入到程序的第二个分支,熄灭LED1,重新对计数变量计数,接下来的程序运行模式和第一个分支是一样的。

总结:“状态机”的思想实际上是把系统所有任务按照任务的状态划分出多个子任务,以时标信号为基准,主程序不停的轮询各任务中的子任务。

子任务之间的跳转依靠计数变量计数或者某些状态量的改变。

3、基于状态机的按键检测上一单元中的独立按键的扫描程序如下:在按键的扫描程序中,存在着DelayMs()延时堵塞主程序,比延时更堵塞系统的是等待按键释放语句:while(!Keyl nput); 按键从按下到弹起最小也得几百个ms,程序执行到这一步的话,程序指针长时间停留在等待释放语句上,严重阻碍了其它任务的执行。

总之,这种简单的按键检测方法作为基础学习和简单系统中可以用,但实际产品中,有很大的缺陷和不足。

在实际产品中,基于状态机的按键效率更高,功能强大。

图 4.1.1是基于状态机的独立按键检测的状态转换图,根据按键检测三部曲,分为三个状态。

"状态0”为初次检测按键按下状态。

系统由定时器产生的时标信号来驱动每隔10ms检测按键有没有被按下,如果没有检测到按键按下时,状态机中的状态就会一直停留在“状态0” 上,如果检测到按键按下,则将状态变量指向“状态 1 ”。

“状态1”是按键消抖状态。

在“状态0 ”中首次检测到按键按下后,将状态机变量指向“状态1 ”,下一个10ms到来后,进入到“状态1”中(10ms消抖延时是通过定时器来完成的) 。

在“状态1”中,再次确认按键按下输出键值,并将状态变量指向“状态 2 ”。

“状态2”为按键等待释放状态。

在该状态中,每隔10ms查询一次按键有没有释放。

如果按键没有释放,则CPU一直停留在“状态2”,直到按键释放,将状态机变量指向“状态0”,按键的一次完整的检测过程完成。

图4.1.1独立按键状态机转换图下面是基于状态机按键的一个应用实例:用数码管的前2位显示一个十位数,变化范围为00-99,开始时显示00。

每按一次按键数码管上显示的数值加1,超过99数值重新归0。

程序如下:uchar GetKeyValue(){static uchar KeyState=O;// 按键状态机变量uchar KeyRetur n=0; // 返回键值uchar KeyTemp=O; // 暂存按键值KeyTemp=KeySca n(); // 扫描按键switch(KeyState){case 0:{if(KeyTemp!=Oxff)// 状态0,检测按键是否被按下// 有按键按下,则跳转到状态 1 KeyState=1; }break;case 1:{if(KeyTemp!=0xff) {KeyState=2; // 状态1,延时消抖后再次判断是否被按下// 有按键按下// 跳转到状态1KeyReturn=KeyTemp; // 返回键值elseKeyState=0; }break;case 2:{if(KeyTemp==0xff) // 状态2,等待按键弹起// 按键弹起,则返回到状态0KeyState=0; }break; }return KeyReturn;}//主函数void mai n(){uchar KeyValue=0; // 返回键值// 键值uchar Cn t1Ms=0; //1ms 计数变量char DispNum=0; // 数码管显示变量,变量类型为有符号while(1)程序解释:(1)主函数中的任务由定时器产生的1ms时标信号驱动,每隔1ms,刷新- 扫描一位数码管,同时计数变量Cnt1Ms加1。

当计数变量Cnt1Ms满足>=10时, 次缓冲区和10ms时标信号到,执行一次按键扫描,取得键值,并根据键值完成对应功能。

(2)KeySca n()函数完成按键状态的扫描,并返回状态值( temp), temp取值为0x01、0x02分别对应2个按键的按下,如果没有按键按下,则temp为0xf 。

GetKeyValue()根据按键检测三部曲的原理,通过状态机的方法获取键值。

通过定时器产生的10ms时标信号,每间隔10ms进入一次GetKeyValue()函数中。

(3)在GetKeyValue()函数中,状态机由switch-case 语句构成,有3个状态,分别为:初次检测到按键按下,10ms消抖延时再判断和等待按键弹起。

系统根据按键状态值(KeyTemp)实现状态之间的跳转。

每一个case语句后面的break不可省略,意味着每进入一次GetKeyValue()只执行当前状态中的任务,然后退出函数。

在状态0中,通过按键状态扫描函数( KeyScan())判断按键有没有按下,如果没有按键按下(KeyTemp==0xff),不做任务处理(状态机变量KeyState保持为0),退出函数后,下一个10ms,仍然进入状态0。

如果有按键按下(KeyTemp!=0xff),将状态机变量指向状态 1 (即KeyState=1),退出函数后,下一个10ms到来,系统根据状态机变量的值,进入到状态1中。

从状态0中退出到进入到状态1中,经过了10ms,这10ms恰好是按键消抖的时间。

在状态1中,再次判断按键是否按下,如果有按键按下,则返回按键值,并将状态机变量指向状态2( KeyState=2 )。

相关文档
最新文档