STM32篮球计分器(原理图+代码)

在嵌入式课程设计做了一个基于STM32篮球计分器

小伙伴们可以借鉴一下

原理图

 程序代码

#include "stm32f10x.h"

void GPIO_Config(void);


//ÑÓʱº¯Êý
void delay(u32 d){
	u32 i=0;
	u32 n=0;
  for(i=0;i<d;i++)
     for(n=0;n<800;n++);

}

//°´¼üɨÃè
u8 key_scan(){
  if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0)==0){
	  return 1;
  }
  if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1)==0){
	  return 2;
  }
  if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2)==0){
	  return 3;
  }	
  if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3)==0){
	  return 4;
  }	
  return 0;
}




//ÊýÂë¹ÜÏÔʾ,È«ÁÁ
void nixietube_show_all(){
     //λѡÊä³öµÍµçƽ
	 GPIO_ResetBits(GPIOA, GPIO_Pin_9);
	 GPIO_ResetBits(GPIOA, GPIO_Pin_8);
	 //¶ÎÊä³ö¸ßµçƽ
	 GPIO_SetBits(GPIOA, GPIO_Pin_0);
	 GPIO_SetBits(GPIOA, GPIO_Pin_1);
	 GPIO_SetBits(GPIOA, GPIO_Pin_2);
	 GPIO_SetBits(GPIOA, GPIO_Pin_3);
	 GPIO_SetBits(GPIOA, GPIO_Pin_4);
	 GPIO_SetBits(GPIOA, GPIO_Pin_5);
	 GPIO_SetBits(GPIOA, GPIO_Pin_6);
	 GPIO_SetBits(GPIOA, GPIO_Pin_7);
}
//ÊýÂë¹ÜÊý×Ö±àºÅ
u8 xtube[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//ÏÔʾһλ
void tube_show_one(u8 ti){

	 //Åж϶ÎÊÇ·ñÐèÒªÏÔʾ£¬ÏÔʾÊä³ö¸ßµçƽ£¬²»ÏÔʾÊä³öµÍµçƽ
	 //a
     if((ti&0x01)==0x01) GPIO_SetBits(GPIOA, GPIO_Pin_0);
	 else GPIO_ResetBits(GPIOA, GPIO_Pin_0);
	 //b
     if((ti&0x02)==0x02) GPIO_SetBits(GPIOA, GPIO_Pin_1);
	 else GPIO_ResetBits(GPIOA, GPIO_Pin_1);
	 //c
     if((ti&0x04)==0x04) GPIO_SetBits(GPIOA, GPIO_Pin_2);
	 else GPIO_ResetBits(GPIOA, GPIO_Pin_2);
	 //d
	 if((ti&0x08)==0x08) GPIO_SetBits(GPIOA, GPIO_Pin_3);
	 else GPIO_ResetBits(GPIOA, GPIO_Pin_3);
	 //e
     if((ti&0x10)==0x10) GPIO_SetBits(GPIOA, GPIO_Pin_4);
	 else GPIO_ResetBits(GPIOA, GPIO_Pin_4);
	 //f
     if((ti&0x20)==0x20) GPIO_SetBits(GPIOA, GPIO_Pin_5);
	 else GPIO_ResetBits(GPIOA, GPIO_Pin_5);
	  //g
     if((ti&0x40)==0x40) GPIO_SetBits(GPIOA, GPIO_Pin_6);
	 else GPIO_ResetBits(GPIOA, GPIO_Pin_6);
	 //dp
     if((ti&0x80)==0x80) GPIO_SetBits(GPIOA, GPIO_Pin_7);
	 else GPIO_ResetBits(GPIOA, GPIO_Pin_7);
	 
}


//ÊýÂë¹ÜÏÔʾÊý×Ö
void nixietube_show(u8 num1,u8 num2){

	 //ÌáÈ¡Êý×Öλ
   u8 s1=num1/10;//ʮλ
	 u8 g1=num1%10;//¸öλ
   u8 s2=num2/10;//ʮλ
	 u8 g2=num2%10;//¸öλ
	 //¹Ø±Õλ
	 GPIO_SetBits(GPIOA, GPIO_Pin_9);
	 GPIO_SetBits(GPIOA, GPIO_Pin_8);
	 GPIO_SetBits(GPIOA, GPIO_Pin_10);
	 GPIO_SetBits(GPIOA, GPIO_Pin_11);	
	 //ÉèÖöÎ
     tube_show_one(xtube[s1]);
	 //¿ªÆôλ
	 GPIO_ResetBits(GPIOA, GPIO_Pin_8);
	 GPIO_SetBits(GPIOA, GPIO_Pin_9);
	 GPIO_SetBits(GPIOA, GPIO_Pin_10);
	 GPIO_SetBits(GPIOA, GPIO_Pin_11);	
	 //µÈ´ýÒ»»á¶ù
	 delay(10);
	 //¹Ø±Õλ
	 GPIO_SetBits(GPIOA, GPIO_Pin_9);
	 GPIO_SetBits(GPIOA, GPIO_Pin_8);
	 GPIO_SetBits(GPIOA, GPIO_Pin_10);
	 GPIO_SetBits(GPIOA, GPIO_Pin_11);	
	 //ÉèÖöÎ
	 tube_show_one(xtube[g1]);
	 //¿ªÆôµÚ¶þλ
	 GPIO_ResetBits(GPIOA, GPIO_Pin_9);
	 GPIO_SetBits(GPIOA, GPIO_Pin_8);
	 GPIO_SetBits(GPIOA, GPIO_Pin_10);
	 GPIO_SetBits(GPIOA, GPIO_Pin_11);	
	 //µÈ´ýÒ»»á¶ù
	 delay(10);
	 
	 
	 //¹Ø±Õλ
	 GPIO_SetBits(GPIOA, GPIO_Pin_9);
	 GPIO_SetBits(GPIOA, GPIO_Pin_8);
	 GPIO_SetBits(GPIOA, GPIO_Pin_10);
	 GPIO_SetBits(GPIOA, GPIO_Pin_11);	
	 //ÉèÖöÎ
	 tube_show_one(xtube[s2]);
	 //¿ªÆôµÚ¶þλ
	 GPIO_SetBits(GPIOA, GPIO_Pin_9);
	 GPIO_SetBits(GPIOA, GPIO_Pin_8);
	 GPIO_ResetBits(GPIOA, GPIO_Pin_10);
	 GPIO_SetBits(GPIOA, GPIO_Pin_11);	
	 //µÈ´ýÒ»»á¶ù
	 delay(10);

	 //¹Ø±Õλ
	 GPIO_SetBits(GPIOA, GPIO_Pin_9);
	 GPIO_SetBits(GPIOA, GPIO_Pin_8);
	 GPIO_SetBits(GPIOA, GPIO_Pin_10);
	 GPIO_SetBits(GPIOA, GPIO_Pin_11);	
	 //ÉèÖöÎ
	 tube_show_one(xtube[g2]);
	 //¿ªÆôµÚ¶þλ
	 GPIO_SetBits(GPIOA, GPIO_Pin_9);
	 GPIO_SetBits(GPIOA, GPIO_Pin_8);
	 GPIO_SetBits(GPIOA, GPIO_Pin_10);
	 GPIO_ResetBits(GPIOA, GPIO_Pin_11);	
	 //µÈ´ýÒ»»á¶ù
	 delay(10);

}



u8 people_num=0;
u32 delay_num=0;

u8 v1=0;//Äϱ±
u8 v2=0;//¶«Î÷
u8 all_time=0;
//-----------Ö÷º¯Êý
u8 keyv=0;
u8 keyv_last=0;
int main(void)
{	
    //³õʼ»¯
	u8 flag=0;
	GPIO_Config();
	GPIO_WriteBit(GPIOC, GPIO_Pin_0,1);
	while(1)
	{
	
		//°´¼ü¼ì²â
		keyv=key_scan();	
		
		if(keyv!=keyv_last){
			
			//A¼Ó
			if(keyv==1){
			   v1++;
			}
			//B¼Ó
			else if(keyv==2){
			   v2++;
			}
			//Çл»
			else if(keyv==3){
			   u8 a=v2;
				 v2=v1;
				 v1=a;
			}
			//ÇåÁã
			else if(keyv==4){
			   v1=0;
				 v2=0;
			}
		  keyv_last=keyv;
		}
			
		//ÊýÂë¹ÜË¢ÐÂÏÔʾ
		 nixietube_show(v1,v2);
		
	
   } 
}
void GPIO_Config( )
{
	GPIO_InitTypeDef GPIO_InitStructure;
	//¿ªÆôʱÖÓ
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

	//ÊýÂë¹ÜIO
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA,&GPIO_InitStructure);


//	//IOÊä³ö£¬·äÃùÆ÷
//	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
//	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
//	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
//	GPIO_Init(GPIOC,&GPIO_InitStructure);
	
	//IOÊäÈë
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	
}

 注释乱码了,粘回keil就好了

  • 15
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的STM32篮球计分代码,其中使用了两个按键和两个数码管来实现计分功能: ``` #include "stm32f10x.h" #define GPIOA_ODR_Addr (GPIOA_BASE + 0x0C) #define GPIOB_ODR_Addr (GPIOB_BASE + 0x0C) #define GPIOA_IDR_Addr (GPIOA_BASE + 0x08) #define GPIOB_IDR_Addr (GPIOB_BASE + 0x08) #define S1 1<<0 #define S2 1<<1 u8 TubeTab[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, }; void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } void Delay(u32 nCount) { u32 i; for(i=0;i<nCount;i++); } void show(u8 dat1,u8 dat2) { u8 i; for(i=0;i<8;i++) { GPIO_ResetBits(GPIOB, TubeTab[dat1]); GPIO_SetBits(GPIOB, 1<<i); Delay(10); GPIO_ResetBits(GPIOB, 1<<i); GPIO_ResetBits(GPIOB, TubeTab[dat2]); GPIO_SetBits(GPIOA, 1<<i); Delay(10); GPIO_ResetBits(GPIOA, 1<<i); } } int main(void) { u8 cnt1=0, cnt2=0; u8 s1=0, s2=0; GPIO_Configuration(); while(1) { s1 = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0); s2 = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1); if(s1 == 0) { Delay(1000); if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) { cnt1++; if(cnt1 >= 10) cnt1 = 0; } } if(s2 == 0) { Delay(1000); if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0) { cnt2++; if(cnt2 >= 10) cnt2 = 0; } } show(cnt1, cnt2); } } ``` 其中,GPIO_Configuration()函数用于初始化GPIO口,Delay()函数用于实现延时,show()函数用于显示数码管上的数字。在主函数中,通过读取按键状态来实现计分功能,最后在数码管上显示计分结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值