📄 aa.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 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 flag1; /*显示页面选择标志*/
bit flag2;
bit flag3;
bit fgk; /*队伍选择标志*/
bit fgk1;
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,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
/*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,0x30,0x30,0x3A,0x30,0x30,0x20};
/* 空 0 0 : 0 0 空*/
unsigned char xdata hz3[16]={0xD6,0xD0,0xB9,0xFA,0x56,0x53,0xC3,0xC0,0xB9,0xFA,
/* 中 国 V S 美 国*/
0x20,0x20,0xBD,0xF8,0xB9,0xA5 };
/* 进 攻 */
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};
/* 定 : */
unsigned char xdata fg1[16]={0x20,0x20,0xB7,0xB8,0xB9,0xE6,0xB4,0xCE,0xCA,0xFD,
/* 犯 规 次 数 */
0xCD,0xB3,0xBC,0xC6,0x20,0x20};
/* 统 计 */
unsigned char xdata fg2[16]={0xD6,0xD0,0xB9,0xFA,0xb6,0xD3,0x20,0x20,0x20,
/* 中 国 队 */
0x20,0xC3,0xC0,0xB9,0xFA,0xb6,0xD3};
/* 美 国 队 */
unsigned char xdata fg3[16]={0x20,0x20,0x30,0x30,0x20,0x20,0x20,0x20,0x20,
/* 0 0 */
0x20,0x20,0x20,0x30,0x30,0x20,0x20};
/* 0 0 */
unsigned char xdata fg4[16]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/* 空 */
0x20,0x20,0x20,0x20,0x20,0x20,0x20};
/* 空 */
/*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((flag1==1)&&(flag2==0)&&(flag3==0))w_d_add=hz1[2*i];
if((flag1==0)&&(flag2==1)&&(flag3==0))w_d_add=start1[2*i]; /* 写数据 ,上半字节*/
if((flag1==0)&&(flag2==0)&&(flag3==1))w_d_add=fg1[2*i];
lcd_busy();
if((flag1==1)&&(flag2==0)&&(flag3==0))w_d_add=hz1[2*i+1]; /* 写数据 ,下半字节*/
if((flag1==0)&&(flag2==1)&&(flag3==0))w_d_add=start1[2*i+1];
if((flag1==0)&&(flag2==0)&&(flag3==1))w_d_add=fg1[2*i+1];
}
lcd_busy();
w_c_add=0x90; /* 写第二行数据*/
for(i=0;i<8;i++)
{
lcd_busy();
if((flag1==1)&&(flag2==0)&&(flag3==0))w_d_add=hz2[2*i];
if((flag1==0)&&(flag2==1)&&(flag3==0))w_d_add=start2[2*i]; /* 写数据 ,上半字节*/
if((flag1==0)&&(flag2==0)&&(flag3==1))w_d_add=fg2[2*i];
lcd_busy();
if((flag1==1)&&(flag2==0)&&(flag3==0))w_d_add=hz2[2*i+1]; /* 写数据 ,下半字节*/
if((flag1==0)&&(flag2==1)&&(flag3==0))w_d_add=start2[2*i+1];
if((flag1==0)&&(flag2==0)&&(flag3==1))w_d_add=fg2[2*i+1];
}
lcd_busy();
w_c_add=0x88; /* 写第三行数据*/
for(i=0;i<8;i++)
{
lcd_busy();
if((flag1==1)&&(flag2==0)&&(flag3==0))w_d_add=hz3[2*i];
if((flag1==0)&&(flag2==1)&&(flag3==0))w_d_add=start3[2*i]; /* 写数据 ,上半字节*/
if((flag1==0)&&(flag2==0)&&(flag3==1))w_d_add=fg3[2*i];
lcd_busy();
if((flag1==1)&&(flag2==0)&&(flag3==0))w_d_add=hz3[2*i+1]; /* 写数据 ,下半字节*/
if((flag1==0)&&(flag2==1)&&(flag3==0))w_d_add=start3[2*i+1];
if((flag1==0)&&(flag2==0)&&(flag3==1))w_d_add=fg3[2*i+1];
}
lcd_busy();
w_c_add=0x98; /* 写第四行数据*/
for(i=0;i<8;i++)
{
lcd_busy();
if((flag1==1)&&(flag2==0)&&(flag3==0))w_d_add=hz4[2*i];
if((flag1==0)&&(flag2==1)&&(flag3==0))w_d_add=start4[2*i]; /* 写数据 ,上半字节*/
if((flag1==0)&&(flag2==0)&&(flag3==1))w_d_add=fg4[2*i];
lcd_busy();
if((flag1==1)&&(flag2==0)&&(flag3==0))w_d_add=hz4[2*i+1]; /* 写数据 ,下半字节*/
if((flag1==0)&&(flag2==1)&&(flag3==0))w_d_add=start4[2*i+1];
if((flag1==0)&&(flag2==0)&&(flag3==1))w_d_add=fg4[2*i+1];
}
}
void display_led(void) /*24秒倒计时led显示*/
{ int i,a[2];
switch (hz4[14])
{ case 0x39:a[1]=9;break;
case 0x38:a[1]=8;break;
case 0x37:a[1]=7;break;
case 0x36:a[1]=6;break;
case 0x35:a[1]=5;break;
case 0x34:a[1]=4;break;
case 0x33:a[1]=3;break;
case 0x32:a[1]=2;break;
case 0x31:a[1]=1;break;
case 0x30:a[1]=0;break;
default: break;
}
switch (hz4[13])
{ case 0x39:a[0]=9;break;
case 0x38:a[0]=8;break;
case 0x37:a[0]=7;break;
case 0x36:a[0]=6;break;
case 0x35:a[0]=5;break;
case 0x34:a[0]=4;break;
case 0x33:a[0]=3;break;
case 0x32:a[0]=2;break;
case 0x31:a[0]=1;break;
case 0x30:a[0]=0;break;
default: break;
}
COM=0x90; /*自动地址增量标志置1,将要写入的显示ram为0000*/
for(i=0;i<2;i++)
{ COM=i+0x83;
DAT=num_led[a[i]];
}
}
/*一秒延时*/
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]==0x30)&&(hz1[14]==0x30)) /*时间达到fulltime0 fulltime1:59*/
{
TR1=0; /*停止计时、发出铃声*/
speaker=0;
statefull=0;
}
}
/*判断半场时间是否到*/
if((hz2[10]==0x30)&&(hz2[11]==0x30)) /*半场时间到?*/
{
if((hz2[13]==0x30)&&(hz2[14]==0x31))
{
TR1=0; /*停止计时、发出铃声*/
speaker=0;
statehalf=0;
}
}
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]=0x30;
hz2[14]=0x30;
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[13]==0x30)&&(hz4[14]==0x30))
{
display_lcd();
display_led();
speaker=0;
TR1=0;
delay();
speaker=1;
}
display_lcd();
display_led();
}
/*定时计数器1一秒定时(20*50ms=1s)子程序*/
void timer(void)interrupt 3 using 2
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
time++;
if(time==20)
{ flag1=1;
time=0;
operate1(); /*调用全场时间,半场时间变化LCD子程序*/
operate2(); /*调用24倒计时子程序*/
flag1=1;
display_lcd();
display_led();
}
}
/*设定时间送入lcd显示器子程序*/
void timedevide(void)
{
uchar half,i;
if(fulltime==0){halftime0=0;
halftime1=0;}
else {half=fulltime/2;
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();}
}
/******************************键盘功能设定*******************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -