基于51单片机的篮球记分牌

课程设计:篮球积分牌

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

猜你喜欢

转载自blog.csdn.net/weixin_39620162/article/details/86410049