標(biāo)題:
我的燈在自動顯示函數(shù)里能閃爍 但是在另一個子函數(shù)就亮不了 不知道怎么回時
[打印本頁]
作者:
zq1234
時間:
2018-11-15 14:21
標(biāo)題:
我的燈在自動顯示函數(shù)里能閃爍 但是在另一個子函數(shù)就亮不了 不知道怎么回時
#include<reg51.h>
#include<absacc.h>
sbit dxr=P1^0; //東西的紅黃綠燈
sbit dxy=P1^1;
sbit dxg=P1^2;
sbit nbr=P1^3; //南北的紅黃綠燈
sbit nby=P1^4;
sbit nbg=P1^5;
sbit dxdr=P1^6;
sbit dxdy=P1^7;
sbit dxdg=P3^7;
sbit nbdr=P3^6;
sbit nbdy=P3^5;
sbit nbdg=P3^4;
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
#define on 0 //燈開
#define off 1 //燈關(guān)
//#define temp P3
#define uchar unsigned char
#define uint unsigned int
unsigned int m=0,ss=10,flag,shan;
void delay(unsigned char ms)//延時函數(shù)
{ unsigned int i,j;
for(i=ms;i>0;i--)
for(j=125;j>0;j--);
}
unsigned char code c[12]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x00,0xff}; //數(shù)碼管的段碼顯示0~9還有全滅和全量兩種情況
unsigned char code s[4]={0xfe,0xfd,0xfb,0xf7};//數(shù)碼管的位碼1~4
void disp(unsigned char a ,unsigned char b) //數(shù)碼管顯示程序
{
if(a+b>0)
{ P2=s[0]; //位碼
P0=c[a]; //段碼
delay(1);
P0=0xff;
P2=s[1];
P0=c[b];
delay(1);
P0=0xff; }
if(a+b==0) //數(shù)碼管為0時不顯示
{ P2=s[0]; //位碼
P0=c[11]; //數(shù)碼管不顯示
delay(1);
P0=0xff;
P2=s[1];
P0=c[11];
delay(1);
P0=0xff;
}
}
void aut() //交通燈自動模式 在這個里面黃燈可以閃爍
{unsigned char a1,a0; //a1,a0為數(shù)碼管個位十位 s等待時間
unsigned int x,i; //判斷南北紅綠燈切換的條件
if(m==20& i==0) // i為判斷s等待時間是否到0的條件
{ m=0;
ss--; if(x%2==0){dxg=on;dxy=off;dxr=off; // 顯示等待時間時紅黃綠燈暗滅情況
nbg=off;nby=off;nbr=on;
dxdg=on;dxdy=off;dxdr=off;
nbdg=off;nbdy=off;nbdr=on;}
else {dxg=off;dxy=off;dxr=on;
nbg=on;nby=off;nbr=off;
dxdg=off;dxdy=off;dxdr=on;
nbdg=on;nbdy=off;nbdr=off;
}
}
a0=ss%10;
a1=ss/10;
disp(a1,a0); //顯示函數(shù)
if(ss==0& m==20) //到0后數(shù)碼管不顯示
{
i++; //每一秒加一次
}
if(i!=0)
{ if(i<=3&m==20) //到0后數(shù)碼管不顯示3s
{ m=0; if(x%2==0){dxg=off;dxdg=off;
dxy=on;dxdy=on;delay(3);dxy=off;dxdy=off; //黃燈閃爍
dxr=off;dxdr=off; // 數(shù)碼管不顯示時,燈的暗滅情況
nbg=off;nbdg=off;nby=off;nbdy=off;nbdr=on;nbr=on; }
else {dxg=off;dxdg=off;dxy=off;dxdy=off;dxr=on; dxdr=on;
nbg=off;nbdg=off;nbdy=on;nby=on;delay(3);nby=off;nbdy=off; //黃燈閃爍
nbr=off;nbdr=off;}
}
if(i>3) {ss=10;m=0;i=0;x++;} //當(dāng)大于3s后循環(huán)
a0=ss%10;
a1=ss/10;
disp(a1,a0);
}
}
void shanshuo()// 在這里面黃燈閃爍不了
{while(1){nby=~nby;delay(10);
nbg=off;nbdg=off;nbr=off;nbdr=off;
dxg=off;dxdg=off;dxr=off;dxdr=off;
//disp(0,0) ; //讓數(shù)碼管滅
}
}
void keyscan()//按鍵掃描
{ if(k1==0) {delay(2);
if(k1==0)
{ flag++;
aut();while(k1==0);}
}
if(k2==0) {delay(2);
if(k2==0){shan++;
while(k2==0);}
}
}
void main()
{
TMOD=0x01;
TR0=1;
TH0=(65536-50000)/256;// 由于晶振為12,故所記次數(shù)應(yīng)為50000,計時器每隔50000微秒發(fā)起一次中斷。
TL0=(65536-50000)%256;
ET0=1;
EA=1;
while(1)
{keyscan();
if(flag==0)aut();
if(shan!=0) shanshuo();
}
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
m++;
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1