代码部分
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code tab[] ={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,
- 0x82,0xf8,0x80,0x90,0xff}; //0,12,3,4,5,6,7,8,9,关显示
- uchar b,d,t; //定义变量
- uchar fen=10,miao=0; //定时初始时间变量
- uchar flag; //标志位
- uchar temp; //矩形键盘键值
- sbit beep =P1^7 ; //蜂鸣器
- void delay(uint z) //延时函数
- {
- uint x,y;
- for(x=z;x>0;x--)
- for( y= 110;y>0;y--);
- }
- void dispaly() //定时时间显示
- {
- uchar miaoge,fenge,miaoshi,fenshi;
- miaoge = miao%10;
- P2 = 0x80;;
- P0 =tab[miaoge];
- delay(1);
- miaoshi = miao/10;
- P2 =0x40;
- P0 =tab[miaoshi];
- delay(1);
- fenge = fen%10;
- P2=0x20;
- P0 =tab[fenge];
- delay(1);
- fenshi =fen/10;
- P2 =0x10;
- P0 =tab[fenshi];
- delay(1);
- P2 =0x00;
- }
- void dispaly1(char a) //甲队比分显示
- {
- uchar ge1,shi1;
- b=a;
- ge1=b%10;
- P2=0x02;
- P0=tab[ge1];
- delay(1);
- shi1=b/10;
- P2=0x01;
- P0=tab[shi1];
- delay(1);
- P2=0x00;
-
- }
- void dispaly2(char c) //乙队比分显示
- {
- uchar ge2,shi2;
- d=c;
- ge2 =d%10;
- P2=0x08;
- P0=tab[ge2];
- delay(1);
- shi2 =d/10;
- P2 = 0x04;
- P0 =tab[shi2];
- delay(1);
- P2 =0x80;
- }
- void keyscan() //矩阵键盘扫描控制
- {
- char a,c,e,f;
- dispaly1(a);
- dispaly2(c);
- P3 =0xfe;
- temp=P3;
- temp =temp&0xf0;
- while(temp!=0xf0)
- {
- delay(5);
- temp =P3;
- temp =temp&0xf0;
- while(temp!=0xf0)
- {
- temp =P3;
- if(temp==0xee)
- {
- delay(5);
- if(temp == 0xee)
- {
- a++; //甲队比分加1
- if(a>=100)
- a=99;
- dispaly1(a);
- }
- }
- if(temp==0xde)
- {
- delay(5);
- if(temp==0xde)
- {
- a=a+2; //甲队比分加2
- if(a>=100)
- a=99;
- dispaly1(a);
- }
- }
- if(temp==0xbe)
- {
- delay(5);
- if(temp==0xbe)
- {
- a=a+3; //甲队比分加3
- if(a>=100)
- a=99;
- dispaly1(a);
- }
- }
- if(temp ==0x7e)
- {
- delay(5);
- if(temp ==0x7e)
- {
- a--; //甲队比分减1
- if(a<= -1)
- a=0;
- dispaly1(a);
- }
- }
- while(temp!= 0xf0) //松手检测
- {
- temp =P3;
- temp=temp&0xf0;
- dispaly1(a);
- }
- }
- }
- P3=0xfd;
- temp=P3;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- delay(5);
- temp =P3;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- temp =P3;
- if(temp==0xed)
- {
- delay(5);
- if(temp ==0xed)
- {
- c++; //乙队比分加1
- if(c>=100)
- c=99;
- dispaly2(c);
- }
- }
- if(temp==0xdd)
- {
- delay(5);
- if(temp==0xdd)
- {
- c= c+2; //乙队比分加2
- if(c>=100)
- c=99;
- dispaly2(c);
- }
- }
- if(temp==0xbd)
- {
- delay(5);
- if(temp ==0xbd)
- {
- c=c+3; //乙队比分3
- if(c>=100)
- c=99;
- dispaly2(c);
- }
- }
- if(temp ==0x7d)
- {
- delay(5);
- if(temp ==0x7d)
- {
- c--; //乙队比分减1
- if(c <= -1)
- c=0;
- dispaly2(c);
- }
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- dispaly2(c);
- }
- }
- }
- P3=0xfb;
- temp=P3;
- temp =temp&0xf0;
- while(temp!=0xf0)
- {
- delay(5);
- temp =P3;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- temp =P3;
- if(temp==0xeb)
- {
- delay(5);
- if(temp ==0xeb)
- {
- a=0; //双方比分清零
- dispaly1(a);
- c=0;
- dispaly2(c);
- }
- }
- if(temp == 0xdb)
- {
- delay(5);
- if(temp ==0xdb)
- {
- e=a;
- f=c;
- a=f;
- dispaly1(a); //双方比分切换
- c=e;
- dispaly2(c);
- }
- }
- if(flag!=1) //避免误操作,只有在时间停止的情况下才能加/减定时时间
- {
- if(temp==0xbb)
- {
- delay(5);
- if(temp==0xbb)
- {
- fen++; // 定时时间加1
- if(fen==99)
- fen=0;
- }
- }
- if(temp ==0x7b)
- {
- delay(5);
- if(temp==0x7b)
- {
- fen--; //定时时间减1
- if(fen== -1)
- fen=99;
- }
- }
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp =temp&0xf0;
- dispaly2(c);
- }
- }
- }
- P3=0xf7;
- temp =P3;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- delay(5);
- temp=P3;
- temp =temp&0xf0;
- while(temp!=0xf0)
- {
- temp=P3;
- if(temp==0xe7)
- {
- delay(5);
- if(temp==0xe7)
- {
- TR0=1; //比赛开始计时按键
- flag=1;
- }
- }
- if(temp==0xd7)
- {
- delay(5);
- if(temp==0xd7)
- {
- TR0=0; //比赛暂停计时按键
- flag=0;
- }
- }
- if(temp==0xb7)
- {
- delay(5);
- if(temp==0xb7)
- {
- fen=0; //比赛时间清零
- miao=0;
- }
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- dispaly2(c);
- }
- }
- }
- }
- void timer0(void)interrupt 1 //T0中断服务
- {
- TH0=0x4c; //50ms延时初值
- TL0=0x00;
- t++;
- if(t==20) //50ms走20次刚好1S,1s时间到,减1操作
- {
- t=0;
- miao--;
- if(miao == -1)
- {
- fen--;
- miao=59; //当59s减完,分减1
- }
- if(fen == -1)
- {
- fen=0; //分清零
- miao=0;
- beep=0; //时间停止蜂鸣器响
- }
- }
- }
- void init() //T0中断初始化
- {
- TMOD=0x01;
- TH0= (65536-50000)/256;
- TL0= (65536-50000)%256;
- ET0=1;
- EA=1;
- TR0=0;
- }
- void main() //主程序
- {
- P2=0xfe;
- init();
- while(1)
- {
- dispaly();
- keyscan();
- }
- }
复制代码
|