📄 t_lights.c
字号:
/*
------------------------------------------------------------------*-
T_lights.C (v1.00)
------------------------------------------------------------------
Traffic light control program (Test Version 1.0)
COPYRIGHT
---------
This code is from the book:
PATTERNS FOR TIME-TRIGGERED EMBEDDED SYSTEMS by Michael J. Pont
[Pearson Education, 2001; ISBN: 0-201-33138-1].
This code is copyright (c) 2001 by Michael J. Pont.
--- Modefied by sylva zhu to apply for AVR Microcontroller .
--- Ver 1.0 Sept 25th , 2006 .
-*------------------------------------------------------------------
*/
#include <iom32.h>
#include <inavr.h>
#include <comp_a90.h>
#include "Main.h"
#include "T_lights.h"
// ------ Private constants ----------------------------------------
// Easy to change logic here
#define ON 0
#define OFF 1
// Times in each of the (four) possible light states
// (Times are in seconds - must call the update task once per second)
//
#define RED_DURATION 2
#define RED_AND_AMBER_DURATION 2
// NOTE:
// GREEN_DURATION must equal RED_DURATION
// AMBER_DURATION must equal RED_AND_AMBER_DURATION
#define GREEN_DURATION RED_DURATION
#define AMBER_DURATION RED_AND_AMBER_DURATION
// ------ Private variables ----------------------------------------
// The state of the system
static eLight_State Light_state_G;
/*
------------------------------------------------------------------*-
TRAFFIC_LIGHTS_Init()
Prepare for the scheduled traffic light activity.
-*------------------------------------------------------------------
*/
void TRAFFIC_LIGHTS_Init(const eLight_State START_STATE)
{
Light_state_G = RED; // Slave is Green; Master is Red
}
/*
------------------------------------------------------------------*-
TRAFFIC_LIGHTS_Update()
Must be called once per 500mS.
-*------------------------------------------------------------------
*/
void TRAFFIC_LIGHTS_Update(void)
{
static unsigned int Time_in_state;
switch (Light_state_G)
{
case RED:
{
//Red_light on , Green light off .
PORTA|=(1<<PORTA5);
PORTA&=~(1<<PORTA4);
//
if (++Time_in_state == RED_DURATION)
{
Light_state_G = GREEN;
Time_in_state = 0;
}
break;
}
//
//
//
case GREEN:
{
//Red_light off , Green light on .
PORTA|=(1<<PORTA4);
PORTA&=~(1<<PORTA5);
//
if (++Time_in_state == RED_AND_AMBER_DURATION)
{
Light_state_G = RED_GREEN;
Time_in_state = 0;
}
break;
}
//
//
//
case RED_GREEN:
{
//Red_light = ON;
//Green_light = ON;
PORTA|=(1<<PORTA4)|(1<<PORTA5);
//
if (++Time_in_state == GREEN_DURATION)
{
Light_state_G = AMBER;
Time_in_state = 0;
}
break;
}
//
//
//
case AMBER:
{
//Red_light = OFF;
//Green_light = OFF;
PORTA&=~((1<<PORTA4)|(1<<PORTA5));
//
if (++Time_in_state == AMBER_DURATION)
{
Light_state_G = RED;
Time_in_state = 0;
}
//
break;
}
default:
break;
}
}
/*
------------------------------------------------------------------------------*-
---- END OF FILE -------------------------------------------------------------
-*------------------------------------------------------------------------------
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -