找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6256|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

按鍵的困惑

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:16763 發(fā)表于 2009-11-25 23:26 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式

最近,要設(shè)計(jì)一個籃球賽計(jì)分計(jì)時器,把倒時器做好了,在設(shè)計(jì)按鍵加分這個環(huán)節(jié)出了問題,總是不準(zhǔn)

不是多次按鍵才有效,就是一次按加N多分,而設(shè)計(jì)本意是按一次鍵只加一分。

看書上介紹的按鍵防拌動技術(shù),用上去了,也不行。達(dá)不到效果

我也曾采用中斷,還是不理想

高手們,支支招!

下面是加分函數(shù)

void deal_with(void)
{
  if(!f11_key)                  //一隊(duì)加分按鍵
  {    delay(200);
      while(f11_key)
   {
      jia_fen++;
   goto deal_out;
   }
   }
  if(!f21_key)      //2隊(duì)加分按鍵
  {    delay(200);
      while(f21_key)
   {
      yi_fen++;
   goto deal_out;
   }
   }
deal_out:;
end:;
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:16763 發(fā)表于 2009-11-25 23:27 | 只看該作者

全部程序如下:

#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;            //甲隊(duì)+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};
//****************************************************************************************
//****************************************************************************************
//*****************延時函數(shù)***************************************************************
void delay(uint i)
    {
  uint j;
  for(;i>0;i--)
     for(;j<120;j++)
  {;}
 }
//****************************************************************************************
//deal_with甲方、乙方分?jǐn)?shù)處理*************************************************************
//****************************************分?jǐn)?shù)的處理**************************************
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:;
}

 

回復(fù)

使用道具 舉報(bào)

板凳
ID:16763 發(fā)表于 2009-11-25 23:27 | 只看該作者
//******************************************************************************************
//******************************************************************************************
//******************************************************************************************
//**********************計(jì)分顯示************************************************************
void fenshu_dis(uint fff,dis_bit)
     {uint sss,ggg;                 //顯示數(shù)據(jù):十位,個位
   sss=fff/10;
   ggg=fff%10;
   if(dis_bit==0)                 //顯示甲方分?jǐn)?shù)
       {switch(sss)     //甲方十位
        {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=0xfe;  
   delay(10);
   switch(ggg)      //甲方個位
     {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=0xfd;      
   delay(10);
       }
   else if(dis_bit==1)         //顯示乙方分?jǐn)?shù)
    { 
   {switch(sss)     //乙方十位
           {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=0xfb;       //乙方個數(shù)
      delay(10);
       switch(ggg)
        {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=0xf7;     
      delay(10);
   }
   }
 }
//***********************************************************************
//***********************************************************************
//***********************************************************************
//***********************初使化函數(shù)**************************************
void initial(void)
    {cur_min=15;
  cur_sec=0;
  TMOD=0x01;//50ms中斷
  TH0=0x3C;
  TL0=0xB2;
  EA=1;
  //EX0=1;
  //EX1=1;
  //IT0=1;
  //IT1=1;
  if(!on_off_key)
      {ET0=1;
       TR0=1;}
  time_respons_led=1;
  }
//********************************************************************************
//********************************************************************************
//********************************************************************************
//**************************T0中斷函數(shù)********************************************
void time0_int(void) interrupt 1
{     TMOD=0x01;
     TH0=0x4c;
  TL0=0x00;
     cur_ms++;                       //+1
     if(cur_ms>=20)           //中斷次數(shù)達(dá)到20
      { cur_ms=0x00;                 //ms清零
    sec_flash=~sec_flash;      //秒閃爍
          if(cur_sec!=0x00)             //秒不等于0則減1,
              {cur_sec--;}
    else
     { cur_sec=59;
       cur_min--;
     }
    }
}
//*******************************************************************************
//*******************************************************************************
//*******************************************************************************
//void ex0int(void) interrupt 0
//{  bit temp,temp2;
//    temp=P3^2;
// if(!temp)
//    {    delay(50);
//      temp2=P3^2;
//   while(temp2)
//      {   delay(50);
//           jia_fen++;
//    break;}
//    }
//}
//*******************************************************************************
//*******************************************************************************
//*******************************************************************************
//void ex1int(void) interrupt 2
//{  bit temp,temp2;
//    temp=P3^3;
// if(!temp)
//    {    delay(50);
//      temp2=P3^3;
//   while(temp2)
//      {   delay(50);
//             yi_fen++;
//    break;
//   }
//     }
//}
//*******************************************************************************
//*******************************************************************************
//*******************************************************************************
//******************************************************************************* 
void display(uint dis_min,dis_sec)    //顯示
    {uint qq,bb,ss,gg;             //千百十個位
  //分種的處理
 
 
      if(dis_min>0x09)
          {qq=dis_min/10;
        bb=dis_min%10;}
      else
          {qq=0x00;
        bb=dis_min;}
 //秒的處理
      if(dis_sec>0x09)
          {ss=dis_sec/10;
        gg=dis_sec%10;}
      else
          {ss=0x00;
        gg=dis_sec;}
    if((qq==0)&&(bb==0)&&(ss==0)&&(gg==0)){TR0=0;}   //計(jì)數(shù)時間到,關(guān)斷計(jì)數(shù)器,顯示0000

 //
  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)       //按下鍵啟動計(jì)時
          {ET0=1;
        TR0=1;}
       else
          {TR0=0;
        ET0=0;}
      display(cur_min,cur_sec);  //15min
   deal_with();                     //計(jì)分函數(shù)
   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;       //設(shè)定時間到達(dá),指示燈亮
               ET0=0;
               TR0=0;}
       else {time_respons_led=1;}
   }
     }

回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表