|
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
void display(void);
void delay(unsigned int m);
void InitTimer0(void);
sbit s1 = P1^0; //啟動按鍵
sbit s2 = P1^1; //應急車
sbit s3 = P1^2; //夜間模式
sbit s4 = P1^3; //主干道通車時間加1,最大只能加到90秒
sbit s5 = P1^4; //主干道通車時間減1,最大只能減到3秒
sbit s6 = P1^5; //次干道通車時間加1,最大只能加到90秒
sbit s7 = P1^6; //次干道通車時間減1,最大只能加到3秒
sbit r1 = P3^7; //次綠
sbit h1 = P3^6; //次黃
sbit g1 = P3^5; //次紅
sbit r2 = P3^4; //主綠
sbit h2 = P3^3; //主黃
sbit g2 = P3^2; //主紅
unsigned char code SMG[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF}; //送段碼0-9和"-"
unsigned char disp[]={0,6,7,5};
unsigned char disp1[]={10,10,10,10};
unsigned char disp2[]={10,10,10,10};
unsigned char dispw[]={0x01,0x02,0x10,0x20};//位選
unsigned char Num=0,num1=1,a=1;//定時器計數
char g=57,gg=60,c=57,d=27;
/*************顯示程序**************/
void display(void)
{
unsigned char i;
for(i=0;i<4;i++)
{
P0=SMG[disp[i]];
P2=dispw[i];
delay(100); P0=0xff;P2=0x00;
}
}
void display1(void)
{
unsigned char i;
for(i=0;i<4;i++)
{
P0=SMG[disp1[i]];
P2=dispw[i];
delay(100); P0=0xff;P2=0x00;
}
}
void display2(void)
{
unsigned char i;
for(i=0;i<4;i++)
{
P0=SMG[disp2[i]];
P2=dispw[i];
delay(100); P0=0xff;P2=0x00;
disp2[0]=d%10;
disp2[1]=d/10;
disp2[2]=c%10;
disp2[3]=c/10;
}
}
/*************延時程序**************/
void delay(unsigned int m)
{
while(--m);
}
/************定時器初始化****************/
void InitTimer0(void)
{
TMOD = 0x11;
TH0 = 0x3C;
TL0 = 0x0B0;
TH1 = 0x3C;
TL1 = 0x0B0;
EA = 1;
ET0 = 1;
ET1 = 1;
TR0 = 0;
TR1 = 0;
}
/*************定時器0*****************/
void Timer0Interrupt(void) interrupt 1 using 1 // 定時器0中斷
{
TH0 = 0x3C;
TL0 = 0x0B0;
Num++;
if(Num==10)
h1=1;
if(Num==10)
h2=1;
if(Num==20)
{ Num=0;
g--;gg--;
if(g>0) //主綠 次紅
{
r1=1;
h1=1;
g1=0;
r2=0;
h2=1;
g2=1;
disp[2]=g%10;
disp[3]=g/10;
disp[0]=gg%10;
disp[1]=gg/10;
}
else if(g>-3 && g<=0) //主黃 次紅
{
r1=1;
h1=0;
g1=1;
r2=0;
h2=1;
g2=1;
disp[2]=(g+3)%10;
disp[3]=(g+3)/10;
disp[0]=(gg)%10;
disp[1]=(gg)/10;
}
else if(gg>-d && gg<=0) //主紅 次綠
{
r1=0;
h1=1;
g1=1;
r2=1;
h2=1;
g2=0;
disp[2]=(g+d+6)%10;
disp[3]=(g+d+6)/10;
disp[0]=(gg+d)%10;
disp[1]=(gg+d)/10;
}
else if(gg>=-(d+3) && g<=-d) //主紅 次黃
{
r1=0;
h1=1;
g1=1;
r2=1;
h2=0;
g2=1;
disp[2]=(g+d+6)%10;
disp[3]=(g+d+6)/10;
disp[0]=(gg+d+3)%10;
disp[1]=(gg+d+3)/10;
if(gg<=-(d+3))
{ g=c;gg=c+3; }
}
}
}
void Timer0Interrupt1(void) interrupt 3 using 2 //定時器1 中斷
{
TH1 = 0x3C;
TL1 = 0x0B0;
num1++;
if(num1==10)
{h1=1; h2=1;}
if(num1==20)
{ num1=0;h1=0; h2=0; }
}
/*************鍵掃描程序**************/
unsigned char keyscan()
{
unsigned char tmp; //列號,行號
P1=0xff; //發全行0掃描碼
if((P1&0xff)!=0xff) //若有鍵按下
{
delay(1000); // 延時去抖
if((P1&0xff)!=0xff) //有鍵按下
{
tmp=(P1&0xff);
do{}while((P1&0xff)!=0xff);
tmp=~tmp;
if (tmp==128)
return (0);
return (tmp); //還回鍵值
}
}
return (0); //無鍵按下,還回0
}
/*************主函數***************/
void main()
{
unsigned char v;
while(1)
{
v=keyscan();
if(v==1)
break;
P2=0x01;
P0=0x0c;
}
InitTimer0();//定時器初始化
if(v==1)
{
while(1)
{
switch (v)
{
case 1: P3=0xff; g1=0;r2=0; TR0=1;TR1=0;
if (a==0)
{g=c;gg=c+3;a=1;}
while (v==1||v==0)
{
display();
v=keyscan();
}
break;
case 2:
P3=0xff; TR0=0;TR1=0;
while (v==2||v==0)
{
r1=0;r2=0;
v=keyscan();display1();
}
break;
case 4:
P3=0xff; TR0=0; TR1=1; h1=0;h2=0;
while (v==4||v==0)
{
v=keyscan();display1();
}
break;
case 8: TR1=0;
while (v==8||v==0)
{
TR0=0;a=0;
while (v==8)
{
c++;
if (c>90)
c=90;v=keyscan();display2();
}
v=keyscan();display2();
}break;
case 16: TR1=0;
while (v==16||v==0)
{
TR0=0;a=0;
while (v==16)
{
c--;
if (c<3)
c=3;v=keyscan();display2();
}
v=keyscan();display2();
}break;
case 32: TR1=0;
while (v==32||v==0)
{
TR0=0;a=0;
while (v==32)
{
d++;
if (d>90)
d=90;v=keyscan();display2();
}
v=keyscan();display2();
}break;
case 64: TR1=0;
while (v==64||v==0)
{
TR0=0;a=0;
while (v==64)
{
d--;
if (d<3)
d=3;v=keyscan();display2();
}
v=keyscan();display2();
}break;
}
}
}
}
|
-
-
交通燈.rar
2018-12-4 21:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
85.42 KB, 下載次數: 7, 下載積分: 黑幣 -5
|