菜鸟求教 这样能不能实现按键调时

2019-07-15 09:05发布

  1. #include<AT89X52.h>
  2. #include <intrins.h>
  3. unsigned char Tab[ ]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; //1-9段码                                                                                       
  4. unsigned char port[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//数码管
  5. unsigned char TABLE[]={0,0,0,0,0,0};//显示缓冲区
  6. unsigned char count ,second,minute,hour,restar,start,flgo; //定义 秒 分 时变量
  7. unsigned char digital_number = 0;
  8. sbit k1=P3^4;
  9. sbit k2=P3^5;
  10. sbit k3=P3^6;
  11. sbit k4=P3^7;
  12. void delay(unsigned int us)
  13. {
  14.         while(us--);
  15. }
  16. void key()
  17. {
  18.    P0=0xc0;//1100 0000
  19.    restar=0;
  20.    if(k1==0)
  21.    {
  22.             delay(100);
  23.                if(k1==0)
  24.             {
  25.                       second++;
  26.                      if(second==60)
  27.                       {
  28.                          second=0;
  29.                       }
  30.                          k1=1;
  31.                       while(second==0)
  32.                       TABLE[4]=second/10;             //取秒的十位数
  33.                       TABLE[5]=second%10;
  34.             }
  35.    }
  36.     if(k2==0)
  37.     {
  38.              delay(100);//避开抖动时期
  39.              if(k2==0)
  40.                     {
  41.                       minute++;      
  42.                       if(minute==60)
  43.                       {
  44.                          minute=0;
  45.                      }
  46.                          k2=1;
  47.                       while(minute==0)
  48.                       TABLE[2]=minute/10;                  //取分的十位
  49.                       TABLE[3]=minute%10;            
  50.              }
  51.     }
  52.      if(k3==0)
  53.      {
  54.        delay(100);
  55.        if(k3==0)
  56.        {
  57.           hour++;
  58.           if(hour==24)
  59.           {
  60.                    hour=0;
  61.           }
  62.            k3=1;
  63.            while(hour==0)
  64.            TABLE[0]=hour/10;                 //取时的十位
  65.            TABLE[1]=hour%10;     
  66.       }
  67.     }
  68.         if(start==0)
  69.         {
  70.              delay(100);
  71.              if(start==1)
  72.              {
  73.                restar=1;
  74.              }
  75.         }
  76. }

  77. void main()
  78. {
  79.         TMOD=0X11;  //T1做计数器   T0做定时器
  80.         TL0=0X00; //定时五十微秒赋初值
  81.         TH0=0X4C;
  82.         TR0=1;        //启动定时器/计数器
  83.         EA=1;          //启动CPU中断
  84.         ET0=1;        //T0中断
  85.         TMOD=0X11;  //T1做定时器   T0做定时器
  86.         TL1=0XFA; //定时初始值根据显示效果调整
  87.         TH1=0XF2;
  88.         TR1=1;        //启动定时器/计数器
  89.         ET1=1;        //T1中断
  90.         key();
  91.         while(1)         
  92.         {
  93.                 if(flgo==1)                  //当标志位满足时执行
  94.                 {
  95.                       second++;
  96.                           TABLE[4]=second/10;             //取秒的十位数
  97.                           TABLE[5]=second%10;               //取秒的个位数
  98.                       if(second==60)                  
  99.                           {
  100.                                  second=0;                //如果秒计满60,将秒计数变量清0
  101.                                 TABLE[4]=second/10;
  102.                                 TABLE[5]=second%10;
  103.                                 minute++;                //分钟计数变量加1
  104.                                 TABLE[2]=minute/10;                  //取分的十位
  105.                                 TABLE[3]=minute%10;                 //取分的个位
  106.                           }
  107.                           if(minute==60)
  108.                           {
  109.                                 minute=0;                //如果分钟计满60,将分钟计数变量清0
  110.                                 TABLE[2]=minute/10;                 
  111.                                 TABLE[3]=minute%10;                 
  112.                                 hour++;                               //小时计数变量加1
  113.                                 TABLE[0]=hour/10;                 //取时的十位
  114.                                 TABLE[1]=hour%10;                 //取时的个位
  115.                           }
  116.                           if(hour==24)
  117.                           {
  118.                                         hour=0;                            //如果小时计满24,将小时计数变量清0
  119.                           }      
  120.                           flgo=0;                                        //标志位清零
  121.                 }   
  122.         }
  123. }

  124. void  t0interrupt(void) interrupt 1                //定时器T0的中断处理
  125. {
  126.             TL0=0X00;                                        //重赋初值
  127.             TH0=0X4C;
  128.             count++;
  129.             if(count==20)                                //延时一秒
  130.             {
  131.                           count=0;
  132.                           flgo=1;                                       //标志位
  133.                         }
  134. }
  135. void  t1interrupt(void) interrupt 3         //计数器T1的中断处理
  136. {
  137.         unsigned char temp;
  138.         TL1=0XFA;
  139.         TH1=0XF2;
  140.         P2_6= 0;
  141.         P2_7= 0;
  142.         temp = TABLE[digital_number];   //  取显示内容     
  143.         P0 = Tab[temp];
  144.         P2_6 = 1;
  145.         _nop_();                  //空指令,延时一个指令周期
  146.         P2_6 = 0;
  147.         P0 = port[digital_number];
  148.         P2_7= 1;
  149.         _nop_();
  150.                P2_7 = 0;
  151.         digital_number ++;
  152.         if(digital_number == 6) digital_number = 0;        
  153. }
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
余一痴
2019-07-17 02:24
人中狼 发表于 2017-12-29 10:37
key()不放在while里面,就应该没办法调整时间,原因就是二楼所说的,至于你所说的不能放到while里面,应该说明一下理由和现象
  1. void key()
  2. {
  3.    P3=0xf0;//1100 0000
  4.    restar=0;
  5.    if(k1==0)
  6.    {
  7.             delay(1000);
  8.                if(k1==1)
  9.             {
  10.                       second++;
  11.                      if(second==60)
  12.                       {
  13.                          second=0;
  14.                       }
  15.                          k1=1;
  16.                       
  17.                       TABLE[4]=second/10;             //取秒的十位数
  18.                       TABLE[5]=second%10;
  19.             }
  20.    }
  21.     if(k2==0)
  22.     {
  23.              delay(1000);//避开抖动时期
  24.              if(k2==1)
  25.                     {
  26.                       minute++;      
  27.                       if(minute==60)
  28.                       {
  29.                          minute=0;
  30.                      }
  31.                          k2=1;
  32.                       TABLE[2]=minute/10;                  //取分的十位
  33.                       TABLE[3]=minute%10;            
  34.              }
  35.     }
  36.      if(k3==0)
  37.      {
  38.        delay(1000);
  39.        if(k3==1)
  40.        {
  41.           hour++;
  42.           if(hour==24)
  43.           {
  44.                    hour=0;
  45.           }
  46.            k3=1;
  47.            TABLE[0]=hour/10;                 //取时的十位
  48.            TABLE[1]=hour%10;     
  49.       }
  50.     }
  51. }这样不放在while里面也可以调时  之前放在里面按完键之后会把数码管卡停
复制代码

一周热门 更多>