最近,要設計一個籃球賽計分計時器,把倒時器做好了,在設計按鍵加分這個環(huán)節(jié)出了問題,總是不準
不是多次按鍵才有效,就是一次按加N多分,而設計本意是按一次鍵只加一分。
看書上介紹的按鍵防拌動技術,用上去了,也不行。達不到效果
我也曾采用中斷,還是不理想
高手們,支支招!
下面是加分函數
void deal_with(void)
{
if(!f11_key) //一隊加分按鍵
{ delay(200);
while(f11_key)
{
jia_fen++;
goto deal_out;
}
}
if(!f21_key) //2隊加分按鍵
{ delay(200);
while(f21_key)
{
yi_fen++;
goto deal_out;
}
}
deal_out:;
end:;
}
全部程序如下:
#include<AT89X51.h>
#define uchar unsigned char
#define uint unsigned int
uint cur_min,cur_sec,cur_ms;
uint q_wei,b_wei,s_wei,g_wei,temp;
sbit on_off_key=P3^0; //define on_off key
sbit reset_key=P3^1; //reset key
sbit sec_flash=P1^1; //flash led
sbit time_respons_led=P1^3; //time respons,led on
sbit f11_key=P3^2; //甲隊+1BUTTON
sbit f21_key=P3^3; //yi+1
uint jia_fen,yi_fen;
uchar code design[10]={ 0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60};
//****************************************************************************************
//****************************************************************************************
//*****************延時函數***************************************************************
void delay(uint i)
{
uint j;
for(;i>0;i--)
for(;j<120;j++)
{;}
}
//****************************************************************************************
//deal_with甲方、乙方分數處理*************************************************************
//****************************************分數的處理**************************************
void deal_with(void)
{
if(!f11_key)
{ delay(200);
while(f11_key)
{
jia_fen++;
goto deal_out;
}
}
if(!f21_key)
{ delay(200);
while(f21_key)
{
yi_fen++;
goto deal_out;
}
}
deal_out:;
end:;
}
//
q_wei=qq;
b_wei=bb;
s_wei=ss;
g_wei=gg;
//
temp=q_wei;
switch(temp)
{case 0x00:P0=design[0];break;
case 0x01:P0=design[1];break;
case 0x02:P0=design[2];break;
case 0x03:P0=design[3];break;
case 0x04:P0=design[4];break;
case 0x05:P0=design[5];break;
case 0x06:P0=design[6];break;
case 0x07:P0=design[7];break;
case 0x08:P0=design[8];break;
case 0x09:P0=design[9];break;
}
P2=0xef; //P2.3=1,顯示千位
delay(10);
//
temp=b_wei;
switch(temp)
{case 0x00:P0=design[0];break;
case 0x01:P0=design[1];break;
case 0x02:P0=design[2];break;
case 0x03:P0=design[3];break;
case 0x04:P0=design[4];break;
case 0x05:P0=design[5];break;
case 0x06:P0=design[6];break;
case 0x07:P0=design[7];break;
case 0x08:P0=design[8];break;
case 0x09:P0=design[9];break;
}
P2=0xdf; //p2.2=1,顯示百位
delay(10);
//
temp=s_wei;
switch(temp)
{case 0x00:P0=design[0];break;
case 0x01:P0=design[1];break;
case 0x02:P0=design[2];break;
case 0x03:P0=design[3];break;
case 0x04:P0=design[4];break;
case 0x05:P0=design[5];break;
case 0x06:P0=design[6];break;
case 0x07:P0=design[7];break;
case 0x08:P0=design[8];break;
case 0x09:P0=design[9];break;
}
P2=0xbf; //p2.2=1,顯示百位
delay(10);
//
temp=g_wei;
switch(temp)
{case 0x00:P0=design[0];break;
case 0x01:P0=design[1];break;
case 0x02:P0=design[2];break;
case 0x03:P0=design[3];break;
case 0x04:P0=design[4];break;
case 0x05:P0=design[5];break;
case 0x06:P0=design[6];break;
case 0x07:P0=design[7];break;
case 0x08:P0=design[8];break;
case 0x09:P0=design[9];break;
}
P2=0x7f; //p2.2=1,顯示個位
delay(10);
}
//*********************************************************************************
//*********************************************************************************
//*********************************************************************************
//*********************************************************************************
void main()
{
initial(); //system initial
for(;;)
{
if(!on_off_key) //按下鍵啟動計時
{ET0=1;
TR0=1;}
else
{TR0=0;
ET0=0;}
display(cur_min,cur_sec); //15min
deal_with(); //計分函數
fenshu_dis(jia_fen,0);
fenshu_dis(yi_fen,1);
if(!reset_key)
{TMOD=0x01;
TH0=0x4c;
TL0=0x00;
EA=1;
cur_min=15;
cur_sec=0;
}
if((cur_min==0)&&(cur_sec==0))
{time_respons_led=0x00; //設定時間到達,指示燈亮
ET0=0;
TR0=0;}
else {time_respons_led=1;}
}
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |