?? 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 + -