本帖最后由 interrupt_2013 于 2013-4-16 13:14 编辑
这是一个开关装置:上电后,三个小灯都不亮,按第一次按钮时,三个灯同时点亮,按第二次按钮时a灯灭,15秒后b灯灭,再隔18秒后c灯灭,用数码管显示秒计数。P0,P1接数码管段选,P2.0--P2.2接三个小灯,P2.3接小按钮。各位大侠帮我分析一下,如何关闭数码管。谢谢!
#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit D1=P2^0;
sbit D2=P2^1;
sbit D3=P2^2;
sbit s1=P2^3;
uint8 num,num1,s1num;
uint16 count;
const uint8 table[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
void delay(uint8 z);
void init();
void keyscan();
void main()
{
init();
while(1)
{
keyscan();
}
}
void init()
{
D1=1;
D2=1;
D3=1;
num=0;
num1=0;
s1num=0;
count=0;
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET0=1;
ET1=1;
}
void keyscan()
{
if(s1==0)
{
delay(10);
if(s1==0)
{
s1num++;
while(!s1);
if(s1num==1)
{
D1=0;
D2=0;
D3=0;
}
if(s1num==2)
{
D1=1;
D2=0;
D3=0;
TR0=1;
}
}
}
}
void t0_timer() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
num++;
if(num==15)
{
D2=1;
num=0;
TR0=0;
TR1=1;
}
P1=table[num/10];
P0=table[num%10];
}
}
void t1_timer() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
num1++;
if(num1==18)
{
num1=0;
D3=1;
TR1=0;
}
P1=table[num1/10];
P0=table[num1%10];
}
}
void delay(uint8 z)
{
uint16 i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
} |