找回密码
 立即注册

QQ登录

只需一步,快速开始

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

一个单片机秒表程序代码的问题

[复制链接]
跳转到指定楼层
楼主
ID:792404 发表于 2020-11-2 15:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
50黑币
这是一个秒表程序代码,普中科技的实验板,想实现的功能是:按住key4按键不放秒表计时开始,松开key4按键秒表计时暂停。不知道问题出在哪里了,实现不了。其余的key1加,key2减,key3清零都正常,只有key4不行,请各位师傅们帮忙看看,谢谢!

具体代码见2楼

最佳答案

查看完整内容

显示函数放在中断里,不然按键干扰显示。暂停不要关定时器,只停止计数即可。修改如下:
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2020-11-2 15:45 | 只看该作者
显示函数放在中断里,不然按键干扰显示。暂停不要关定时器,只停止计数即可。修改如下:
  1. #include"reg52.h"
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit key1=P3^1;
  5. sbit key2=P3^0;
  6. sbit key3=P3^2;
  7. sbit key4=P3^3;
  8. sbit lsa=P2^2;
  9. sbit lsb=P2^3;
  10. sbit lsc=P2^4;
  11. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  12.                    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  13. uchar num[2];
  14. uint a,t;
  15. bit sign=0;

  16. void delay(uint i)
  17. {
  18.   uint x,y;
  19.   for(x=i;x>0;x--)
  20.     for(y=123;y>0;y--);
  21. }

  22. void display()
  23. {
  24.         static uchar i=0;
  25.         num[1]=a/10;
  26.         num[0]=a%10;
  27.         P0=0x00;
  28.         switch(i)
  29.         {
  30.                 case(0):lsa=0;lsb=0;lsc=0;break;
  31.                 case(1):lsa=1;lsb=0;lsc=0;break;
  32.         }
  33.         P0=table[num[i]];
  34.         i++;i%=2;
  35. }

  36. void keyscan()
  37. {

  38.    if(key1==0)
  39.    {
  40.       delay(5);
  41.           if(key1==0)
  42.           {
  43.              a++;
  44.                  if(a==60)
  45.                  {
  46.                     a=0;
  47.                  }
  48.                  while(!key1);
  49.           }
  50.    }
  51.    if(key2==0)
  52.    {
  53.       delay(5);
  54.           if(key2==0)
  55.           {
  56.             
  57.                  if(a==0)
  58.                  {
  59.                     a=60;
  60.                
  61.                  }
  62.                  a--;
  63.                  while(!key2);
  64.           }
  65.    }
  66.    if(key3==0)
  67.    {
  68.       delay(5);
  69.           if(key3==0)
  70.           {
  71.              a=0;
  72.                  while(!key3);
  73.           }
  74.    }
  75.    if(key4==0)
  76.    {
  77.       delay(5);
  78.           if(key4==0)
  79.           {
  80.                             sign=~sign;
  81.              while(!key4);
  82.             
  83.           }
  84.    }

  85. }

  86. void main()
  87. {
  88.    TMOD=0x01;
  89.    TH0=(65536-5000)/256;
  90.    TL0=(65536-5000)%256;
  91.    EA=1;
  92.    ET0=1;
  93.    TR0=1;
  94.    while(1)
  95.    {
  96.       keyscan();
  97.    }
  98. }

  99. void timer0() interrupt 1
  100. {
  101.         TH0=(65536-5000)/256;
  102.         TL0=(65536-5000)%256;
  103.         if(sign)
  104.         {
  105.                 t++;
  106.                 if(t==200)
  107.                 {
  108.                         t=0;
  109.                         a++;
  110.                         if(a==60)
  111.                                 a=0;
  112.                 }
  113.         }
  114.         display();
  115. }
复制代码

回复

使用道具 举报

板凳
ID:792404 发表于 2020-11-2 15:49 | 只看该作者
这是一个秒表程序代码,普中科技的实验板,想实现的功能是:按住key4按键不放秒表计时开始,松开key4按键秒表计时暂停。不知道问题出在哪里了,实现不了。其余的key1加,key2减,key3清零都正常,只有key4不行,请各位师傅们帮忙看看,谢谢!

#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^1;
sbit key2=P3^0;
sbit key3=P3^2;
sbit key4=P3^3;
sbit lsa=P2^2;
sbit lsb=P2^3;
sbit lsc=P2^4;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar num[2];
uint a,t;

void delay(uint i)
{
  uint x,y;
  for(x=i;x>0;x--)
    for(y=123;y>0;y--);
}

void display()
{
  uchar a;
  for(a=0;a<2;a++)
  {
     switch(a)
         {
            case(0):lsa=0;lsb=0;lsc=0;break;
                case(1):lsa=1;lsb=0;lsc=0;break;
         }
         P0=table[num[a]];
         delay(10);
         P0=0x00;
  }
}

void keyscan()
{
   num[1]=a/10;
   num[0]=a%10;
   if(key1==0)
   {
      delay(5);
          if(key1==0)
          {
             a++;
                 if(a==60)
                 {
                    a=0;
                 }
                 while(!key1);
          }
   }
   if(key2==0)
   {
      delay(5);
          if(key2==0)
          {
            
                 if(a==0)
                 {
                    a=60;
               
                 }
                 a--;
                 while(!key2);
          }
   }
   if(key3==0)
   {
      delay(5);
          if(key3==0)
          {
             a=0;
                 while(!key3);
          }
   }
   if(key4==0)
   {
      delay(5);
          if(key4==0)
          {
             while(!key4);
                 TR0=~TR0;
          }
   }

}

