微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 这个单片机为什么按了按键k1之后不能立即执行?

这个单片机为什么按了按键k1之后不能立即执行?

时间:10-02 整理:3721RD 点击:
我要达到目的是按k2,数码管数值加1,(初値是60),按k3,数码管数值减1,当按下k1时,led灯第一个亮,并且数码管数值从当前显示的値一秒减一个,减到0为止且led熄灭,我现在写了一程序,就是k2,k3的功能能实现,但是当我按下k1时,led亮了,但数码管要过一会儿才开始减,怎么回事儿?
程序如下,请高手给指点下迷津

  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar temp,aa,bai,shi,ge,x,yushe;
  5. sbit dula=P2^6;
  6. sbit wela=P2^7;
  7. sbit k1=P3^4;
  8. sbit k2=P3^5;
  9. sbit k3=P3^6;
  10. sbit d1=P1^0;
  11. uchar code table[]={
  12. 0x3f,0x06,0x5b,0x4f,
  13. 0x66,0x6d,0x7d,0x07,
  14. 0x7f,0x6f,0x77,0x7c,
  15. 0x39,0x5e,0x79,0x71};
  16. void display(uchar bai,uchar shi,uchar ge);
  17. void delay(uint z);
  18. void init();
  19. void keys2();
  20. void keys3();
  21. void jishi();
  22. void main()
  23. {       
  24.         init();//初始化子程序
  25.         yushe=60;
  26.         while(1)
  27.         {
  28.                         bai=yushe/100;
  29.                         shi=yushe%100/10;
  30.                         ge=yushe%10;                                               
  31.                         display(bai,shi,ge);
  32.                         keys2();
  33.                         keys3();
  34.                         jishi();
  35.          

  36.                

  37.                          }
  38.                 }

  39. void delay(uint z)//延时子程序
  40. {
  41.         uint x,y;
  42.         for(x=z;x>0;x--)
  43.                 for(y=110;y>0;y--);
  44. }

  45. void display(uchar bai,uchar shi,uchar ge) //数码管显示子程序
  46. {
  47.     dula=1;
  48.                 P0=table[bai];
  49.                 dula=0;
  50.                 P0=0xff;
  51.                 wela=1;
  52.                 P0=0xfe;
  53.                 wela=0;
  54.                 delay(1);

  55.                 dula=1;
  56.                 P0=table[shi];
  57.                 dula=0;
  58.                 P0=0xff;
  59.                 wela=1;
  60.                 P0=0xfd;
  61.                 wela=0;
  62.                 delay(1);

  63.                 dula=1;
  64.                 P0=table[ge];
  65.                 dula=0;
  66.                 P0=0xff;
  67.                 wela=1;
  68.                 P0=0xfb;
  69.                 wela=0;
  70.                 delay(1);
  71. }

  72. void init()//初始化子程序
  73. {       
  74.         wela=0;
  75.         dula=0;
  76.         temp=0;
  77.         TMOD=0x01;
  78.         TH0=(65536-50000)/256;
  79.         TL0=(65536-50000)%256;
  80.         EA=1;
  81.         ET0=1;
  82.         TR0=1;
  83. }

  84. void timer0() interrupt 1        //定时器中断
  85. {
  86.         TH0=(65536-50000)/256;
  87.         TL0=(65536-50000)%256;
  88.         aa++;       
  89. }
  90. void keys2() //按键+函数
  91. {
  92.                 if(k2==0)
  93.                         {
  94.                                 delay(50);
  95.                                 if(k2==0)
  96.                                 {
  97.                                         yushe++;                                       
  98.                                         while(!k2)
  99.                                          {
  100.                                         bai=yushe/100;
  101.                                         shi=yushe%100/10;
  102.                                         ge=yushe%10;                                               
  103.                                         display(bai,shi,ge);
  104.                                                 }
  105.                                 }
  106.                 }
  107. }

  108. void keys3() //按键-函数
  109. {
  110.                 if(k3==0)
  111.                         {
  112.                                 delay(50);
  113.                                 if(k3==0)
  114.                                 {
  115.                                         yushe--;                                       
  116.                                         while(!k3)
  117.                                          {
  118.                                         bai=yushe/100;
  119.                                         shi=yushe%100/10;
  120.                                         ge=yushe%10;                                               
  121.                                         display(bai,shi,ge);
  122.                                                 }
  123.                                 }
  124.                 }
  125. }

  126. void jishi()//开始倒计时子程序
  127. {
  128. if(k1==0)
  129.                 {
  130.                         delay(50);
  131.                         if(k1==0)
  132.                         {
  133.                                  temp=yushe;
  134.                                  d1=0;
  135.                                  while(temp>0)
  136.                                         {
  137.                                                 if(aa==20)
  138.                                                   {
  139.                                                         aa=0;
  140.                                                         temp--;
  141.                                                         if(temp==0)
  142.                                                            {
  143.                                                                         d1=1;
  144.                                                            }
  145.                                                         bai=temp/100;
  146.                                                         shi=temp%100/10;
  147.                                                         ge=temp%10;
  148.                                                   }
  149.                                                 display(bai,shi,ge);
  150.                                         }
  151.                                  }
  152.                                 }
  153.                         }

复制代码

就这样,没有知道吗?

小马虎鬼啊!你就让“TR0”君在开始打了个酱油就无视它了 自己再好好看看

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top