|
下列程序?qū)崿F(xiàn)了紅綠燈的數(shù)碼顯示及對(duì)應(yīng)的流水燈顯示,但是沒(méi)有實(shí)現(xiàn)在黃燈等待時(shí)間內(nèi)流水燈閃爍,求解答一下,嘗試過(guò)直接在流水燈下邊直接加入延時(shí)函數(shù),但是數(shù)碼管進(jìn)行了閃爍而流水燈沒(méi)有閃爍求指點(diǎn)一下。圖片為使用開(kāi)發(fā)板,附錄為單片機(jī)原理圖。
單片機(jī)源程序如下:
#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
sbit nsred=P1^0;
sbit nsgreen=P1^1;
sbit nsyellow=P1^2;
sbit ewred=P1^4;
sbit ewgreen=P1^5;
sbit ewyellow=P1^6;
sbit wela=P2^6;
sbit dula=P2^7;
#define nsred() do{nsred=0;nsgreen=1;nsyellow=1;} while(0);
#define nsgreen() do{nsred=1;nsgreen=0;nsyellow=1;} while(0);
#define nsyellow() do{nsred=1;nsgreen=1;nsyellow=0;} while(0);
#define ewred() do{ewred=0;ewgreen=1;ewyellow=1;} while(0);
#define ewgreen() do{ewred=1;ewgreen=0;ewyellow=1;} while(0);
#define ewyellow() do{ewred=1;ewgreen=1;ewyellow=0;} while(0);
#define yeltime 4
#define ewtime 28+yeltime
#define nstime 16+yeltime
uchar t=ewtime;
uchar flag=1;
uchar tt=0;
uchar keyflag=0;
uchar table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar table2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
sbit key2=P3^4;
sbit key3=P3^5;
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display1(uint num1,uint num2)
{
P0=0xff;
wela=1;
P0=table1[num1];
wela=0;
dula=1;
P0=table2[0];
dula=0;
delayms(3);
P0=0xff;
wela=1;
P0=table1[num2];
wela=0;
dula=1;
P0=table2[1];
dula=0;
delayms(3);
}
void display2(uint num3,uint num4)
{
P0=0xff;
wela=1;
P0=table1[num3];
wela=0;
dula=1;
P0=table2[4];
dula=0;
delayms(3);
P0=0xff;
wela=1;
P0=table1[num4];
wela=0;
dula=1;
P0=table2[5];
dula=0;
delayms(3);
}
void INIT()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
}
void keyscan()
{
if(key2==0)
{
delayms(10);
if(key2==0)
{
keyflag=1;
}
}
if(key3==0)
{
delayms(10);
if(key3==0);
{
flag=1;
keyflag=0;
t=ewtime;
}
}
}
void main()
{
INIT();
EA=1;
nsgreen=1;
nsred=1;
nsyellow=1;
ewred=1;
ewgreen=1;
ewyellow=1;
while(1)
{
keyscan();
if(flag==1)
{
display1(t/10,t%10);
display2(t/10,t%10);
nsred();
ewgreen();
//nsred=0;
//ewgreen=0;
if(t>4)
{
ewgreen();
}
if(t>=0&&t<5) ewyellow();
if(t==0)
{
flag=0;
t=nstime;
}
}
if(flag==0)
{
display1(t/10,t%10);
display2(t/10,t%10);
nsgreen();
ewred();
if(t>4)
{
nsgreen();
}
if(t>=0&&t<5)
{
nsyellow();
ewred();
}
if(t==0)
{
flag=1;
t=ewtime;
}
}
if(keyflag==1)
{
dula=1;
P0=0xff;
dula=0;
nsred();
ewred();
flag=2;
}
}
}
void t0()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==9)
{
tt=0;
t--;
}
}
|
|