📄 basketball.c
字号:
#include<reg51.h>
#include<absacc.h>
#define w_c_add XBYTE[0x2070] /*写命令字地址*/
#define w_d_add XBYTE[0x2071] /*写数据地址 */
#define r_s_add XBYTE[0x2072] /*读状态字地址*/
#define r_d_add XBYTE[0x2073] /*读数据地质 */
#define COM XBYTE[0x2021] /*8279命令口 */
#define DAT XBYTE[0x2020] /*8279数据口 */
#define uchar unsigned char
#define uint unsigned int
uchar halftime0; /*半场时间分的十位纪录*/
uchar halftime1; /*半场时间分的个位纪录*/
uchar halftime; /*全场时间阿拉伯数字总计时*/
uchar second0; /*24秒到计时十位*/
uchar second1; /*24秒到计时个位*/
uchar time; /*用于一秒定时*/
uchar Acount; /*A队比分变量*/
uchar Bcount; /*B对比分变量*/
uchar backtime; /*10秒定时变量*/
uchar a;
uchar fulltime0; /*全场计时分钟的十位lcd编码*/
uchar fulltime1; /*全场计时分的个位lcd编码*/
uchar fulltime; /*全场计时阿拉伯数字计数*/
uchar bdata status; // 可位寻址片内数据存储器,允许位与字节混合访问
sbit speaker=P1^4;
sbit red=P1^5;
sbit yellow=P1^6; /*指示灯*/
sbit green=P1^7;
sbit busy=status^7; /*RT12864HZ液晶显示器“忙”线的检测(第7位)*/
sbit clflag=ACC^7; /*8279标志位*/
bit flag; /*显示页面选择标志*/
bit dk; /*队伍选择标志*/
bit mk; /*功能选择标志*/
bit stop; /*24秒到是标志位*/
bit pk; /*10秒延时到标志位*/
unsigned char code num_lcd[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
/*lcd数字编码*/
unsigned char code num_led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
/*led数字编码*/
unsigned char xdata hz1[16]={0xC8,0xAB,0xB3,0xA1,0xCA,0xB1,0xBC,0xE4,0x3A,
/* 全 场 时 间 :*/
0x20,0x30,0x30,0x3A,0x30,0x30,0x20};
/* 0 0 : 0 0 */
unsigned char xdata hz2[16]={0xB0,0xEB,0xB3,0xA1,0xCA,0xB1,0xBC,0xE4,0x3A,
/* 半 场 时 间 : */
0x20,0x31,0x39,0x3A,0x35,0x39,0x20};
/* 空 0 0 : 0 0 空*/
unsigned char xdata hz3[16]={0xD6,0xD0,0xB9,0xFA,0x56,0x53,0xCB,0xB9,0xC2,
/* 中 国 v s 斯 */
0xE5,0xCE,0xC4,0xC4,0xE1,0xD1,0xC7 };
/* 洛 文 尼 亚 */
unsigned char xdata hz4[16]={0x20,0x30,0x30,0x30,0x3A,0x30,0x30,0x30,0x20,0x20,
/*(主队得分) : */
0x20,0x20,0x20,0x32,0x34,0x20};
/* 客队得分 */
unsigned char xdata start1[16]={0xbb,0xb6,0xd3,0xad,0xca,0xb9,0xd3,0xc3,0x20,
/* 欢 迎 使 用 :*/
0x20,0x20,0x20,0x20,0x20,0x20,0x20};
/* 空 */
unsigned char xdata start2[16]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xc0,
/* 空 */
0xba,0xc7,0xf2,0xb1,0xc8,0xc8,0xfc};
/* 篮 球 比 赛*/
unsigned char xdata start3[16]={0xd7,0xa8,0xd3,0xc3,0xbc,0xc6,0xca,0xb1,0xbc,
/* 专 用 计 时 */
0xc7,0xb7,0xd6,0xcf,0xb5,0xcd,0xb3 };
/* 记 分 系 统 */
unsigned char xdata start4[16]={0xb1,0xc8,0xc8,0xfc,0xca,0xb1,0xbc,0xe4,0xc9,0xe8,
/* 比 赛 时 间 设 */
0xb6,0xa8,0x3A,0x20,0x30,0x30};
/* 定 : */
/*LCD忙状态检测函数 */
void lcd_busy(void)
{
do
{
status=r_s_add; /* 读状态字地址的第7位 */
}
while(busy);
}
/*LCD显示子程序*/
void display_lcd(void)
{
int i;
lcd_busy();
w_c_add=0x30; /* 功能设置:8位数据 */
lcd_busy();
w_c_add=0x0C; /* 显示状态:整体显示,游标位置无效*/
lcd_busy();
w_c_add=0x01; // 清除显示:将DDRAM填满“20H”,并且设
// 定DDRAM的地址计数器到“00”
lcd_busy();
w_c_add=0x02;
lcd_busy();
w_c_add=0x80; /* 写第一行数据*/
for(i=0;i<8;i++)
{
lcd_busy();
if(flag==1)w_d_add=hz1[2*i];
else w_d_add=start1[2*i]; /* 写数据 ,上半字节*/
lcd_busy();
if(flag==1)w_d_add=hz1[2*i+1]; /* 写数据 ,下半字节*/
else w_d_add=start1[2*i+1];
}
lcd_busy();
w_c_add=0x90; /* 写第二行数据*/
for(i=0;i<8;i++)
{
lcd_busy();
if(flag==1)w_d_add=hz2[2*i];
else w_d_add=start2[2*i]; /* 写数据 ,上半字节*/
lcd_busy();
if(flag==1)w_d_add=hz2[2*i+1]; /* 写数据 ,下半字节*/
else w_d_add=start2[2*i+1];
}
lcd_busy();
w_c_add=0x88; /* 写第三行数据*/
for(i=0;i<8;i++)
{
lcd_busy();
if(flag==1) w_d_add=hz3[2*i];
else w_d_add=start3[2*i]; /* 写数据 ,上半字节*/
lcd_busy();
if(flag==1) w_d_add=hz3[2*i+1]; /* 写数据 ,下半字节*/
else w_d_add=start3[2*i+1];
}
lcd_busy();
w_c_add=0x98; /* 写第四行数据*/
for(i=0;i<8;i++)
{
lcd_busy();
if(flag==1)w_d_add=hz4[2*i];
else w_d_add=start4[2*i]; /* 写数据 ,上半字节*/
lcd_busy();
if(flag==1)w_d_add=hz4[2*i+1]; /* 写数据 ,下半字节*/
else w_d_add=start4[2*i+1];
}
}
/*十秒延时*/
void delay(void)
{
uchar i,j,k,a=1;
for(i=0;i<50;i++)
for(j=0;j<200;j++)
for(k=0;k<100;k++)
{
a=a;
}
}
/*全场时间,半场倒计时操作子程序*/
void operate1(void)
{
uchar statefull=1,statehalf=1;
/*判断全场时间是否到*/
if((hz1[10]==fulltime0)&&(hz1[11]==fulltime1)) /*全场时间到?(写一行太多,所以分两行)*/
{
if((hz1[13]==0x35)&&(hz1[14]==0x39)) /*时间达到fulltime0 fulltime1:59*/
{
TR1=0; /*停止计时、发出铃声*/
speaker=1;
statefull=0;
}
}
/*判断半场时间是否到*/
if((hz2[10]==0x30)&&(hz2[11]==0x30)) /*半场时间到?*/
{
if((hz2[13]==0x30)&&(hz2[14]==0x30))
{
TR1=0; /*停止计时、发出铃声*/
speaker=1;
statehalf=0;
// delay1(); /*调用一分钟延时,为中场休息时间*/
}
}
if(statefull==1)
{
hz1[14]=hz1[14]+0x01; /*秒个位加1*/
if(hz1[14]==0x3A) /*秒个位是否等于10?*/
{
hz1[14]=0x30; /*等于 ,进位;秒个位归零*/
hz1[13]=hz1[13]+0x01; /*秒十位加1*/
if(hz1[13]==0x36) /*秒十位是否等于10?*/
{
hz1[13]=0x30; /*等于 ,进位;秒十位归零*/
hz1[11]=hz1[11]+0x01; /*分个位加1*/
if(hz1[11]==0x3A) /*分个位是否等于10?*/
{
hz1[11]=0x30; /*等于 ,进位;分个位归零*/
hz1[10]=hz1[10]+0x01; /*分十位加1*/
}
}
}
/*半场时间为倒计时*/
if(statehalf==1) /*半场时间未到,正常计时*/
{
hz2[14]=hz2[14]-0x01; /*秒个位加1*/
if(hz2[14]<0x30) /*秒个位是否 小于0?*/
{
hz2[14]=0x39; /*大于 ,进位;秒个位归零*/
hz2[13]=hz2[13]-0x01; /*秒十位加1*/
if(hz2[13]<0x30) /*秒十位是否大于10?*/
{
hz2[13]=0x35; /*大于 ,进位;秒十位归零*/
hz2[11]=hz2[11]-0x01; /*分个位加1*/
if(hz2[11]<0x30) /*分个位是否大于10?*/
{
hz2[11]=0x39; /*大于 ,进位;分个位归零*/
hz2[10]=hz2[10]-0x01; /*分十位加1*/
}
}
}
}
else /*半场时间到,恢复到初始状态*/
{
hz2[10]=halftime0;
hz2[11]=halftime1;
hz2[13]=0x35;
hz2[14]=0x39;
statehalf=1;
}
}
}
/*24秒倒计时子程序、显示程序*/
void operate2(void)
{
hz4[14]=hz4[14]-0x01;
if((hz4[14]==0x30)&&(hz4[13]!=0x30))
{
hz4[14]=0x39;
hz4[13]=hz4[13]-0x01;
}
if((hz4[14]==0x30)&&(hz4[13]==0x30))
{
speaker=0;
TR1=0;
stop=1;
delay();
stop=0;
speaker=1;
}
display_lcd();
}
/*定时计数器1一秒定时(20*50ms=1s)子程序*/
void timer(void)interrupt 3 using 2
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
time++;
if(time==20) //{time=0;time1++;half time--;}
{ flag=1;
time=0;
operate1(); /*调用全场时间,半场时间变化LCD子程序*/
operate2(); /*调用24倒计时变化子LED程序*/
flag=1;
display_lcd();
}
}
/*设定时间送入lcd显示器子程序*/
void timedevide(void)
{
uchar half,i;
half=fulltime/2-1;
i=half/10;
hz2[10]=num_lcd[i];
halftime0=num_lcd[i];
i=half%10;
hz2[11]=num_lcd[i];
halftime1=num_lcd[i];
display_lcd();
}
/*比分转化子程序*/
//void countdevide(void)
//{
// uchar i,j,k,b;
// b=Acount;
// i=b/100; /*篮球比分百位*/
// b=b%100;
// k=b/10; /*篮球比分十位*/
// k=b%10; /*篮球比分个位*/
// hz4[1]=num_lcd[i];
// hz4[2]=num_lcd[j];
// hz4[3]=num_lcd[k]; /*送入显示区*/
// /*上面主队,下面客队*/
// b=Bcount;
// i=b/100; /*篮球比分百位*/
// b=b%100;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -