#include<reg52.h>
#define uchar unsigned char
#define ul unsigned long
sbit d1=P1^0;
sbit dula=P2^6;//声明锁存器U1的锁存端
sbit wela=P2^7;//声明锁存器U2的锁存端
sbit beep=P2^3;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
uchar code table[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
uchar code tablwe[]=
{
0xdf,0xef,0xf7,0xfb,0xfd,0xfe
};
int count,hour10,hour,min10,min,s10,s,shuzi1,shuzi2,wei,num,judge,
hour10t,hourt,min10t,mint,s10t,st,shuzi1t,shuzi2t,modkey;
uchar temp,temp1;
void delayms(int);
void wedu(int,int);
void display();
void keyscan1();
void initial()
{
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=0;
hour10=2;
hour=3;
min10=5;
min=9;
s10=5;
s=9;
hour10t=0;
hourt=0;
min10t=0;
mint=0;
s10t=0;
st=0;
modkey=0;
}
void mode()
{
P3=0xff;
if(key1==0)
{
delayms(10);
if((key1==0))
{
d1=0;
beep=0;
modkey=!modkey;
//TR0=0;
}
while(!key1);
delayms(5);
while(!key1);
}
else
{
d1=1;
beep=1;
}
}
void stasto()
{
P3=0xff;
if(key2==0)
{
delayms(10);
if((key2==0))
{
d1=0;
beep=0;
TR0=~TR0;
}
while(!key2);
delayms(5);
while(!key2);
}
else
{
d1=1;
beep=1;
}
}
void resetall()
{
if(modkey==0)
{
if(TR0==0)
{
P3=0xff;
if(key3==0)
{
delayms(10);
if(key3==0)
{
d1=0;
beep=0;
st=0;
s10t=0;
mint=0;
min10t=0;
hourt=0;
hour10t=0;
}
while(!key3);
delayms(5);
while(!key3);
}
else
{
d1=1;
beep=1;
}
P3=0xff;
if(key4==0)
{
delayms(10);
if(key4==0)
{
d1=0;
beep=0;
st=9;
s10t=5;
mint=9;
min10t=5;
hourt=3;
hour10t=2;
}
while(!key4);
delayms(5);
while(!key4);
}
else
{
d1=1;
beep=1;
}
}
}
if(modkey==1)
{
if(TR0==0)
{
P3=0xff;
if(key3==0)
{
delayms(10);
if(key3==0)
{
d1=0;
beep=0;
s=0;
s10=0;
min=0;
min10=0;
hour=0;
hour10=0;
}
while(!key3);
delayms(5);
while(!key3);
}
else
{
d1=1;
beep=1;
}
P3=0xff;
if(key4==0)
{
delayms(10);
if(key4==0)
{
d1=0;
beep=0;
s=9;
s10=5;
min=9;
min10=5;
hour=3;
hour10=2;
}
while(!key4);
delayms(5);
while(!key4);
}
else
{
d1=1;
beep=1;
}
}
}
}
void main()
{
initial();
while(1)//程序在此处不停地对数码管进行动态扫描等待中断发生数码管示数发生变化
{
mode();
stasto();
keyscan1();
display();
resetall();
}
}
void display()
{
if(modkey==0)
{
for(wei=0;wei<6;wei++)
{
switch(wei)
{
case 0: wedu(st,wei);break;
case 1: wedu(s10t,wei);break;
case 2: wedu(mint,wei);break;
case 3: wedu(min10t,wei);break;
case 4: wedu(hourt,wei);break;
case 5: wedu(hour10t,wei);break;
}
}
}
if(modkey==1)
{
for(wei=0;wei<6;wei++)
{
switch(wei)
{
case 0: wedu(s,wei);break;
case 1: wedu(s10,wei);break;
case 2: wedu(min,wei);break;
case 3: wedu(min10,wei);break;
case 4: wedu(hour,wei);break;
case 5: wedu(hour10,wei);break;
}
}
}
}
void delayms(int xms)
{
int i,j;
for(i=xms;i>0;i--)
for(j=1;j>0;j--);
}
void wedu(int shuzi1,int shuzi2)
{
dula=1;
P0=table[shuzi1];//送入段选数据
dula=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存器时原来段选数据通过位选锁存器造成混乱
wela=1;
P0=tablwe[shuzi2];//进一步简化
wela=0;
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存器时原来段选数据通过位选锁存器造成混乱
delayms(150);
}
void T0_time() interrupt 1
{
TH0=(65536-45872)/256;//重装初值
TL0=(65536-45872)%256;
num++;
if(num==20)
{
num=0;
beep=0;
delayms(5);
beep=1;
delayms(5);
if((modkey==0)||(modkey==1))
{
st++;
if(st==10)
{
st=0;
s10t++;
}
if(s10t==6)
{
s10t=0;
mint++;
}
if(mint==10)
{
mint=0;
min10t++;
}
if(min10t==6)
{
min10t=0;
hourt++;
}
if(hourt==10)
{
hourt=0;
hour10t++;
}
if((hour10t==2)&&(hourt==4))
{
hour10t=0;
hourt=0;
min10t=0;
mint=0;
s10t=0;
st=0;
}
}
if((modkey==0)||(modkey==1))
{
s--;
if(s==-1)
{
s=9;
s10--;
}
if(s10==-1)
{
s10=5;
min--;
}
if(min==-1)
{
min=9;
min10--;
}
if(min10==-1)
{
min10=5;
hour--;
}
if(hour==-1)
{
hour=9;
hour10--;
}
if(hour10==-1)
{
hour10=0;
hour=0;
min10=0;
min=0;
s10=0;
s=0;
TR0=0;
judge=1;
while(judge)
{
display();
hour10=0;
hour=0;
min10=0;
min=0;
s10=0;
s=0;
TR0=0;
beep=0;
delayms(5000);
beep=1;
delayms(5000);
if((key3==0)||(key4==0)||(key1==0)||(key2==0))
{
delayms(10);
if((key3==0)||(key4==0)||(key1==0)||(key2==0))
{
TR0=0;
d1=0;
beep=0;
hour10=2;
hour=3;
min10=5;
min=9;
s10=5;
s=9;
judge=0;
}
while((!key3)||(!key4)||(!key1)||(!key2));
delayms(5);
while((!key3)||(!key4)||(!key1)||(!key2));
}
else
{
d1=1;
beep=1;
}
}
}
}
}
}
void keyscan1()
{
if(modkey==0)
{
if((TR0==0))
{
P3=0xfb;
temp1=P3;
temp1=temp1&0xf0;
if(temp1!=0xf0)
{
delayms(10);
temp1=P3;
temp1=temp1&0xf0;
if(temp1!=0xf0)
{
temp1=P3;
switch(temp1)
{
case 0xeb:
d1=0;
beep=0;
mint++;
if(mint==10)
{
mint=0;
min10t++;
if(min10t==6) min10t=0;
}
break;
case 0xdb:
d1=0;
beep=0;
mint--;
if(mint==-1)
{
mint=9;
min10t--;
if(min10t==-1) min10t=5;
}
break;
case 0xbb:
d1=0;
beep=0;
mint=0;
min10t=0;
break;
case 0x7b:
d1=0;
beep=0;
mint=9;
min10t=5;
break;
}
while(temp1!=0xf0)
{
temp1=P3;
temp1=temp1&0xf0;
}
}
}
P3=0xfd;
temp1=P3;
temp1=temp1&0xf0;
if(temp1!=0xf0)
{
delayms(10);
temp1=P3;
temp1=temp1&0xf0;
if(temp1!=0xf0)
{
temp1=P3;
switch(temp1)
{
case 0xed:
d1=0;
beep=0;
hourt++;
if(hourt==10)
{
hourt=0;
hour10t++;
}
if((hour10t==2)&&(hourt==4))
{
hour10t=0;
hourt=0;
}
break;
case 0xdd:
d1=0;
beep=0;
hourt--;
if((hour10t==0)&&(hourt==-1))
{
hour10t=2;
hourt=3;
}
else if((hourt==-1)&&(hour10t!=0))
{
hourt=9;
hour10t--;
}
break;
case 0xbd:
d1=0;
beep=0;
hourt=0;
hour10t=0;
break;
case 0x7d:
d1=0;
beep=0;
hourt=3;
hour10t=2;
break;
}
while(temp1!=0xf0)
{
temp1=P3;
temp1=temp1&0xf0;
}
}
}
P3=0xf7;
temp1=P3;
temp1=temp1&0xf0;
if(temp1!=0xf0)
{
delayms(10);
temp1=P3;
temp1=temp1&0xf0;
if(temp1!=0xf0)
{
temp1=P3;
switch(temp1)
{
case 0xe7:
d1=0;
beep=0;
st++;
if(st==10)
{
st=0;
s10t++;
if(s10t==6) s10t=0;
}
break;
case 0xd7:
d1=0;
beep=0;
st--;
if(st==-1)
{
st=9;
s10t--;
if(s10t==-1) s10t=5;
}
break;
case 0xb7:
d1=0;
beep=0;
st=0;
s10t=0;
break;
case 0x77:
d1=0;
beep=0;
st=9;
s10t=5;
break;
}
while(temp1!=0xf0)
{
temp1=P3;
temp1=temp1&0xf0;
}
}
}
}
}
if(modkey==1)
{
if((TR0==0))
{
P3=0xfb;
temp1=P3;
temp1=temp1&0xf0;
if(temp1!=0xf0)
{
delayms(10);
temp1=P3;
temp1=temp1&0xf0;
if(temp1!=0xf0)
{
temp1=P3;
switch(temp1)
{
case 0xeb:
d1=0;
beep=0;
min++;
if(min==10)
{
min=0;
min10++;
if(min10==6) min10=0;
}
break;
case 0xdb:
d1=0;
beep=0;
min--;
if(min==-1)
{
min=9;
min10--;
if(min10==-1) min10=5;
}
break;
case 0xbb:
d1=0;
beep=0;
min=0;
min10=0;
break;
case 0x7b:
d1=0;
beep=0;
min=9;
min10=5;
break;
}
while(temp1!=0xf0)
{
temp1=P3;
temp1=temp1&0xf0;
}
}
}
P3=0xfd;
temp1=P3;
temp1=temp1&0xf0;
if(temp1!=0xf0)
{
delayms(10);
temp1=P3;
temp1=temp1&0xf0;
if(temp1!=0xf0)
{
temp1=P3;
switch(temp1)
{
case 0xed:
d1=0;
beep=0;
hour++;
if(hour==10)
{
hour=0;
hour10++;
}
if((hour10==2)&&(hour==4))
{
hour10=0;
hour=0;
}
break;
case 0xdd:
d1=0;
beep=0;
hour--;
if((hour10==0)&&(hour==-1))
{
hour10=2;
hour=3;
}
else if((hour==-1)&&(hour10!=0))
{
hour=9;
hour10--;
}
break;
case 0xbd:
d1=0;
beep=0;
hour=0;
hour10=0;
break;
case 0x7d:
d1=0;
beep=0;
hour=3;
hour10=2;
break;
}
while(temp1!=0xf0)
{
temp1=P3;
temp1=temp1&0xf0;
}
}
}
P3=0xf7;
temp1=P3;
temp1=temp1&0xf0;
if(temp1!=0xf0)
{
delayms(10);
temp1=P3;
temp1=temp1&0xf0;
if(temp1!=0xf0)
{
temp1=P3;
switch(temp1)
{
case 0xe7:
d1=0;
beep=0;
s++;
if(s==10)
{
s=0;
s10++;
if(s10==6) s10=0;
}
break;
case 0xd7:
d1=0;
beep=0;
s--;
if(s==-1)
{
s=9;
s10--;
if(s10==-1) s10=5;
}
break;
case 0xb7:
d1=0;
beep=0;
s=0;
s10=0;
break;
case 0x77:
d1=0;
beep=0;
s=9;
s10=5;
break;
}
while(temp1!=0xf0)
{
temp1=P3;
temp1=temp1&0xf0;
}
}
}
}
}
P3=0xfe;
temp1=P3;
temp1=temp1&0xf0;
if(temp1!=0xf0)
{
delayms(10);
temp1=P3;
temp1=temp1&0xf0;
if(temp1!=0xf0)
{
temp1=P3;
switch(temp1)
{
case 0xee:
case 0xde:
case 0xbe:
case 0x7e:
judge=1;
while(judge)
{
//display();
hour10=0;
hour=0;
min10=0;
min=0;
s10=0;
s=0;
TR0=0;
beep=0;
delayms(5000);
beep=1;
delayms(5000);
if((key3==0)||(key4==0)||(key1==0)||(key2==0))
{
delayms(10);
if((key3==0)||(key4==0)||(key1==0)||(key2==0))
{
TR0=0;
d1=0;
beep=0;
hour10=2;
hour=3;
min10=5;
min=9;
s10=5;
s=9;
judge=0;
}
while((!key3)||(!key4)||(!key1)||(!key2));
delayms(5);
while((!key3)||(!key4)||(!key1)||(!key2));
}
else
{
d1=1;
beep=1;
}
}
while(temp1!=0xf0)
{
temp1=P3;
temp1=temp1&0xf0;
}
}
}
}
}
这个程序应用于JX-TX-1C实验板的矩阵键盘和独立键盘的功能如下图所示: