#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();
}
}
|