⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diguser.c

📁 1、LED板中每个方向提供四组交通LED灯(包括左转、直行、右转、人行道四组)
💻 C
📖 第 1 页 / 共 2 页
字号:
//====================================================================================
//文件名: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 + -