|
#include<reg51.h>
#include<rtx51tny.h>
#define uint unsigned int
#define uchar unsigned char
sbit con=P3^2; //存儲(chǔ)寄存器的時(shí)鐘輸入。
sbit snr=P2^2; //上升沿時(shí)移位寄存器中的數(shù)據(jù)進(jìn)入存儲(chǔ)寄存器,
sbit sng=P2^3; //下降沿時(shí)存儲(chǔ)寄存器中的數(shù)據(jù)保持不變。
sbit sny=P2^4; //應(yīng)用時(shí)通常將ST_CP置為低點(diǎn)平,
sbit ewr=P2^5; //移位結(jié)束后再在ST_CP端產(chǎn)生一個(gè)正脈沖更新顯示數(shù)據(jù)。
sbit ewg=P2^6;
sbit ewy=P2^7;
sbit KEY1 = P1^0;
sbit KEY2 = P1^1;
sbit LA=P2^0;
sbit LB=P2^1;
uchar minute=0;
uchar hour=0;
uchar code DSY_DUAN[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char code tew[]={0x06,0x7f,0x06,0x07,0x06,0x7d,0x06, 0x6d,
0x06,0x66,0x06,0x4f,0x06,0x5b,0x06,0x06,
0x06,0x3f,0x3f,0x6f,0x3f,0x7f,0x3f,0x07,
0x3f,0x7d,0x3f,0x6d,0x3f,0x66,0x3f,0x4f,
0x3f,0x5b,0x3f,0x06,0x3f,0x3f,0x06,0x66,
0x06,0x4f,0x06,0x5b,0x06,0x06,0x06,0x3f,
0x3f,0x6f,0x3f,0x7f,0x3f,0x07,0x3f,0x7d,
0x3f,0x6d,0x3f,0x66,0x3f,0x4f,0x3f,0x5b,
0x3f,0x06,0x3f,0x3f,0x3f,0x4f,0x3f,0x5b,
0x3f,0x06,0x3f,0x3f};
//東西方向數(shù)碼管倒計(jì)時(shí)段碼表
unsigned char code tsn[]={0x06,0x66,0x06,0x4f,0x06,0x5b,0x06,0x06,
0x06,0x3f,0x3f,0x6f,0x3f,0x7f,0x3f,0x07,
0x3f,0x7d,0x3f,0x6d,0x3f,0x66,0x3f,0x4f,
0x3f,0x5b,0x3f,0x06,0x3f,0x3f,0x3f,0x4f,
0x3f,0x5b,0x3f,0x06,0x3f,0x3f,0x06,0x7f,
0x06,0x07,0x06,0x7d,0x06,0x6d,0x06,0x66,
0x06,0x4f,0x06,0x5b,0x06,0x06,0x06,0x3f,
0x3f,0x6f,0x3f,0x7f,0x3f,0x07,0x3f,0x7d,
0x3f,0x6d,0x3f,0x66,0x3f,0x4f,0x3f,0x5b,
0x3f,0x06,0x3f,0x3f};
//南北方向數(shù)碼管倒計(jì)時(shí)段碼表
void delay(uint t)
{
uchar i;
while(t--);
for(i=0;i>250;i++);
}
void job0() _task_ 0
{
os_create_task(1);
os_create_task(2);
os_create_task(3);
os_create_task(4);
os_create_task(5);
os_delete_task(0);
}
void job1() _task_ 1 //十字路口數(shù)碼管倒計(jì)時(shí)部分
{
uchar i;
SCON=0x00; //配置串口通信為方式0,八位同步移位寄存器
con=0; //con先拉低,后拉高
while(1)
{
for(i=0;i<38;i++) //每?jī)蓚(gè)數(shù)碼管倒計(jì)時(shí)部分共有76個(gè)段碼,
//所以需要乘2才能到達(dá)下一個(gè)狀態(tài)。
{
SBUF=tsn[i*2]; //南北方向9-15數(shù)碼管掃描
while(!TI);
TI=0; //軟件清零部分;
SBUF=tsn[i*2+1]; //南北方向1-7數(shù)碼管掃描
while(!TI);
TI=0;
SBUF=tew[i*2];
while(!TI);
TI=0;
SBUF=tew[i*2+1];
while(!TI);
TI=0; //接收完畢信號(hào);
con=1; //595芯片ST_CP端工作;
os_wait(K_IVL,10,0); //延時(shí)100ms;
con=0; //595芯片ST_CP端停止工作;
}
}
}
void job2() _task_ 2
{
while(1)
{
minute++; //分鐘加一
if(minute==60) //分鐘滿60;
{
minute=0; //分鐘清零;
hour++; //小時(shí)加一;
if(hour==60) //小時(shí)滿60;
{
hour=0; //小時(shí)清零;
}
}
os_wait(K_IVL,100,0); //延時(shí)1s;
}
}
void job3() _task_ 3 //按鍵檢測(cè)
{
while(1)
{
if(P1!=0xff) //有鍵被按下;
{
delay(10);
if(KEY1==0) //如果第一個(gè)鍵被按下,分鐘個(gè)位加一;
{
minute=minute%10+1;
if(minute==60) //分鐘滿60清零
{
minute=0;
}
}
else if(KEY2==0) //如果第二個(gè)鍵被按下,小時(shí)個(gè)位加一;
{
hour=hour%10+1;
if(hour==60) //小時(shí)滿60清零
{
hour=0;
}
}
while(P1!=0xff); //判斷抬起;
}
}
}
void job4() _task_ 4 //計(jì)時(shí)數(shù)碼管掃描程序
{
while(1)
{
LA=1,LB=1; //P2口前兩個(gè)管腳輸入
P0=DSY_DUAN[minute%10]; //分個(gè)
delay(500);
LA=1,LB=0;
P0=DSY_DUAN[hour%10]; //時(shí)個(gè)
delay(500);
LA=0,LB=1;
P0=DSY_DUAN[minute/10];
delay(500);
LA=0,LB=0;
P0=DSY_DUAN[hour/10];
delay(500);
}
}
void job5() _task_ 5 //南北方向交通燈
{
while(1)
{
snr=0;sng=1;sny=1; //南北紅,東西綠
ewr=1;ewg=0;ewy=1;
os_wait(K_IVL,150,0);
snr=0;sng=1;sny=1; //南北紅,東西黃
ewr=1;ewg=1;ewy=0;
os_wait(K_IVL,10,0);
snr=0;sng=1;sny=1; //南北紅,東西黃
ewr=1;ewg=1;ewy=1;
os_wait(K_IVL,10,0);
snr=0;sng=1;sny=1; //南北紅,東西黃
ewr=1;ewg=1;ewy=0;
os_wait(K_IVL,10,0);
snr=0;sng=1;sny=1; //南北紅,東西黃
ewr=1;ewg=1;ewy=1;
os_wait(K_IVL,10,0);
snr=1;sng=0;sny=1; //南北綠,東西紅
ewr=0;ewg=1;ewy=1;
os_wait(K_IVL,150,0);
snr=1;sng=1;sny=0; //南北黃,東西紅
ewr=0;ewg=1;ewy=1;
os_wait(K_IVL,10,0);
snr=1;sng=1;sny=1; //南北黃,東西紅
ewr=0;ewg=1;ewy=1;
os_wait(K_IVL,10,0);
snr=1;sng=1;sny=0; //南北黃,東西紅
ewr=0;ewg=1;ewy=1;
os_wait(K_IVL,10,0);
snr=1;sng=1;sny=1; //南北黃,東西紅
ewr=0;ewg=1;ewy=1;
os_wait(K_IVL,10,0);
}
os_wait(K_IVL,100,0);
}
|
|