標題: 這是一個籃球比賽計時計分器的單片機程序段,控制啟停功能鍵不能正常工作,求大神指點 [打印本頁]

作者: Y-healer    時間: 2019-1-27 14:12
標題: 這是一個籃球比賽計時計分器的單片機程序段,控制啟停功能鍵不能正常工作,求大神指點
  1. #include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器

  2. #define uchar  unsigned char

  3. typedef unsigned int u16;          //對數(shù)據(jù)類型進行聲明定義
  4. typedef unsigned char u8;


  5. #define GPIO_KEY P1
  6. #define KEY1 1
  7. #define KEY2 2
  8. #define KEY3 3
  9. #define KEY4 4

  10. bit playon=0;        //啟停按鍵指示位

  11. sbit LSA=P2^2;
  12. sbit LSB=P2^3;
  13. sbit LSC=P2^4;

  14. sbit k1=P3^1;                                                                                                                                                                                   
  15. sbit k2=P3^0;
  16. sbit k3=P3^2;
  17. sbit k4=P3^3;         //定義按鍵端口
  18. sbit beep=P3^7;





  19. char keynnm;
  20. char keyuum;
  21. u16 s;
  22. u8 sec=0,mb[8],scc=0;



  23. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  24.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值


  25. void Timer0Init()
  26. {
  27.         TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。

  28.         TH0=0XFC;        //給定時器賦初值,定時1ms
  29.         TL0=0X18;        
  30.     TR0=0;//打開定時器                        
  31. }


  32. /*******************************************************************************
  33. * 函 數(shù) 名         : delay
  34. * 函數(shù)功能                   : 延時函數(shù),i=1時,大約延時10us
  35. *******************************************************************************/
  36. void delay(u16 i)
  37. {
  38.         while(i--);        
  39. }
  40. /*******************************************************************************/
  41. //mode=0 單次   1:連續(xù)
  42. u8 KeyScan(u8 mode)
  43. {
  44.         static u8 keyen=1;
  45.         if(mode==1)
  46.         {
  47.                 keyen=1;
  48.         }
  49.         if(keyen==1&&(k1==0||k2==0||k3==0||k4==0))
  50.         {
  51.                 delay(1000);  //消抖處理
  52.                 keyen=0;
  53.                 if(k1==0)return KEY1;
  54.                 else if(k2==0)return KEY2;
  55.                 else if(k3==0)return KEY3;
  56.                 else if(k4==0)return KEY4;                                
  57.         }
  58.         else if(k1==1&&k2==1&&k3==1&&k4==1)
  59.         {
  60.                 keyen=1;
  61.         }
  62.         return 0;        
  63. }


  64. void DigDisplay()
  65. {
  66.      u8 i;   


  67.         for(i=0;i<8;i++)
  68.         {
  69.                 switch(i)         //位選,選擇點亮的數(shù)碼管,
  70.                 {
  71.                     case(0):
  72.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  73.                         case(1):
  74.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  75.                         case(2):
  76.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  77.                         case(3):
  78.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  79.                         case(4):
  80.                                    LSA=0;LSB=0;LSC=1; break;//顯示第4位
  81.                         case(5):
  82.                             LSA=1;LSB=0;LSC=1; break;//顯示第5位
  83.                         case(6):
  84.                             LSA=0;LSB=1;LSC=1; break;//顯示第6位
  85.                         case(7):
  86.                             LSA=1;LSB=1;LSC=1;break;//顯示第7位                  
  87.                      }
  88.                         P0=smgduan[mb[i]];
  89.                         delay(100);
  90.                         P0=0x00;
  91.                 }                           
  92.         }

  93. /*******************************************************************************
  94. * 函 數(shù) 名         : KeyDown
  95. * 函數(shù)功能                   : 檢測有按鍵按下并讀取鍵值
  96. * 輸    入         : 無
  97. * 輸    出         : 無
  98. *******************************************************************************/
  99. void settime(void)
  100. {

  101.         char a=0;
  102.         GPIO_KEY=0x0f;
  103.         if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
  104.         {
  105.                 delay(1000);//延時10ms進行消抖
  106.                 if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
  107.                  {        
  108.                         //測試列
  109.                         GPIO_KEY=0X0F;         
  110.                         if(GPIO_KEY==0x07)
  111.                         
  112.                      GPIO_KEY=0xF0;         
  113.                          if(GPIO_KEY==0x70)
  114.                          {
  115.                                   scc++;
  116.                                 if(scc>99) scc=99;
  117.                          }
  118.                  }                     
  119.                         while((a<50)&&(GPIO_KEY!=0xf0))         //檢測按鍵松手檢測
  120.                         {
  121.                                 delay(1000);
  122.                                 a++;
  123.                         }                        
  124.                
  125.                
  126.          }
  127.          
  128. }
  129. /*********************************************************************************/


  130. /*******************************************************************************/
  131. u8 zanting(void)
  132. {
  133.         char z=0;
  134.         GPIO_KEY=0x0f;
  135.         if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
  136.         {
  137.                 delay(1000);//延時10ms進行消抖
  138.                 if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
  139.                  {
  140.                         //測試列
  141.                         GPIO_KEY=0X0F;         
  142.                         if(GPIO_KEY==0x0b)
  143.                         
  144.                      GPIO_KEY=0xF0;         
  145.                          if(GPIO_KEY==0xb0)
  146.                          {
  147.                            
  148.                         return 1;
  149.                      
  150.                            }           
  151.                   }
  152.                         while((z<50)&&(GPIO_KEY!=0xf0))         //檢測按鍵松手檢測
  153.                         {
  154.                                 delay(1000);
  155.                                 z++;
  156.                         }
  157.          
  158.                 }
  159.                 return 0;
  160.          }

  161. void jifen()
  162. {
  163.         u8 key=KeyScan(0);
  164.         switch(key)
  165.         {
  166.                 case 1:  keynnm++;if(keynnm==100)keynnm=0; break;
  167.                 case 2:  keynnm--;if(keynnm<=0)keynnm=99; break;
  168.                 case 3:  keyuum++;if(keyuum==100)keyuum=0; break;
  169.                 case 4:   keyuum--;if(keyuum<=0)keyuum=99; break;
  170.         }
  171.         mb[2]=keynnm%10;
  172.     mb[3]=keynnm/10;
  173.         mb[0]=keyuum%10;
  174.         mb[1]=keyuum/10;
  175. }         

  176. void baojing()
  177. {
  178.   if((scc==0)&&(sec<=10)&&(sec>1))
  179.    {
  180.     beep=~beep;
  181.     delay(100);

  182.         }
  183. }




  184. /*******************************************************************************
  185. * 函 數(shù) 名       : main
  186. * 函數(shù)功能                 : 主函數(shù)
  187. * 輸    入       : 無
  188. * 輸    出             : 無
  189. *******************************************************************************/
  190. void main()
  191. {        

  192.     Timer0Init();
  193.     while(1)
  194.         {        settime();                   //按鍵判斷函數(shù)
  195.                    jifen();
  196.                 baojing();
  197.             playon=zanting();
  198.             if(playon==1)
  199.               {
  200.                                               //開始標志位
  201.                     TR0=1;                                        //開啟計時
  202.                         if(TF0==1)
  203.                   {
  204.                          TF0=0;
  205.                          TH0=0XFC;        //給定時器賦初值,定時1ms
  206.                          TL0=0X18;
  207.                          s++;
  208.                    }
  209.             if(sec==0)
  210.                   {
  211.                      scc--;
  212.                      sec=60;
  213.                  
  214.                    }
  215.              if(s==100)                 //到達1s時間
  216.                   {                                                                  
  217.                          s=0;
  218.                          sec--;
  219.                   }                 
  220.               }
  221.             else
  222.               {
  223.                                           //開始標志位清零,表示暫停
  224.                     TR0=0;                                        //暫停計時
  225.                                       }
  226.         
  227.            
  228.                 mb[4]=sec%10;           //秒鐘個位
  229.         mb[5]=sec/10;            //秒鐘十位
  230.         mb[6]=scc%10;                //分鐘個位
  231.         mb[7]=scc/10;                //分鐘十位
  232.             DigDisplay();                 
  233.                                  
  234.         }               
  235. }
復制代碼





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1