#include<reg51.h>
#define uchar unsigned char
#define dula P0
#define wela P2
sbit beep=P2^3;
sbit k1 =P3^4;
sbit k2 =P3^5;
sbit k3 =P3^6;
sbit k4 =P3^7;
uchar key,j,k,daojishi=5,wei;
bit begin,end,clear,fangui;
uchar a0,b0=16;c0=16;d0=16;
unsigned int pp;
unsigned char code weitable[]={0x8f,0x4f,0x2f,0x1f};
//数码管各位的码表
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void delay(unsigned char i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display1(uchar wei,uchar shu)//在任意一位显示任意的数字
{
wei=wei-1;
wela|=0xf0;//给P2.4-P2.7置1
P0=table[shu];
wela=wela&weitable[wei];//给P2需要显示的那一位置1,其他置0
delay(5);
}
void display(uchar a,uchar b,uchar c,uchar d)
{ //一次显示4个数字,且每位显示数字可自定。
display1(1,a);
display1(2,b);
display1(3,c);
display1(4,d);
}
void keyscan()
{
if(k1==0)
{
while(k1==0);
key= 1;
}
if(k2==0)
{
while(k2==0);
key=2;
}
if(k3==0)
{
while(k3==0);
begin =1;
}
if(k4==0)
{
while(k4==0);
clear = 1;
}
}
void main()
{
TMOD=0x01;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
ET0=1;
EA=1;
a0=table[16];
beep =1;
P1=0xff;
begin=0;
key=0;
end = 0;
fangui = 0;
while(1)
{
keyscan();//按键扫描
if(begin)
{
if(!end)
TR0=1;//开始计时
if(pp==20)//定时1s
{
pp=0;
daojishi--;
}
if(key!=0)
{
a0=key;
end = 1;
daojishi = 0;
}
if(!daojishi)
{
TR0=0;
pp=0;
}
}
else
{
if(key!=0)
{
fangui=1;
a0 = key;
}
}
if(clear)
{
a0=0;key=0;begin=0;fangui=0;beep=1;daojishi=5;clear=0;
b0=16;c0=16;d0=16;P1=0xff;pp=0;end = 0;
}
d0 = daojishi;
display(a0,b0,c0,d0);
if(fangui)
{
beep=0;
P1=0x00;;
}
}
}
void time0() interrupt 1
{ TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
pp++;
}
|