#include "reg51.h"
#define uchar unsigned char
#define Port P2 //定义数据端口
sbit begin=P3^2;
sbit RS=P3^5; //定义和LCD的连接端口,写数据指令端口
sbit RW=P3^6; //读写端口
sbit E=P3^7; //使能端口
sbit Busy=P2^7; //读忙端口
uchar min=40,sec=0,count=0;
uchar a=0,b=0;
uchar str[]="0123456789";
uchar str1[16]="Team A: **";
uchar str2[16]="Team B: **";
//延时函数
void delay()
{
uchar i,j; //延时变量
for(i=0;i<50;i++) //t表示循环次数
for(j=0;j<100;j++) ;
}
// 读忙信号判断
void Read_Busy(void)
{
uchar k=255;
Port=0xff;
RS = 0;
RW = 1;
E = 1;
while((k--)&&(Busy));
E = 0;
}
// 写指令函数
void Write_Comm(uchar lcdcomm)
{
Read_Busy( ); //先读忙
RS = 0; //端口定义为写指令
RW = 0;//端口写入使能
E = 1; //端口输入总使能
Port=lcdcomm; //数据端送指令
E = 0; //端口输入总禁止
}
//写数据函数
void Write_Chr(uchar lcddata)
{
Read_Busy( ); //先读忙
RS = 1;//端口写数据使能
RW = 0;//端口写入使能
E = 1;//端口总输入使能
Port = lcddata; //数据端口送数据
E = 0; //端口总输入禁止
}
//初始化LCD
void Init_LCD(void)
{
delay(); //稍微延时,等待LCD进入工作状态
Write_Comm(0x38); //8位2行5*8
Write_Comm(0x0c); //显示开/关,光标开闪烁开
Write_Comm(0x01);//清显示
Write_Comm(0x02); //光标归位
}
void t0() interrupt 1
{
count++;
if(count==20)
{
sec--;
count=0;
}
if(sec==0)
{
min--;
sec=59;
}
if(min==0)
{
TR0=0;
min=0;
sec=0;
}
}
void ex0() interrupt 0
{
TR0=~TR0;
while(begin==0);
}
void scankey()//负责改变比分
{
switch(P1)
{
case 0xfe:
a=a+1;
if(a>99)a=99;
break;
case 0xfd:
a=a+2;
if(a>99)a=99;
break;
case 0xfb:
a=a+3;
if(a>99)a=99;
break;
case 0xf7:
if(a>0)a=a-1;
break;
case 0xef:
b=b+1;
if(b>99)b=99;
break;
case 0xdf:
b=b+2;
if(b>99)b=99;
break;
case 0xbf:
b=b+3;
if(b>99)b=99;
break;
case 0x7f:
if(b>0)b=b-1;
break;
}
while(P1!=0xff);
}
void display()//负责送显
{
uchar m;
str1[8]=str[a/10];
str1[9]=str[a%10];
str1[14]=str[min/10];
str1[15]=str[min%10];
Write_Comm(0x80);
for(m=0;m<16;m++)
Write_Chr(str1[m]);
str2[8]=str[b/10];
str2[9]=str[b%10];
str2[14]=str[sec/10];
str2[15]=str[sec%10];
Write_Comm(0xc0);
for(m=0;m<16;m++)
Write_Chr(str2[m]);
}
void main()
{
EA=1;
EX0=1;
ET0=1;
TMOD=0x01;
TH0=-50000/256;
TL0=-50000%256;
TR0=0;
Init_LCD();
while(1)
{
scankey();
display();
}
}
|