📄 diguser.c
字号:
//====================================================================================
//文件名:DIGuser.c
//功能描述:数码管显示相关函数及各状态函数
//维护记录:2006年10月10 by hongyan.Feng
//====================================================================================
#include "SPCE061A.h"
#include "DIG.h"
#include "DIGuser.h"
unsigned int cn = 0; //IRQ5中断计数变量,该变量在IRQ5函数中改变
unsigned int DirFlag = 0; //通行状态标志
//-------------------------------------若使用I/O口高8位-----------------------------------
//unsigned int iTable[10] =
//{0x3f00,0x0600,0x5b00,0x4f00,0x6600,0x6d00,0x7d00,0x0700,0x7f00,0x6f00};//"0","1","2","3","4","5","6","7","8","9"
//-------------------------------------若使用I/O口低8位-----------------------------------
unsigned int iTable[10] =
{0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007c,0x0007,0x007f,0x006f};//"0","1","2","3","4","5","6","7","8","9"
unsigned int Enum,Snum,Wnum,Nnum; //四个变量分别用来存储倒计时过程中四个路口数码管显示的时间
unsigned int max,min; //存储初始设置的四个路口倒计时时间中最大值和最小值
//===========================================================================================================
//函数名: void DIGShow(unsigned int DIGDir,unsigned int Num)
//功能描述: 数码管显示函数,某一个方向的两位数码管显示Num数据,第一位显示十位,第二位显示个位
//入口参数: DIGDir为显示路口方向,比如东边路口
// Num为两位的显示数据
//出口参数: 无
//===========================================================================================================
void DIGShow(unsigned int DIGDir,unsigned int Num)
{
unsigned int sw,gw;
sw = Num/10; //Num的十位
gw = Num%10; //Num的个位
R_DIG_Buf[DIGDir] = iTable[sw]; //向缓冲区送显示十位数据
R_DIG_Buf[DIGDir+1] = iTable[gw]; //向缓冲区送显示个位数据
}
//===========================================================================================================
//函数名: void LEDShow(unsigned int LEDDir,unsigned int Led1,unsigned int led2,unsigned int led3,unsigned int led4)
//功能描述: 发光二极管点亮函数,由于同一个路口一定同时又4个发光二极管被点亮,所以参数中从led1到led4
//入口参数: LEDDir为显示路口方向,比如东边路口
// Led1为左拐要点亮的发光二极管
// Led2为直行要点亮的发光二极管
// Led3为右拐要点亮的发光二极管
// Led4为人行道要点亮的发光二极管
//出口参数: 无
//===========================================================================================================
void LEDShow(unsigned int LEDDir,unsigned int led1,unsigned int led2,unsigned int led3,unsigned int led4)
{
R_DIG_Buf[LEDDir] = led1 | led2; //向缓冲区送点亮左拐和直行的发光二极管数据
R_DIG_Buf[LEDDir+1] = led3 | led4; //向缓冲区送点亮右拐和人行道的发光二极管数据
}
//===========================================================================================================
//函数名: void DIGOff(unsigned int DIGDir)
//功能描述: 熄灭DIGDir方向路口的数码管
//入口参数: DIGDir为显示路口方向,比如东边路口
//出口参数: 无
//===========================================================================================================
void DIGOff(unsigned int DIGDir)
{
R_DIG_Buf[DIGDir] = 0;
R_DIG_Buf[DIGDir+1] = 0;
}
//===========================================================================================================
//函数名: void LEDOff(unsigned int LEDDir,unsigned int led)
//功能描述: 熄灭LEDDir方向路口的某一个LED灯
//入口参数: LEDDir为路口方向,比如东边路口,在电路中表现为LED灯公共端的第一个位号,
// 每个路口的LED灯有两个公共端,如果让接在第一个公共端的LED灯熄灭,LEDDir为LED的方向号;
// 如果让第二个公共端LED灯熄灭,LEDDir为LED的方向号+1.
// 比如想让东边路口接在第一个公共端的LED灯点亮,LEDDir为EAST_L;
// 想让东边路口接在第二个公共端的LED灯点亮,LEDDir为EAST_L+1;
// led为要熄灭的发光二极管
//出口参数: 无
//===========================================================================================================
void LEDOff(unsigned int LEDDir,unsigned int led)
{
led ^= 0xffff;
R_DIG_Buf[LEDDir] &= led;
}
//============================================================================================================
//函数名: void EastSTrough(void)
//功能描述: 东边路口车辆直行通行函数,该函数运行min秒,EastSTrough是(East Straight Trough的缩写)
// 该函数实现允许东边路口车辆直行、左拐和人行,西边路口车辆右拐,北边路口车辆右拐;禁止其他通行的功能
//入口参数: 无
//出口参数: 无
//============================================================================================================
void EastSTrough(void)
{
//---------------------------------------------------------------------------------------------
//下面为东边路口直行、左拐、人行道绿灯亮,西边和北边路口右拐路灯亮,其他红灯亮状态
//---------------------------------------------------------------------------------------------
DIGShow(EAST_D,Enum); //东边路口数码管显示
DIGShow(SOUTH_D,Snum); //南边路口数码管显示
DIGShow(WEST_D,Wnum); //西边路口数码管显示
DIGShow(NORTH_D,Nnum); //北边路口数码管显示
LEDShow(EAST_L,LeftGrn,StrtGrn,RigtRed,MansGrn); //东边路口左拐、直行、人行道绿灯亮,右拐红灯亮
LEDShow(SOUTH_L,LeftRed,StrtRed,RigtRed,MansRed); //南边路口全部红灯亮
LEDShow(WEST_L,LeftRed,StrtRed,RigtGrn,MansRed); //西边路口左拐、直行、人行道红灯亮,右拐绿灯亮
LEDShow(NORTH_L,LeftRed,StrtRed,RigtGrn,MansRed); //北边路口左拐、直行、人行道红灯亮,右拐绿灯亮
while(DirFlag==EAST_G) //如果是EAST_G状态,循环,该状态持续21s
{
if(cn == 2) //四个路口数码管倒计时并显示
{
cn = 0;
Enum--;
Snum--;
Wnum--;
Nnum--;
DIGShow(EAST_D,Enum);
DIGShow(SOUTH_D,Snum);
DIGShow(WEST_D,Wnum);
DIGShow(NORTH_D,Nnum);
if(Enum==Ylwtime) //如果东边倒计时到设定黄灯时间
{
DirFlag = EAST_Y; //改变为下一个状态,EAST_Y状态
}
}
*P_Watchdog_Clear = 0x0001;
}
//---------------------------------------------------------------------------------------------
//下面为东边路口所有黄灯闪烁,南边路口左拐、直行、人行道黄灯闪烁,西边路口右拐黄灯闪烁状态
//---------------------------------------------------------------------------------------------
LEDShow(EAST_L,LeftYlw,StrtYlw,RigtYlw,MansYlw); //东边路口全部黄灯亮
LEDShow(SOUTH_L,LeftYlw,StrtYlw,RigtRed,MansYlw); //南边路口左拐、直行、人行道黄灯亮,右拐红灯亮
LEDShow(WEST_L,LeftRed,StrtRed,RigtYlw,MansRed); //西边路口左拐、直行、人行道红灯亮,右拐黄灯亮
LEDShow(NORTH_L,LeftRed,StrtRed,RigtGrn,MansRed); //北边路口左拐、直行、人行道红灯亮,右拐绿灯亮
while(DirFlag==EAST_Y) //EAST_Y状态持续4s
{
if(cn == 1) //0.5s
{
DIGOff(EAST_D); //东边路口数码管熄灭
DIGOff(SOUTH_D); //南边路口数码管熄灭
LEDOff(EAST_L,LeftYlw); //所有点亮的黄灯熄灭
LEDOff(EAST_L,StrtYlw);
LEDOff(EAST_L+1,RigtYlw);
LEDOff(EAST_L+1,MansYlw);
LEDOff(SOUTH_L,LeftYlw);
LEDOff(SOUTH_L,StrtYlw);
LEDOff(SOUTH_L+1,MansYlw);
LEDOff(WEST_L+1,RigtYlw);
}
if(cn == 2) //1s,四个路口数码管倒计时并显示,黄灯显示
{
cn = 0;
Enum--;
Snum--;
Wnum--;
Nnum--;
DIGShow(EAST_D,Enum);
DIGShow(SOUTH_D,Snum);
DIGShow(WEST_D,Wnum);
DIGShow(NORTH_D,Nnum);
LEDShow(EAST_L,LeftYlw,StrtYlw,RigtYlw,MansYlw);
LEDShow(SOUTH_L,LeftYlw,StrtYlw,RigtRed,MansYlw);
LEDShow(WEST_L,LeftRed,StrtRed,RigtYlw,MansRed);
LEDShow(NORTH_L,LeftRed,StrtRed,RigtGrn,MansRed);
if(Enum==0xffff) //如果东边路口倒计时到-1(由于要显示00)
{
Enum = max; //东边路口的倒计时时间设置为max
DirFlag = 0; //清状态标志
}
}
*P_Watchdog_Clear = 0x0001;
}
}
//===========================================================================================================
//函数名: void SouthSTrough(void)
//功能描述: 南边路口车辆直行通行函数,该函数运行min秒,SouthSTrough是(South Straight Trough的缩写)
// 该函数实现允许南边路口车辆直行、左拐和人行,北边路口车辆右拐,东边路口车辆右拐;禁止其他通行的功能
//入口参数: 无
//出口参数: 无
//===========================================================================================================
void SouthSTrough(void)
{
//---------------------------------------------------------------------------------------------
//下面为南边路口直行、左拐、人行道绿灯亮,北边和东边路口右拐路灯亮,其他红灯亮状态
//---------------------------------------------------------------------------------------------
DIGShow(EAST_D,Enum); //东边路口数码管显示
DIGShow(SOUTH_D,Snum); //南边路口数码管显示
DIGShow(WEST_D,Wnum); //西边路口数码管显示
DIGShow(NORTH_D,Nnum); //北边路口数码管显示
LEDShow(EAST_L,LeftRed,StrtRed,RigtGrn,MansRed); //东边路口左拐、直行、人行道红灯亮,右拐绿灯亮
LEDShow(SOUTH_L,LeftGrn,StrtGrn,RigtRed,MansGrn); //南边路口左拐、直行、人行道绿灯亮,右拐红灯亮
LEDShow(WEST_L,LeftRed,StrtRed,RigtRed,MansRed); //西边路口全部红灯亮
LEDShow(NORTH_L,LeftRed,StrtRed,RigtGrn,MansRed); //北边路口左拐、直行、人行道红灯亮,右拐绿灯亮
while(DirFlag==SOUTH_G) //如果是SOUTH_G状态,循环,该状态持续21s
{
if(cn == 2) //四个路口数码管倒计时并显示
{
cn = 0;
Enum--;
Snum--;
Wnum--;
Nnum--;
DIGShow(EAST_D,Enum);
DIGShow(SOUTH_D,Snum);
DIGShow(WEST_D,Wnum);
DIGShow(NORTH_D,Nnum);
if(Snum==Ylwtime) //如果南边倒计时到设定黄灯时间
{
DirFlag = SOUTH_Y; //改变为下一个状态,SOUTH_Y状态
}
}
*P_Watchdog_Clear = 0x0001;
}
//---------------------------------------------------------------------------------------------
//下面为南边路口所有黄灯闪烁,西边路口左拐、直行、人行道黄灯闪烁,北边路口右拐黄灯闪烁状态
//---------------------------------------------------------------------------------------------
LEDShow(EAST_L,LeftRed,StrtRed,RigtGrn,MansRed); //东边路口左拐、直行、人行道红灯亮,右拐绿灯亮
LEDShow(SOUTH_L,LeftYlw,StrtYlw,RigtYlw,MansYlw); //南边路口全部黄灯亮
LEDShow(WEST_L,LeftYlw,StrtYlw,RigtRed,MansYlw); //西边路口左拐、直行、人行道黄灯亮,右拐红灯亮
LEDShow(NORTH_L,LeftRed,StrtRed,RigtYlw,MansRed); //北边路口左拐、直行、人行道红灯亮,右拐黄灯亮
while(DirFlag==SOUTH_Y) //SOUTH_Y状态持续4s
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -