课程设计:篮球积分牌
8位LED数码显示,对A、B两队进行计分,具有加1分、加2分、
加3分,复位和切换及中场换场的功能。
一共五个版页
第一页:main函数文件
第二页:键盘——key.c
第三页:键盘——key.h
第四页:显示——display.c
第五页:显示——display.h
#include<reg51.h>
#include<stdio.h>
#include<display.h>
#include<key.h>
#define uchar unsigned char
#define uint unsigned int
uint a; // 定义无符号整数型变量,分别存储A队B队的分数的分数
uint b;
//使用共阴极数码管
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, //数字的数码管显示码
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //按照共阴极方式计算
void delay(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<120;j++);
}
void main()
{
a=0;//初始化甲分数为0
b=0;//初始化乙分数为0
P1=0Xff;//按键输入端口电平置1;检测出低电平即为按下
while(1)
{
display();
key_scan();
}
}
#include<key.h>
sbit KEY1=P1^0; //+1
sbit KEY2=P1^1; //+2
sbit KEY3=P1^2; //+3
sbit KEY4=P1^3; //转换
sbit KEY5=P1^4; //A\B加分选择
extern delay(uint);
extern uint a;
extern uint b;
uint show_exchange_flag=0; //定义显示交换标志位:
uint team_exchange_flag=0; //定义队伍标志位:0表示A队,1表示B队
void Add()
{
P1=0Xff;//按键输入端口电平置1;检测出低电平即为按下
if(team_exchange_flag==0) //判断标志位,即判断A队伍进行加分
{
if(!KEY1)
{
delay(10);
if(!KEY1)
{
while(!KEY1); //等待按键松开,
a+=1;
}
}
else if(!KEY2)
{
delay(10);
if(!KEY2)
{
while(!KEY2);
a+=2;
}
}
else if(!KEY3)
{
delay(10);
if(!KEY3)
{
while(!KEY3);
a+=3;
}
}
}
else if(team_exchange_flag==1) //判断标志位,即判断B队伍进行加分
{
if(!KEY1)
{
delay(10);
if(!KEY1)
{
while(!KEY1);
b+=1;
}
}
else if(!KEY2)
{
delay(10);
if(!KEY2)
{
while(!KEY2);
b+=2;
}
}
else if(!KEY3)
{
delay(10);
if(!KEY3)
{
while(!KEY3);
b+=3;
}
}
}
}
void key_scan()
{
P1=0Xff;//按键输入端口电平置1;检测出低电平即为按下
if(!KEY4) //低电平即为按下
{
delay(1);//消抖
if(!KEY4) //确认按下按键4
{
while(!KEY4);
show_exchange_flag+=1; //取反,即显示内容交换
}
if(show_exchange_flag>=2) show_exchange_flag=0;
}
P1=0Xff;//按键输入端口电平置1;检测出低电平即为按下
if(!KEY5)
{
delay(1);
if(!KEY5)
{
while(!KEY5);
team_exchange_flag+=1; //加分选择在A、B之间切换;0表示A队,1表示B队
}
if(team_exchange_flag>=2) team_exchange_flag=0;
}
Add();
}
#ifndef _KEY_H
#define _KEY_H
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
void Add();//加分
void key_scan();
#endif
#include<display.h>
#include<key.h>
uint A_bai,A_shi,A_ge,B_bai,B_shi,B_ge; // 定义无符号字符型变量,分别存储A、B两队的百位,十位,个位
extern uchar table[];
extern void delay(uint);
extern uint a;
extern uint b;
extern show_exchange_flag;
extern team_exchange_flag;
void decompose()//分解出百位,十位,个位
{
A_bai=(a/100);
A_shi=(a%100/10);
A_ge=(a%10);
B_bai=(b/100);
B_shi=(b%100/10);
B_ge=(b%10);
}
void display_team() //加分指示
{
if(show_exchange_flag==0)
{
if(team_exchange_flag==0)
{
P2=0xf7; //第四位
P0=table[10];
delay(1);
}
if(team_exchange_flag==1)
{
P2=0xef; //第五位
P0=table[11];
delay(1);
}
}
else if(show_exchange_flag==1)
{
if(team_exchange_flag==0)
{
P2=0xef; //第五位
P0=table[10];
delay(1);
}
if(team_exchange_flag==1)
{
P2=0xf7; //第四为
P0=table[11];
delay(1);
}
}
}
void display()
{
decompose();//分解出百位,十位,个位
display_team();//加分指示
if(show_exchange_flag==0) //显示模式1
{
/*********A的分数显示*************/
P2=0xfe; //选通数码管最高位 0x1111 1110,即P2.0为低电平,对应数码管最高位
P0=table[A_bai];
delay(1);
P2=0xfd; //选通数码管次高位 0x1111 1101,即P2.1为低电平,对应数码管次位
P0=table[A_shi];
delay(1);
P2=0xfb; //第3位 0X1111 1011,从左第3位
P0=table[A_ge];
delay(1);
/*********B的分数显示********/
P2=0xdf; //第6位 0x1101 1111,
P0=table[B_bai];
delay(1);
P2=0xbf; //第7 0x1011 1111,
P0=table[B_shi];
delay(1);
P2=0x7f; // 8 0x0111 1111,
P0=table[B_ge];
delay(1);
}
else if(show_exchange_flag==1) //显示模式2
{
/**********B的分数显示*****************/
P2=0xfe;
P0=table[B_bai]; //选通数码管最高位 0x11111110,即P2.0为低电平,对应数码管最高位
delay(1);
P2=0xfd;
P0=table[B_shi]; //选通数码管次高位 0x11111101,即P2.1为低电平,对应数码管次位
delay(1);
P2=0xfb; //3
P0=table[B_ge];
delay(1);
/**********A的分数显示*****************/
P2=0xdf;
P0=table[A_bai]; //6
delay(1);
P2=0xbf;
P0=table[A_shi]; //7
delay(1);
P2=0x7f;
P0=table[A_ge]; //8
delay(1);
}
}
#ifndef _DISPLAY_H
#define _DISPLAY_H
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
void decompose();//分解出百位,十位,个位
void display_team();
void display();
#endif