void main()
{
   TMOD=0x01;
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
   EA=1;
   ET0=1;
   
   while(1)
   {
      keyscan();
      display();
   }
}

void timer0() interrupt 1
{
           TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
        t++;
        if(t==20)
        {
           t=0;
           a++;
           if(a==60)
           {
              a=0;
           }
          
        }
}
回复

使用道具 举报

地板
ID:332444 发表于 2020-11-2 17:11 | 只看该作者
在按键释放循环代码调用计数即可实现。
回复

使用道具 举报

5#
ID:792404 发表于 2020-11-2 17:34 | 只看该作者
#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^1;
sbit key2=P3^0;
sbit key3=P3^2;
sbit key4=P3^3;
sbit lsa=P2^2;
sbit lsb=P2^3;
sbit lsc=P2^4;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar num[2];
uint a,t;

void delay(uint i)
{
  uint x,y;
  for(x=i;x>0;x--)
    for(y=123;y>0;y--);
}

void display()
{
  uchar a;
  for(a=0;a<2;a++)
  {
     switch(a)
         {
            case(0):lsa=0;lsb=0;lsc=0;break;
                case(1):lsa=1;lsb=0;lsc=0;break;
         }
         P0=table[num[a]];
         delay(10);
         P0=0x00;
  }
}

void keyscan()
{
   num[1]=a/10;
   num[0]=a%10;
   if(key1==0)
   {
      delay(5);
          if(key1==0)
          {
             a++;
                 if(a==60)
                 {
                    a=0;
                 }
                 while(!key1);
          }
   }
   if(key2==0)
   {
      delay(5);
          if(key2==0)
          {
            
                 if(a==0)
                 {
                    a=60;
               
                 }
                 a--;
                 while(!key2);
          }
   }
   if(key3==0)
   {
      delay(5);
          if(key3==0)
          {
             a=0;
                 while(!key3);
          }
   }
   if(key4==0)
   {
      delay(5);
          if(key4==0)
          {
             while(!key4);
                 TR0=~TR0;
          }
   }

}

void main()
{
   TMOD=0x01;
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
   EA=1;
   ET0=1;
   
   while(1)
   {
      keyscan();
      display();
   }
}

void timer0() interrupt 1
{
           TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
        t++;
        if(t==20)
        {
           t=0;
           a++;
           if(a==60)
           {
              a=0;
           }
          
        }
}


回复

使用道具 举报

6#
ID:332444 发表于 2020-11-2 19:11 | 只看该作者
回复

使用道具 举报

7#
ID:792404 发表于 2020-11-3 07:09 | 只看该作者
xianfajushi 发表于 2020-11-2 19:11
https://blog.csdn.net/xianfajushi/article/details/89448933

谢谢总工,可以了,已解决
回复

使用道具 举报

8#
ID:792404 发表于 2020-11-3 07:10 | 只看该作者
xianfajushi 发表于 2020-11-2 17:11
在按键释放循环代码调用计数即可实现。

谢谢师傅,我试一下
回复

使用道具 举报

9#
ID:792404 发表于 2020-11-3 07:11 | 只看该作者
wulin 发表于 2020-11-2 21:53
显示函数放在中断里,不然按键干扰显示。暂停不要关定时器,只停止计数即可。修改如下:

OK了,感谢总工指点
回复

使用道具 举报

10#
ID:514901 发表于 2020-11-6 15:43 | 只看该作者
#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^1;
sbit key2=P3^0;
sbit key3=P3^2;
sbit key4=P3^3;
sbit lsa=P2^2;
sbit lsb=P2^3;
sbit lsc=P2^4;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar num[2];
uint a,t;

void delay(uint i)
{
  uint x,y;
  for(x=i;x>0;x--)
    for(y=123;y>0;y--);
}

void display()
{
  uchar a;
  for(a=0;a<2;a++)
  {
     switch(a)
         {
            case(0):lsa=0;lsb=0;lsc=0;break;
                case(1):lsa=1;lsb=0;lsc=0;break;
         }
         P0=table[num[a]];
         delay(10);
         P0=0x00;
  }
}

void keyscan()
{
   num[1]=a/10;
   num[0]=a%10;
   if(key1==0)
   {
      delay(5);
          if(key1==0)
          {
             a++;
                 if(a==60)
                 {
                    a=0;
                 }
                 while(!key1);
          }
   }
   if(key2==0)
   {
      delay(5);
          if(key2==0)
          {
            
                 if(a==0)
                 {
                    a=60;
               
                 }
                 a--;
                 while(!key2);
          }
   }
   if(key3==0)
   {
      delay(5);
          if(key3==0)
          {
             a=0;
                 while(!key3);
          }
   }
   if(key4==0)
   {
      delay(5);
          if(key4==0)
          {
             TR0 = 1;
             while(!key4)
             {
                    display();
             }
              TR0 = 0;
          }
   }

}

void main()
{
   TMOD=0x01;
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
   EA=1;
   ET0=1;
   
   while(1)
   {
      keyscan();
      display();
   }
}

void timer0() interrupt 1
{
           TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
        t++;
        if(t==20)
        {
           t=0;
           a++;
           if(a==60)
           {
              a=0;
           }
           
        }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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