📄 dinosaur.c
字号:
/*------------------------------------------------------------------*-
Dinosaur.C (v1.00)
------------------------------------------------------------------
Demonstration of multi-state (timed) architecture:
Dinosaur control system.
COPYRIGHT
---------
This code is associated with the book:
EMBEDDED C by Michael J. Pont
[Pearson Education, 2002: ISBN: 0-201-79523-X].
This code is copyright (c) 2001 by Michael J. Pont.
See book for copyright details and other information.
-*------------------------------------------------------------------*/
#include "Main.h"
#include "Port.h"
#include "Dinosaur.h"
// ------ Private data type declarations ---------------------------
// Possible system states
typedef
enum {SLEEPING, WAKING, GROWLING, ATTACKING} eDinosaur_State;
// ------ Private function prototypes ------------------------------
void DINOSAUR_Perform_Sleep_Movements(void);
void DINOSAUR_Perform_Waking_Movements(void);
void DINOSAUR_Growl(void);
void DINOSAUR_Perform_Attack_Movements(void);
// ------ Private constants ----------------------------------------
// Times in each of the (four) possible states
// (Times are in seconds)
#define SLEEPING_DURATION 255
#define WAKING_DURATION 60
#define GROWLING_DURATION 40
#define ATTACKING_DURATION 120
// ------ Private variables ----------------------------------------
// The current state of the system
static eDinosaur_State Dinosaur_state_G;
// The time in the state
static tByte Time_in_state_G;
// Used by sEOS
static tByte Call_count_G = 0;
/*------------------------------------------------------------------*-
DINOSAUR_Init()
Prepare for the dinosaur activity.
-*------------------------------------------------------------------*/
void DINOSAUR_Init(void)
{
// Initial dinosaur state
Dinosaur_state_G = SLEEPING;
}
/*------------------------------------------------------------------*-
DINOSAUR_Update()
Must be called once per second.
-*------------------------------------------------------------------*/
void DINOSAUR_Update(void)
{
switch (Dinosaur_state_G)
{
case SLEEPING:
{
// Call relevant function
DINOSAUR_Perform_Sleep_Movements();
if (++Time_in_state_G == SLEEPING_DURATION)
{
Dinosaur_state_G = WAKING;
Time_in_state_G = 0;
}
break;
}
case WAKING:
{
// Call relevant function
DINOSAUR_Perform_Waking_Movements();
if (++Time_in_state_G == WAKING_DURATION)
{
Dinosaur_state_G = GROWLING;
Time_in_state_G = 0;
}
break;
}
case GROWLING:
{
// Call relevant function
DINOSAUR_Growl();
if (++Time_in_state_G == GROWLING_DURATION)
{
Dinosaur_state_G = ATTACKING;
Time_in_state_G = 0;
}
break;
}
case ATTACKING:
{
// Call relevant function
DINOSAUR_Perform_Attack_Movements();
if (++Time_in_state_G == ATTACKING_DURATION)
{
Dinosaur_state_G = SLEEPING;
Time_in_state_G = 0;
}
break;
}
}
}
/*------------------------------------------------------------------*/
void DINOSAUR_Perform_Sleep_Movements(void)
{
// Demo only...
P1 = (tByte) Dinosaur_state_G;
P2 = Time_in_state_G;
}
/*------------------------------------------------------------------*/
void DINOSAUR_Perform_Waking_Movements(void)
{
// Demo only...
P1 = (tByte) Dinosaur_state_G;
P2 = Time_in_state_G;
}
/*------------------------------------------------------------------*/
void DINOSAUR_Growl(void)
{
// Demo only...
P1 = (tByte) Dinosaur_state_G;
P2 = Time_in_state_G;
}
/*------------------------------------------------------------------*/
void DINOSAUR_Perform_Attack_Movements(void)
{
// Demo only...
P1 = (tByte) Dinosaur_state_G;
P2 = Time_in_state_G;
}
/*------------------------------------------------------------------*-
---- END OF FILE -------------------------------------------------
-*------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -