发 帖  
原厂入驻New
发烧友10周年庆典,全网超值优惠来袭!千元现金券,下单抽奖赶紧参与》》
请问我这个通过按键实现秒表运行的程序还有哪里有问题吗?
149 按键
分享
#include "reg52.h"        
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
u8 code duanxuan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
u8 s1,s2,s3,sum;
u8 MBXS[4];
void delay(u16 i)
{
        while(i--);        
}
void timer0Init()
{
        TMOD|=0X01;
        TH0=0Xd8;
        TL0=0Xf0;        
        ET0=1;
        EA=1;
        TR0=1;
}
void DigDisplay()
{
        u8 i;
        for(i=0;i<4;i++)
        {
                switch(i)
                {
                        case(0)SA=0;LSB=0;LSC=0; break;
                        case(1)SA=1;LSB=0;LSC=0; break;
                        case(2)SA=0;LSB=1;LSC=0; break;
                        case(3)SA=1;LSB=1;LSC=0; break;        
                }
                P0=MBXS;
                delay(100);
                P0=0x00;
        }
}
void datapros()
{
        MBXS[0]=duanxuan[s1/10];        
        MBXS[1]=duanxuan[s2%10];
        MBXS[2]=duanxuan[s2/10];
        MBXS[3]=duanxuan[s3%10];
}
void key2()
{
        IF(k2==0)
        {
                delay(1000);
                if(k2==0)
                {
                        Timer0Init();
      sum++;
                                        switch(sum)
                        {
                                case(2):TR0=0;
                                case(3):s1=0;s2=0;s3=0;
                                default:sum=0;
                        }
                }
                while(!k2);
        }        
}
void main()
{        
        while(1)
        {
                key2();
                datapros();
                DigDisplay();        
        }               
}
void Timer0() interrupt 1
{
        TH0=0Xd8;
        TL0=0Xf0;
        s1++;
        if(s1>=100)
        {
                s1=0;
                s2++;
                if(s2>=100)
                {
                        s2=0;
                        s3++;
                        if(s3>=10)
                        {
                                s3=0;
                        }
                }        
        }        
}
0
2019-8-19 04:35:13   评论 分享淘帖 邀请回答
6个回答
void key2()
{
    if (k2 == 0)
    {
        delay(1000);
        if (k2 == 0)
        {
            //Timer0Init();
            sum++;
            switch (sum)
            {
            case (2)://暂停
                TR0 = 0;
                break;
            case (3)://清零
                s1 = 0;
                s2 = 0;
                s3 = 0;
                break;
            default://开始
                Timer0Init();
                sum = 0;
                break;
            }
        }
        while (!k2);
    }
}
2019-8-19 07:12:47 评论

举报

程序不对,不能通过单键操控
2019-8-19 07:34:36 评论

举报

还是只有启动功能,没有暂停和清零
2019-8-19 07:54:26 评论

举报

你是直接加的break?还是复制我改后的key2函数?我不仅仅是加了break,还改了点其他地方。标记break,是因为这个错误太低级了。
2019-8-19 08:10:36 评论

举报

错误太多,给你改了。单键控制,开始、停止、清0。4位999.9秒表。
  1. #include "reg52.h"        
  2. typedef unsigned int u16;
  3. typedef unsigned char u8;
  4. sbit LSA=P2^2;
  5. sbit LSB=P2^3;
  6. sbit LSC=P2^4;
  7. sbit k2=P3^0;
  8. sbit k3=P3^2;
  9. sbit k4=P3^3;
  10. u8 code duanxuan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  11.                       0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  12. u8 s1=0,s2=0,sum=0;
  13. u16 s3=0;

  14. u8 MBXS[4];
  15. bit flag=0;

  16. void Timer0Init()        //2毫秒@12.000MHz
  17. {
  18.         TMOD |= 0x01;        //设置定时器模式
  19.         TH0 = 0xF8;                //设置定时初值
  20.         TL0 = 0x30;                //设置定时初值
  21.         TR0 = 1;                        //定时器0开始计时
  22.         EA=1;                                //开总中断
  23.         ET0=1;                        //开T0中断
  24. }

  25. void key()
  26. {
  27.         static bit j=0;//按键自锁标志
  28.         static u8 k=0;//消抖计数变量
  29.         if(k2==0)
  30.         {
  31.                 if(++k>=100 && j==0)
  32.                 {
  33.                         j=1;
  34.                         sum++;
  35.                         if(sum>=3)
  36.                                 sum=0;
  37.                         switch(sum)
  38.                         {

  39.                                 case 0:s1=0;s2=0;s3=0;break;//清0
  40.                                 case 1:flag=1;break;//计时       
  41.                                 case 2:flag=0;break;//停止
  42.                         }               
  43.                 }
  44.         }
  45.         else
  46.         {
  47.                 k=0;                                        //计数变量清0
  48.                 j=0;                                        //按键自锁标志清0
  49.         }        
  50. }

  51. void datapros()
  52. {
  53.         MBXS[0]=duanxuan[s2%10];  //十分秒      
  54.         MBXS[1]=duanxuan[s3%10]|0x80;//秒+小数点
  55.         MBXS[2]=duanxuan[s3/10%10];//十秒
  56.         MBXS[3]=duanxuan[s3/100%10];//百秒
  57. }

  58. void DigDisplay()
  59. {
  60.         static u8 i=0;
  61.         switch(i)
  62.         {
  63.                 case(0):LSA=0;LSB=0;LSC=0;P0=MBXS[i];i++;break;
  64.                 case(1):LSA=1;LSB=0;LSC=0;P0=MBXS[i];i++;break;
  65.                 case(2):LSA=0;LSB=1;LSC=0;P0=MBXS[i];i++;break;
  66.                 case(3):LSA=1;LSB=1;LSC=0;P0=MBXS[i];i=0;break;        
  67.         }
  68. }

  69. void main()
  70. {        
  71.         Timer0Init();
  72.         while(1)
  73.         {
  74.                 key();
  75.                 datapros();     
  76.         }               
  77. }
  78. void Timer0() interrupt 1//2ms
  79. {
  80.         TH0 = 0xF8;                //设置定时初值
  81.         TL0 = 0x30;                //设置定时初值
  82.         if(flag)
  83.         {
  84.                 s1++;
  85.                 if(s1>=50)//0.1秒
  86.                 {
  87.                         s1=0;
  88.                         s2++;
  89.                         if(s2>=10)//秒
  90.                         {
  91.                                 s2=0;
  92.                                 s3++;
  93.                                 if(s3>=1000)
  94.                                         s3=0;
  95.                         }        
  96.                 }        
  97.         }
  98.    DigDisplay();//2ms刷新一次
  99. }
复制代码
2019-8-19 14:22:45 评论

举报

只有小组成员才能发言,加入小组>>

784个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /10 下一条

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