#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table[]=".. Play ball! ....";uchar code table1[]="Welcome to here!" ;sbit key_ST=P1^5; //功能键(开始/暂停)sbit key_A1=P1^0; //功能键(A队分数加1)sbit key_A2=P1^3; //功能键(A队分数加2)sbit key_1A=P1^6; //功能键(A队分数减1)sbit key_B1=P1^1; //功能键(B队分数加1)sbit key_B2=P1^4; //功能键(B队分数加2)sbit key_1B=P1^7; //功能键(B队分数减1)sbit key_EX=P1^2; //功能键(交换场地,A/B两队分数交换)sbit key_JS=P3^0; //功能键(比赛节数加1)sbit FMQ=P3^3; //蜂鸣器sbit lcdrs=P3^5; //LCD显示的数据/命令选择端sbit lcden=P3^4; //LCD显示的使能信号uchar flag,ms,mg,ss,sg,ags,agg,bgs,bgg,num,num1,num2,js=1,C,D,t,min=0,time_fmq;int sec=12;void delayms(uint xms) //定义延时函数{uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void write_data(uchar date) //定义为数据模式{lcdrs=1;P0=date;delayms(5);lcden=1;delayms(5);lcden=0;}void write_com(uchar com) //定义为命令模式{lcdrs=0;P0=com;delayms(5);lcden=1;delayms(5);lcden=0;}void lcd_init() //LCD显示屏的初始化{lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);}void init() //LCD显示屏的初始化2(即输出“T-”、“Q-”、“A:”、“B:”){lcden=0;write_com(0x82);write_data('T');write_data('-');write_com(0x8a);write_data('Q');write_data('-');write_com(0x80+0x43);write_data('A');write_data(':');write_com(0x80+0x49);write_data('B');write_data(':');}void init_start() //LCD显示屏的初始化2(即输出“T-”、“Q-”、“A:”、“B:”){lcden=0;write_com(0x80+0x10);for(num2=0;num2<16;num2++){write_data(table1[num2]);delayms(5);}write_com(0x80+0x50);for(num2=0;num2<17;num2++){write_data(table[num2]);delayms(5);}for(num2=0;num2<16;num2++){write_com(0x18);delayms(400);}}void display(uchar min,int sec,uchar C,uchar D,uchar js) //显示函数{ss=sec/10;sg=sec%10;ms=min/10;mg=min%10;ags=C/10;agg=C%10;bgs=D/10;bgg=D%10;write_com(0x84);write_data(0x30+ms);write_data(0x30+mg);write_data(':');write_data(0x30+ss);write_data(0x30+sg);write_com(0x8d-1);write_data(0x30+js);write_com(0x80+0x45);write_data(0x30+ags);write_data(0x30+agg);write_com(0x80+0x4b);write_data(0x30+bgs);write_data(0x30+bgg);}void main(){TMOD=0x11;//定义定时器0的工作方式为0001TH0=(65536-45872)/256; //装初值TL0=(65536-45872)%256;TH1=(65536-45872)/256; //装初值TL1=(65536-45872)%256;EA=1;//打开总中断ET0=1;//打开定时器0的中断TR0=0;ET1=1;TR1=0;lcd_init();init_start();while(1){TR1=0;if(key_ST==0){delayms(5);if(key_ST==0){FMQ=0;if(flag==0){lcd_init();init();}flag=1;TR0=~TR0;}while(!key_ST)display(min,sec,C,D,js);FMQ=1;}if(key_A1==0){delayms(5);if(key_A1==0){FMQ=0;C++;}while(!key_A1)display(min,sec,C,D,js);FMQ=1;}if(key_A2==0){delayms(5);if(key_A2==0){FMQ=0;C+=2;}while(!key_A2)display(min,sec,C,D,js);FMQ=1;}if(key_1A==0){delayms(5);if(key_1A==0){FMQ=0;C--;}while(!key_1A)display(min,sec,C,D,js);FMQ=1;}if(key_B1==0){delayms(5);if(key_B1==0){FMQ=0;D++;}while(!key_B1)display(min,sec,C,D,js);FMQ=1;}if(key_B2==0){delayms(5);if(key_B2==0){FMQ=0;D+=2;}while(!key_B2)display(min,sec,C,D,js);FMQ=1;}if(key_1B==0){delayms(5);if(key_1B==0){FMQ=0;D--;}while(!key_1B)display(min,sec,C,D,js);FMQ=1;}while(min==0&&sec==0){TR0=0;TR1=1;if(key_ST==0){if(key_ST==0){FMQ=0;min=11;sec=60;TR0=~TR0;}while(!key_ST)display(min,sec,C,D,js);FMQ=1;}if((key_EX==0)&&(js==2)){delayms(10);if((key_EX==0)&&(js=2)){FMQ=0;write_com(0x80+0x43);write_data('B');write_com(0x80+0x49);write_data('A');t=C;C=D;D=t;}while(!key_EX)display(min,sec,C,D,js);FMQ=1;}if(key_JS==0){delayms(10);if(key_JS==0){FMQ=0;js++;}while(!key_JS)display(min,sec,C,D,js);FMQ=1;}}display(min,sec,C,D,js);}}void T0_time()interrupt 1 //中断0控制晶码管显示时间{TH0=(65536-45872)/256; // 重装初值TL0=(65536-45872)%256;num++;if(num==20){num=0;sec--;if(sec<0){sec=59;min--;}}}void T1_time()interrupt 3 //中断0控制晶码管显示时间{TH1=(65536-45872)/256; // 重装初值TL1=(65536-45872)%256;num1++;if(num1==20){num1=0;time_fmq++;if(time_fmq>=4)FMQ=1;elseFMQ=0;}}。