找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1625|回复: 0
打印 上一主题 下一主题
收起左侧

这是一个篮球比赛计时计分器的单片机程序段,控制启停功能键不能正常工作,求大神指点

[复制链接]
跳转到指定楼层
楼主
ID:473339 发表于 2019-1-27 14:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

  2. #define uchar  unsigned char

  3. typedef unsigned int u16;          //对数据类型进行声明定义
  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. * 函 数 名         : delay
  34. * 函数功能                   : 延时函数,i=1时,大约延时10us
  35. *******************************************************************************/
  36. void delay(u16 i)
  37. {
  38.         while(i--);        
  39. }
  40. /*******************************************************************************/
  41. //mode=0 单次   1:连续
  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)         //位选,选择点亮的数码管,
  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. * 函 数 名         : KeyDown
  95. * 函数功能                   : 检测有按键按下并读取键值
  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. * 函 数 名       : main
  186. * 函数功能                 : 主函数
  187. * 输    入       : 无
  188. * 输    出             : 无
  189. *******************************************************************************/
  190. void main()
  191. {        

  192.     Timer0Init();
  193.     while(1)
  194.         {        settime();                   //按键判断函数
  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. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表