#include"reg51.h"
#define uint unsigned int
#define uchar unsigned char
sbit D9=P3^2;
sbit D10=P3^3;
sbit D11=P3^4;
sbit D12=P3^5;
sbit H1=P3^6;
sbit H2=P3^7;
sbit out1=P0^4;
sfr P1M1=0x91;
sfr P1M0=0x92;
bit sflag;
uchar num,shi,fen,k;
uchar shi1k,fen1k,shi2k,fen2k,shi3k,fen3k,shi4k,fen4k;
uchar shi1g,fen1g,shi2g,fen2g,shi3g,fen3g,shi4g,fen4g;
uchar s1;
unsigned int table1[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,
0x7f,0x6f}; //數組共陰數碼管顯示從0到9
unsigned int table2[]={0xf7,0xfb,0xfd,0xfe}; //數碼管位定義
unsigned int table3[4]={0};
void display(unsigned char shi,unsigned char fen);
unsigned char key();
void Delay10ms();
void main()
{
P1M0=0xff;
P1M1=0x00;
TMOD=0x10;
TH1=0xd8;
TL1=0xf0;
EA=1; //總中斷
ET1=1; //定時器中斷
TR1=1; //開啟定時器
while(1)
{
if(s1==0)
{
display(shi,fen);
}
k=key();
if(k==1)
{
s1++;
}
if(s1!=0)
{
TR1=0;
if(s1==1)
{
if(k==2) shi++;
if(k==3) shi--;
if(k==5) fen++;
if(k==6) fen--;
P2=0xfe;
display(shi,fen);
}
if(s1==2)
{
if(k==2) shi1k++;
if(k==3) shi1k--;
if(k==5) fen1k++;
if(k==6) fen1k--;
P2=0xfd;
display(shi1k,fen1k);
}
if(s1==3)
{
if(k==2) shi1g++;
if(k==3) shi1g--;
if(k==5) fen1g++;
if(k==6) fen1g--;
P2=0xff;
display(shi1g,fen1g);
}
if(s1==4)
{
if(k==2) shi2k++;
if(k==3) shi2k--;
if(k==5) fen2k++;
if(k==6) fen2k--;
P2=0xfb;
display(shi2k,fen2k);
}
if(s1==5)
{
if(k==2) shi2g++;
if(k==3) shi2g--;
if(k==5) fen2g++;
if(k==6) fen2g--;
P2=0xff;
display(shi2g,fen2g);
}
if(s1==6)
{
if(k==2) shi3k++;
if(k==3) shi3k--;
if(k==5) fen3k++;
if(k==6) fen3k--;
P2=0xf7;
display(shi3k,fen3k);
}
if(s1==7)
{
if(k==2) shi3g++;
if(k==3) shi3g--;
if(k==5) fen3g++;
if(k==6) fen3g--;
P2=0xff;
display(shi3g,fen3g);
}
if(s1==8)
{
if(k==2) shi4k++;
if(k==3) shi4k--;
if(k==5) fen4k++;
if(k==6) fen4k--;
P2=0xef;
display(shi4k,fen4k);
}
if(s1==9)
{
if(k==2) shi4g++;
if(k==3) shi4g--;
if(k==5) fen4g++;
if(k==6) fen4g--;
P2=0xff;
display(shi4g,fen4g);
}
if(s1==10)
{
s1=0;
TR1=1;
sflag=1;
}
}
if(s1==0&&sflag==1)
{
if(shi==shi1k&&fen==fen1k) {out1=0; D9=0;}
if(shi==shi1g&&fen==fen1g) { out1=1;D9=1;}
if(shi==shi2k&&fen==fen2k) D10=0;
if(shi==shi2g&&fen==fen2g) D10=1;
if(shi==shi3k&&fen==fen3k) D11=0;
if(shi==shi3g&&fen==fen3g) D11=1;
if(shi==shi4k&&fen==fen4k) D12=0;
if(shi==shi4g&&fen==fen4g) D12=1;
}
}
}
unsigned char key()
{
uchar temp1,temp2,k=0;
P0=0xff; //將P0口(列線)全部送高電平
H1=0;
H2=1;
temp1=P0; //讀取P0口當前的狀態賦給temp,例如為11011111
temp1=temp1&0xe0;//將temp和0xe0進行與運算(11100000),結果為11000000
if(temp1!=0xe0) //如果temp不等于0xe0,則說明有按鍵按下
{
Delay10ms(); //延時去抖操作
temp1=P0; //再重復一次上述操作
temp1=temp1&0xe0;
if(temp1!=0xe0)
{
temp1=P0;
//如果有按鍵按下,則將標志位置1?
switch(temp1) //判斷按下的是該行的第幾列
{
case 0xdf:k=1;break; //11011111,第一行第一列
case 0xbf: k=2;break; //10111111,第一行,第二列
case 0x7f: k=3;break; //01111111,第一行,第三列
}
while(temp1!=0xe0) //等待按鍵釋放,只要結果不等于0xe0,則說明按鍵沒有被釋放
{
temp1=P0;
temp1=temp1&0xe0;
}
}
}
P0=0xff; //將P0口(列線)全部送高電平
H1=1;
H2=0;
temp2=P0; //讀取P0口當前的狀態賦給temp,例如為11011111
temp2=temp2&0xe0;//將temp和0xe0進行與運算(11100000),結果為11000000
if(temp2!=0xe0) //如果temp不等于0xe0,則說明有按鍵按下
{
Delay10ms(); //延時去抖操作
temp2=P0; //再重復一次上述操作
temp2=temp2&0xe0;
if(temp2!=0xe0)
{
temp2=P0;
switch(temp2) //判斷按下的是該行的第幾列
{
case 0xdf: k=4;break; //11011111,第二行第一列
case 0xbf:k=5;break;//10111111,第二行,第二列
case 0x7f: k=6;break;//01111111,第二行,第三列
}
while(temp2!=0xe0) //等待按鍵釋放,只要結果不等于0xe0,則說明按鍵沒有被釋放
{
temp2=P0;
temp2=temp2&0xe0;
}
}
}
return k;
}
void time1() interrupt 3 //定時器1的中斷服務
{
TH1=0xd8;
TL1=0xf0;
num++;
if(num==100)//到了100次,1秒時間到,代表1分鐘時間到
{
num=0;
fen++;
if(fen==60)//到60后清零
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
void Delay10ms()
{
unsigned char i,j,g;
for(i=0;i<5;i++)
for(j=0;j<4;j++)
for(g=0;g<248;g++);
}
void display(unsigned char shi,unsigned char fen)
{ unsigned char m;
table3[0]=fen%10;
table3[1]=fen/10;
table3[2]=shi%10;
table3[3]=shi/10;
for(m=0;m<4;m++)
{
P0=table2[m];P1=table1[table3[m]];
Delay10ms();
}
if(m==4)
m=0;
}
|