📄 trafficlight.c
字号:
#include <rtx51tny.h> /* RTX-51 tiny functions & defines */
#include <reg51.h>
//定义各任务
#define INIT 0
#define TIME_RUN 1
#define TIME_DISPLAY 2
#define KEY_SCAN 3
#define KEY_DEAL 4
#define CON_LIGHT 5
//定义各个键值
#define URGENCY1 0
#define URGENCY2 1
#define URGENCY3 2
#define SETYELLOW 3
#define SCHOS 4
#define TIMEADD 5
#define TIMEDEL 6
#define MDCHOS 8
#define PTIMEADD 9
#define PTIMEDEL 10
#define PTIMEBACK 11
#define TDISPCHOS 12
#define TDISPBACK 13
#define URGBACK 15
//定义所有灯亮灭状态
#define S0_0 0x2A
#define S0_1 0x3A
#define S1 0x1A
#define S2 0x3C
#define S3 0x09
#define S4_0 0xD1
#define S4_1 0x51 //1'2'5 on
#define S5 0x51 //1'2 on
#define S6 0x61
#define S7 0x79
#define S8 0x39 //URG1
#define S9 0xD1 //URG2 1'2 on
#define S10 0x2A //URG3
#define S11 0xe4 //SETYELLOW
#define uchar unsigned char
#define uint unsigned int
uchar numcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uchar key;
uchar clock; //use in TIME_RUN,TIME_DISPLAY,SCHOS
uchar timecount; //use in TIME_RUN,CON_LIGHT
uchar disptime; //use in TDISPCHOS,TIME_DISPLAY
uchar buf[3]; //time
uchar buf1[10]; //use in urgency
uchar keepewcanwalk;
uchar keepewwalk;
uchar keepewtright;
uchar keepewyellow;
uchar keepewtleft;
uchar keepnscanwalk;
uchar keepnswalk;
uchar keepnstright;
uchar keepnsyellow;
uchar keepnstleft;
sbit DA = P0^4;
sbit EW6 = P3^6;
sbit NS5 = P3^7;
sbit TIM10 = P3^0;
sbit TIM1 = P3^1;
uchar stopsta;
/*
stopsta = 0--Clock Run
stopsta = 1--Clock Stop
*/
uchar ns5sta;
/*
ns5sta = 0--NS5 off
ns5sta = 1--NS5 on
*/
uchar ew6sta;
/*
ew6sta = 0--EW6 off
ew6sta = 1--EW6 on
*/
uchar timesta;
/* use in TIME_RUN,CON_LIGHT
timesta = 0--ewwalk
timesta = 1--ewtright
timesta = 2--ewyellow
timesta = 3--ewtleft
timesta = 4--nswalk
timesta = 5--nstright
timesta = 6--nsyellow
timesta = 7--nstleft
*/
uchar dispsta;
/* use in TIME_DISPLAY ,TDISPCHOS ,SCHOS
dispsta = 0--dispdat = clock
dispsta = 1--dispdat = disptime
*/
uchar disptimesta;
/* use in TDISPCHOS
disptimesta = 0--ewwalk
disptimesta = 1--ewtright
disptimesta = 2--ewyellow
disptimesta = 3--ewtleft
disptimesta = 4--nswalk
disptimesta = 5--nstright
disptimesta = 6--nsyellow
disptimesta = 7--nstleft
*/
uchar lightsta;
/* use in CON_LIGHT,KEY_DEAL
lightsta = 0--CON_LIGHT
lightsta = 1--CON_LIGHT
*/
struct Time_Struc
{
uchar ewwalk;
uchar ewtright;
uchar ewyellow;
uchar ewtleft;
uchar ewgreen;
uchar ewcanwalk;
uchar nswalk;
uchar nstright;
uchar nsyellow;
uchar nstleft;
uchar nsgreen;
uchar nscanwalk;
}Time;
void job0 (void) _task_ INIT
{
Time.ewwalk = 10;
Time.ewtright = 5;
Time.ewyellow = 2;
Time.ewtleft = 5;
Time.ewcanwalk= 6;
Time.nswalk = 10;
Time.nstright = 5;
Time.nsyellow = 2;
Time.nstleft = 5;
Time.nscanwalk= 6;
keepewcanwalk = 6;
keepewwalk = 10;
keepewtright = 5;
keepewyellow = 2;
keepewtleft = 5;
keepnscanwalk = 6;
keepnswalk = 10;
keepnstright = 5;
keepnsyellow = 2;
keepnstleft = 5;
key = 18;
stopsta = 0;
timesta = 0;
clock = 10;
timecount = 10;
disptime = 0;
dispsta = 0;
disptimesta = 0;
ns5sta = 0;
ew6sta = 0;
lightsta = 0;
os_create_task (TIME_RUN);
os_create_task (TIME_DISPLAY);
os_create_task (KEY_SCAN);
os_create_task (KEY_DEAL);
os_create_task (CON_LIGHT);
os_delete_task (INIT);
}
void job1 (void) _task_ TIME_RUN
{
while(1)
{
if(stopsta==0)
{
os_wait (K_IVL,92,0);
clock -- ;
if(clock==0)
{
timesta++;
if(timesta>=8)
timesta = 0;
os_wait(K_IVL,10,0);
clock = timecount;
}
}
else
os_wait(K_IVL,5,0);
}
}
void job2 (void) _task_ TIME_DISPLAY
{
uchar i,j,dispdat;
while(1)
{
if(dispsta==0)
dispdat = clock;
else
dispdat = disptime;
buf[1] = numcode[dispdat/10];
buf[2] = numcode[dispdat%10];
if(ns5sta==0&&ew6sta==0)
{
for(i=1;i<=2;i++)
{
P1 = buf[i];
P3 = i;
for(j=0;j<20;j++)
;
P1 = 0x00;
}
}
else if(ns5sta==1&&ew6sta==0)
{
for(i=1;i<=2;i++)
{
P1 = buf[i];
P3 = i+128;
for(j=0;j<20;j++)
;
P1 = 0x00;
}
}
else if(ns5sta==0&&ew6sta==1)
{
for(i=1;i<=2;i++)
{
P1 = buf[i];
P3 = i+64;
for(j=0;j<20;j++)
;
P1 = 0x00;
}
}
else
{
for(i=1;i<=2;i++)
{
P1 = buf[i];
P3 = i+192;
for(j=0;j<20;j++)
;
P1 = 0x00;
}
}
}
}
void job3 (void) _task_ KEY_SCAN
{
while(1)
{
os_wait (K_IVL,10,0);
if(DA==1)
{
key = P0&0x0f ;
os_send_signal(KEY_DEAL);
}
}
}
void job4 (void) _task_ KEY_DEAL
{
uchar i,ssta,mdsta,psta;
i = 0;
ssta = 0; //1--4dwalk,2--4dtright,3--4dyellow,4--4dtleft
mdsta = 0; //1--ewgreen,2--nsgreen
psta = 0; //0--4dcanwalk+,1--4dtright+
while(1)
{
os_wait(K_IVL,10,0);
os_wait(K_SIG,0,0);
if(key==URGENCY1)
{
stopsta = 1;
lightsta = 1;
ew6sta = 0;
P2 = S8;
i++;
if(i>=10)
{
i = i-5;
}
buf1[i] = 1;
}
if(key==URGENCY2)
{
stopsta = 1;
lightsta = 1;
P2 = S9;
ew6sta = 0;
i++;
if(i>=10)
{
i = i-5;
}
buf1[i] = 2;
}
if(key==URGENCY3)
{
stopsta = 1;
lightsta = 1;
P2 = S10;
ns5sta = 0;
ew6sta = 0;
i++;
if(i>=10)
{
i = i-5;
}
buf1[i] = 3;
}
if(key==SETYELLOW)
{
stopsta = 1;
lightsta = 1;
os_wait(K_IVL,10,0);
P2 = S11;
ew6sta = 1;
i++;
if(i>=10)
{
i = i-5;
}
buf1[i] = 4;
}
if(key==URGBACK)
{
i--;
if(i!=0)
{
switch(buf1[i])
{case 1:P2 = S8;
ns5sta = 0;
ew6sta = 0;
break;
case 2:P2 = S9;
ns5sta = 0;
ew6sta = 0;
break;
case 3:P2 = S10;
ns5sta = 0;
ew6sta = 0;
break;
case 4:P2 = S11;
ew6sta = 1;
ns5sta = 0;
break;
}
}
else
{
ew6sta = 0;
ns5sta = 0;
stopsta = 0;
lightsta = 0;
key = 18;
}
}
if(key==TDISPCHOS)
{
disptimesta++;
dispsta = 1;
if(disptimesta>=8)
{
disptimesta = 0;
dispsta = 0;
key = 18;
}
}
switch(disptimesta)
{case 0:disptime = keepewwalk;
break;
case 1:disptime = keepewtright;
break;
case 2:disptime = keepewyellow;
break;
case 3:disptime = keepewtleft;
break;
case 4:disptime = keepnswalk;
break;
case 5:disptime = keepnstright;
break;
case 6:disptime = keepnsyellow;
break;
case 7:disptime = keepnstleft;
break;
}
if(key==TDISPBACK)
{
dispsta = 0;
disptimesta = 0;
key = 18;
}
if(key==SCHOS)
{
ssta++;
stopsta = 1;
lightsta = 1;
dispsta = 1;
if(ssta>=5)
{
ssta = 0;
stopsta = 0;
dispsta = 0;
lightsta = 0;
key = 18;
keepewcanwalk = Time.ewcanwalk;
keepewwalk = Time.ewwalk;
keepewtright = Time.ewtright;
keepewyellow = Time.ewyellow;
keepewtleft = Time.ewtleft;
keepnscanwalk = Time.nscanwalk;
keepnswalk = Time.nswalk;
keepnstright = Time.nstright;
keepnsyellow = Time.nsyellow;
keepnstleft = Time.nstleft;
}
}
switch(ssta)
{case 1:disptime = Time.ewwalk;
P2 = S0_0;
if(key==TIMEADD)
{
Time.ewcanwalk++;
Time.nscanwalk++;
Time.ewwalk++;
Time.nswalk++;
if(Time.ewcanwalk>=95)
{
Time.ewcanwalk = 10;
Time.nscanwalk = 10;
Time.ewwalk = 14;
Time.nswalk = 14;
}
}
if(key==TIMEDEL)
{
Time.ewcanwalk--;
Time.nscanwalk--;
Time.ewwalk--;
Time.nswalk--;
if(Time.ewcanwalk==0)
{
Time.ewcanwalk = 1;
Time.nscanwalk = 1;
Time.ewwalk = 5;
Time.nswalk = 5;
}
}
break;
case 2:disptime = Time.ewtright;
P2 = S1;
if(key==TIMEADD)
{
Time.ewtright++;
Time.nstright++;
if(Time.ewtright>=99)
{
Time.ewtright = 10;
Time.nstright = 10;
}
}
if(key==TIMEDEL)
{
Time.ewtright--;
Time.nstright--;
if(Time.ewtright==0)
{
Time.ewtright = 1;
Time.nstright = 1;
}
}
break;
case 3:disptime = Time.ewyellow;
P2 = S2;
if(key==TIMEADD)
{
Time.ewyellow++;
Time.nsyellow++;
if(Time.ewyellow>=99)
{
Time.ewyellow = 10;
Time.nsyellow = 10;
}
}
if(key==TIMEDEL)
{
Time.ewyellow--;
Time.nsyellow--;
if(Time.ewyellow==0)
{
Time.ewyellow = 1;
Time.nsyellow = 1;
}
}
break;
case 4:disptime = Time.ewtleft;
P2 = S3;
if(key==TIMEADD)
{
Time.ewtleft++;
Time.nstleft++;
if(Time.ewtleft>=99)
{
Time.ewtleft = 10;
Time.nstleft = 10;
}
}
if(key==TIMEDEL)
{
Time.ewtleft--;
Time.nstleft--;
if(Time.ewtleft==0)
{
Time.ewtleft = 1;
Time.nstleft = 1;
}
}
break;
}
if(key==MDCHOS)
{
mdsta++;
stopsta = 1;
lightsta = 1;
dispsta = 1;
ns5sta = 0;
if(mdsta>=3)
{
mdsta = 0;
stopsta = 0;
dispsta = 0;
lightsta = 0;
key = 18;
}
}
switch(mdsta)
{case 1:disptime = Time.ewcanwalk+Time.ewtright+4;
P2 = S10;
if(key==PTIMEADD)
{
if(psta==0)
{
Time.ewcanwalk++;
psta = 1;
if(Time.ewcanwalk>=95)
Time.ewcanwalk = 90;
}
else
{
Time.ewtright++;
psta = 0;
if(Time.ewtright>=99)
Time.ewtright = 97;
}
}
if(key==PTIMEDEL)
{
if(psta==0)
{
Time.ewcanwalk--;
psta = 1;
if(Time.ewcanwalk==0xff)
Time.ewcanwalk = 0;
}
else
{
Time.ewtright--;
psta = 0;
if(Time.ewtright==0xff)
Time.ewtright = 0;
}
}
break;
case 2:disptime = Time.nscanwalk+Time.nstright+4;
P2 = S9;
if(key==PTIMEADD)
{
if(psta==0)
{
Time.nscanwalk++;
psta = 1;
if(Time.nscanwalk>=95)
Time.nscanwalk = 90;
}
else
{
Time.nstright++;
psta = 0;
if(Time.nstright>=99)
Time.nstright = 97;
}
}
if(key==PTIMEDEL)
{
if(psta==0)
{
Time.nscanwalk--;
psta = 1;
if(Time.nscanwalk==0xff)
Time.nscanwalk = 0;
}
else
{
Time.nstright--;
psta = 0;
if(Time.nstright==0xff)
Time.nstright = 0;
}
}
break;
}
if(key==PTIMEBACK)
{
Time.ewcanwalk = keepewcanwalk;
Time.ewwalk = keepewwalk;
Time.ewtright = keepewtright;
Time.ewyellow = keepewyellow;
Time.ewtleft = keepewtleft;
Time.nscanwalk = keepnscanwalk;
Time.nswalk = keepnswalk;
Time.nstright = keepnstright;
Time.nsyellow = keepnsyellow;
Time.nstleft = keepnstleft;
key = 18;
}
}
}
void job5 (void) _task_ CON_LIGHT
{
while(1)
{
if(stopsta==0)
{
os_wait (K_IVL,10,0);
switch(timesta)
{case 0:timecount = Time.ewcanwalk+2;
if(lightsta==0)
{
if(clock>=3)
P2 = S0_0;
else if(clock<=2)
P2 = S0_1;
ns5sta = 0;
}
break;
case 1:timecount = Time.ewtright;
if(lightsta==0)
{
P2 = S1;
ns5sta = 0;
}
break;
case 2:timecount = Time.ewyellow;
if(lightsta==0)
{
P2 = S2;
ns5sta = 0;
}
break;
case 3:timecount = Time.ewtleft;
if(lightsta==0)
{
P2 = S3;
ns5sta = 0;
}
break;
case 4:timecount = Time.nscanwalk+2;
if(lightsta==0)
{
if(clock>=3)
P2 = S4_0;
else if(clock<=2)
P2 = S4_1;
ns5sta = 0;
}
break;
case 5:timecount = Time.nstright;
if(lightsta==0)
{
P2 = S5;
ns5sta = 1;
}
break;
case 6:timecount = Time.nsyellow;
if(lightsta==0)
{
ns5sta = 0;
P2 = S6;
}
break;
case 7:timecount = Time.nstleft;
if(lightsta==0)
{
P2 = S7;
ns5sta = 0;
}
break;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -