?? diguser.c
字號(hào):
//====================================================================================
//文件名:DIGuser.c
//功能描述:數(shù)碼管顯示相關(guān)函數(shù)及各狀態(tài)函數(shù)
//維護(hù)記錄:2006年10月10 by hongyan.Feng
//====================================================================================
#include "SPCE061A.h"
#include "DIG.h"
#include "DIGuser.h"
unsigned int cn = 0; //IRQ5中斷計(jì)數(shù)變量,該變量在IRQ5函數(shù)中改變
unsigned int DirFlag = 0; //通行狀態(tài)標(biāo)志
//-------------------------------------若使用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; //四個(gè)變量分別用來(lái)存儲(chǔ)倒計(jì)時(shí)過(guò)程中四個(gè)路口數(shù)碼管顯示的時(shí)間
unsigned int max,min; //存儲(chǔ)初始設(shè)置的四個(gè)路口倒計(jì)時(shí)時(shí)間中最大值和最小值
//===========================================================================================================
//函數(shù)名: void DIGShow(unsigned int DIGDir,unsigned int Num)
//功能描述: 數(shù)碼管顯示函數(shù),某一個(gè)方向的兩位數(shù)碼管顯示Num數(shù)據(jù),第一位顯示十位,第二位顯示個(gè)位
//入口參數(shù): DIGDir為顯示路口方向,比如東邊路口
// Num為兩位的顯示數(shù)據(jù)
//出口參數(shù): 無(wú)
//===========================================================================================================
void DIGShow(unsigned int DIGDir,unsigned int Num)
{
unsigned int sw,gw;
sw = Num/10; //Num的十位
gw = Num%10; //Num的個(gè)位
R_DIG_Buf[DIGDir] = iTable[sw]; //向緩沖區(qū)送顯示十位數(shù)據(jù)
R_DIG_Buf[DIGDir+1] = iTable[gw]; //向緩沖區(qū)送顯示個(gè)位數(shù)據(jù)
}
//===========================================================================================================
//函數(shù)名: void LEDShow(unsigned int LEDDir,unsigned int Led1,unsigned int led2,unsigned int led3,unsigned int led4)
//功能描述: 發(fā)光二極管點(diǎn)亮函數(shù),由于同一個(gè)路口一定同時(shí)又4個(gè)發(fā)光二極管被點(diǎn)亮,所以參數(shù)中從led1到led4
//入口參數(shù): LEDDir為顯示路口方向,比如東邊路口
// Led1為左拐要點(diǎn)亮的發(fā)光二極管
// Led2為直行要點(diǎn)亮的發(fā)光二極管
// Led3為右拐要點(diǎn)亮的發(fā)光二極管
// Led4為人行道要點(diǎn)亮的發(fā)光二極管
//出口參數(shù): 無(wú)
//===========================================================================================================
void LEDShow(unsigned int LEDDir,unsigned int led1,unsigned int led2,unsigned int led3,unsigned int led4)
{
R_DIG_Buf[LEDDir] = led1 | led2; //向緩沖區(qū)送點(diǎn)亮左拐和直行的發(fā)光二極管數(shù)據(jù)
R_DIG_Buf[LEDDir+1] = led3 | led4; //向緩沖區(qū)送點(diǎn)亮右拐和人行道的發(fā)光二極管數(shù)據(jù)
}
//===========================================================================================================
//函數(shù)名: void DIGOff(unsigned int DIGDir)
//功能描述: 熄滅DIGDir方向路口的數(shù)碼管
//入口參數(shù): DIGDir為顯示路口方向,比如東邊路口
//出口參數(shù): 無(wú)
//===========================================================================================================
void DIGOff(unsigned int DIGDir)
{
R_DIG_Buf[DIGDir] = 0;
R_DIG_Buf[DIGDir+1] = 0;
}
//===========================================================================================================
//函數(shù)名: void LEDOff(unsigned int LEDDir,unsigned int led)
//功能描述: 熄滅LEDDir方向路口的某一個(gè)LED燈
//入口參數(shù): LEDDir為路口方向,比如東邊路口,在電路中表現(xiàn)為L(zhǎng)ED燈公共端的第一個(gè)位號(hào),
// 每個(gè)路口的LED燈有兩個(gè)公共端,如果讓接在第一個(gè)公共端的LED燈熄滅,LEDDir為L(zhǎng)ED的方向號(hào);
// 如果讓第二個(gè)公共端LED燈熄滅,LEDDir為L(zhǎng)ED的方向號(hào)+1.
// 比如想讓東邊路口接在第一個(gè)公共端的LED燈點(diǎn)亮,LEDDir為EAST_L;
// 想讓東邊路口接在第二個(gè)公共端的LED燈點(diǎn)亮,LEDDir為EAST_L+1;
// led為要熄滅的發(fā)光二極管
//出口參數(shù): 無(wú)
//===========================================================================================================
void LEDOff(unsigned int LEDDir,unsigned int led)
{
led ^= 0xffff;
R_DIG_Buf[LEDDir] &= led;
}
//============================================================================================================
//函數(shù)名: void EastSTrough(void)
//功能描述: 東邊路口車輛直行通行函數(shù),該函數(shù)運(yùn)行min秒,EastSTrough是(East Straight Trough的縮寫)
// 該函數(shù)實(shí)現(xiàn)允許東邊路口車輛直行、左拐和人行,西邊路口車輛右拐,北邊路口車輛右拐;禁止其他通行的功能
//入口參數(shù): 無(wú)
//出口參數(shù): 無(wú)
//============================================================================================================
void EastSTrough(void)
{
//---------------------------------------------------------------------------------------------
//下面為東邊路口直行、左拐、人行道綠燈亮,西邊和北邊路口右拐路燈亮,其他紅燈亮狀態(tài)
//---------------------------------------------------------------------------------------------
DIGShow(EAST_D,Enum); //東邊路口數(shù)碼管顯示
DIGShow(SOUTH_D,Snum); //南邊路口數(shù)碼管顯示
DIGShow(WEST_D,Wnum); //西邊路口數(shù)碼管顯示
DIGShow(NORTH_D,Nnum); //北邊路口數(shù)碼管顯示
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狀態(tài),循環(huán),該狀態(tài)持續(xù)21s
{
if(cn == 2) //四個(gè)路口數(shù)碼管倒計(jì)時(shí)并顯示
{
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) //如果東邊倒計(jì)時(shí)到設(shè)定黃燈時(shí)間
{
DirFlag = EAST_Y; //改變?yōu)橄乱粋€(gè)狀態(tài),EAST_Y狀態(tài)
}
}
*P_Watchdog_Clear = 0x0001;
}
//---------------------------------------------------------------------------------------------
//下面為東邊路口所有黃燈閃爍,南邊路口左拐、直行、人行道黃燈閃爍,西邊路口右拐黃燈閃爍狀態(tài)
//---------------------------------------------------------------------------------------------
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狀態(tài)持續(xù)4s
{
if(cn == 1) //0.5s
{
DIGOff(EAST_D); //東邊路口數(shù)碼管熄滅
DIGOff(SOUTH_D); //南邊路口數(shù)碼管熄滅
LEDOff(EAST_L,LeftYlw); //所有點(diǎn)亮的黃燈熄滅
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,四個(gè)路口數(shù)碼管倒計(jì)時(shí)并顯示,黃燈顯示
{
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) //如果東邊路口倒計(jì)時(shí)到-1(由于要顯示00)
{
Enum = max; //東邊路口的倒計(jì)時(shí)時(shí)間設(shè)置為max
DirFlag = 0; //清狀態(tài)標(biāo)志
}
}
*P_Watchdog_Clear = 0x0001;
}
}
//===========================================================================================================
//函數(shù)名: void SouthSTrough(void)
//功能描述: 南邊路口車輛直行通行函數(shù),該函數(shù)運(yùn)行min秒,SouthSTrough是(South Straight Trough的縮寫)
// 該函數(shù)實(shí)現(xiàn)允許南邊路口車輛直行、左拐和人行,北邊路口車輛右拐,東邊路口車輛右拐;禁止其他通行的功能
//入口參數(shù): 無(wú)
//出口參數(shù): 無(wú)
//===========================================================================================================
void SouthSTrough(void)
{
//---------------------------------------------------------------------------------------------
//下面為南邊路口直行、左拐、人行道綠燈亮,北邊和東邊路口右拐路燈亮,其他紅燈亮狀態(tài)
//---------------------------------------------------------------------------------------------
DIGShow(EAST_D,Enum); //東邊路口數(shù)碼管顯示
DIGShow(SOUTH_D,Snum); //南邊路口數(shù)碼管顯示
DIGShow(WEST_D,Wnum); //西邊路口數(shù)碼管顯示
DIGShow(NORTH_D,Nnum); //北邊路口數(shù)碼管顯示
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狀態(tài),循環(huán),該狀態(tài)持續(xù)21s
{
if(cn == 2) //四個(gè)路口數(shù)碼管倒計(jì)時(shí)并顯示
{
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) //如果南邊倒計(jì)時(shí)到設(shè)定黃燈時(shí)間
{
DirFlag = SOUTH_Y; //改變?yōu)橄乱粋€(gè)狀態(tài),SOUTH_Y狀態(tài)
}
}
*P_Watchdog_Clear = 0x0001;
}
//---------------------------------------------------------------------------------------------
//下面為南邊路口所有黃燈閃爍,西邊路口左拐、直行、人行道黃燈閃爍,北邊路口右拐黃燈閃爍狀態(tài)
//---------------------------------------------------------------------------------------------
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狀態(tài)持續(xù)4s
{
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -