如图的单片机板STC89C51芯片,需要做一个篮球记时计分板,要求有加1-3分和减分功能,

2025-04-05 06:51:47
推荐回答(1个)
回答1:

#include
#include
#define u16 unsigned int
#define u8 unsigned char

#define Pin0 0x01
#define Pin1 0x02
#define Pin2 0x04
#define Pin3 0x08
#define Pin4 0x10
#define Pin5 0x20
#define Pin6 0x40
#define Pin7 0x80

sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;

sbit k_kt=P3^2;
sbit k_add1=P3^3;
sbit k_add2=P3^4;
sbit k_add3=P3^5;
sbit k_sub1=P3^6;
#define Kkt Pin0
#define Kadd1 Pin1
#define Kadd2 Pin2
#define Kadd3 Pin3
#define Ksub1 Pin4

u8 key=0xff;//消抖后的有效按键值
u8 key_down=0x00;//按键下降沿扫描结果,1有效
u8 key_up=0x00;  //上升沿扫描结果,1有效
u8 key_sc=0xff;//上次扫描的按键值

//按键扫描程序
void scanKey(){
static u8 temp0;
static u8 ms;
u8 temp=0;
if(k_kt==1)temp|=Kkt;
if(k_add1==1)temp|=Kadd1;
if(k_add2==1)temp|=Kadd2;
if(k_add3==1)temp|=Kadd3;
if(k_sub1==1)temp|=Ksub1;
if(temp==temp0){// 按键消抖
if(++ms>=5){//连续5次扫描的值一样,则认为是稳定状态
key=temp;
ms=0;
}
}else {
temp0=temp;
ms=0;
}
key_down=key_sc&(~key);//下降沿扫描
key_up=(~key_sc)&key;//下降沿扫描
key_sc=key;
}

u8 readPIN(u8 port,u8 pin){
    return ((port&pin)==0?0:1);
}

u8 ds[4]; //数码管显示缓存
code u8 w[]={0x01,0x02,0x04,0x08,}; //位码
code u8 d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};//断码
void dispaly(){//显示函数
static u8 a;
a++;
if(a>3)a=0;
P0=0xff;
P2=w[a];
P0=d[ds[a]];
}



void init() //初始化函数
{   TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
    ET0=1;

}

u16 js_ms=0;
u16 js=12*60;
u8 flag=0;
u16 count=0;
void main()//主函数
{
init();
TR0=1;
while(1){
ds[0]=count/1000%10;//将当前分值送到数码管缓存
ds[1]=count/100%10;
ds[2]=count/10%10;
ds[3]=count%10;
scanKey();//扫描按键
if(readPIN(key_down,Kadd1)==1){//加1
count+=1;
}
if(readPIN(key_down,Kadd2)==1){//加2
count+=2;
}
if(readPIN(key_down,Kadd3)==1){//加3
count+=3;
}
if(readPIN(key_down,Ksub1)==1){//减1
count-=1;
}

if((key&0x0f)==0){//四个减一起按下,记分清零
count=0;
}
if(readPIN(key_down,Kkt)==1){//加1
if(flag==0){
js=12*60;
js_ms=0;
flag=1;

}
else flag=0;
}

led1=(js>9*60?0:1);
led2=(js>6*60?0:1);
led3=(js>3*60?0:1);
led4=(js>0?0:1);


}

}



void timer0() interrupt 1//定时器,实现倒计时
{   
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
dispaly();
if(++js_ms>=1000&&flag!=0){
js_ms=0;
if(js>0)js--;
}
}

引脚和数码管的极性可能和你的板子不一样,但可以修改