独立键盘的问题

题目

1.数码管前三位显示一个跑表,从000到999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。(用定时器设计表)。 在上题的基础上,用另外三个独立键盘实现按n下第一个时计时停止,按下第二个时计时开始,按下第三个是计数值清零从头开始  

 分析

其实这道题目不难但是却却让我想了很长时间,感触颇深,自己明明感觉写对了,就是不是我想要的,后来才知道,也是一个群,群友告诉我们,我才知道 把keyscan()放到while(1)下面不要把keycan()放到if里面, 此时,才知道,对于定时器,能尽量写在定时器里面,因为方便函数的调用,但是定时器的调用不能超过定时器的时间,否则,会导致下一个还没有出来,另一个就开始中断了,不合情理,第二点就是你最好也把display这个函数也拉到if外面,当i=0的时候display是不执行的,我觉得你看到的效果应该是数码管亮暗跳一下跳一下的,如果没有,大概是时间太短,你把i的值扩大应该就会看到数码管数字跳一下跳一下而有一个特别亮的状态,  问题也是一直困扰我的问题,之前一直困扰我,现在终于解决了,第三是函数的调用,一定是按着顺序的,记者,这次好像就是在这个东西上翻跟头了,因此,因此自己一定要仔细分析,其他的就简单了,上程序

释放按键写一次就行了 

  1  # include <reg52.h>
  2  # define  uint unsigned  int
  3  # define uchar unsigned  char
  4  uchar ge,shi,bai;
  5   uint temp;
  6  uchar code tabledu []=
  7  {
  8   0x3f, 0x06, 0x5b, 0x4f,
  9  0x66, 0x6d, 0x7d, 0x07,
 10  0x7f, 0x6f, 0x77, 0x7c,
 11  0x39, 0x5e, 0x79, 0x71
 12  };
 13  sbit wela = P2^ 7;
 14  sbit dula = P2^ 6;
 15  sbit key1 = P3^ 4;
 16  sbit key2 = P3^ 5;
 17  sbit key3 = P3^ 6;
 18  sbit key4 = P3^ 7;
 19   void init();
 20   void display(uchar bai,uchar shi,uchar ge);
 21   void keyscan();
 22   void delay( uint z) 
 23  {
 24       uint x,y;
 25       for(x = z;x> 0;x--)
 26     {
 27          for(y =  110 ;y >  0;y--);
 28     }
 29  }
 30   void main()
 31  {
 32  key1 =  1;
 33  key2 =  1;
 34  key3 =  1;
 35  key4 =  1;
 36  temp =  0;
 37  init();
 38   while( 1)
 39      {    
 40           display(bai,shi,ge);
 41         keyscan();      // keyscan不要放到if语句中,放到while();
 42          
 43      }
 44  }
 45   void keyscan()
 46  {
 47          if(key1 ==  0) // 按下
 48          {
 49             delay( 5);
 50              if(key1 ==  0)
 51             {
 52                 TR0 =  0;
 53                  while(!key1)   // 释放键盘
 54                      display(bai,shi,ge);  // 已释放就继续读取
 55                  TR0 =  1;
 56             }
 57             
 58         }
 59 
 60          if(key2 ==  0) // 每隔键放入功能不同,因此做法就不同
 61          {
 62             delay( 5);      //
 63               if(key2 ==  0)
 64             {
 65                  while(!key2)
 66                     display(bai,shi,ge);
 67                 TR0 =  0;
 68             }
 69         }
 70 
 71        
 72          if(key3 ==  0)
 73         {
 74             delay( 5);
 75              if(key3 ==  0)
 76             {
 77                  while(!key3)
 78                     display(bai,shi,ge);
 79                 TR0 =  1;
 80             }
 81         }
 82 
 83         
 84          if(key4 ==  0)
 85         {
 86             delay( 5);
 87              if(key4 ==  0)
 88             {
 89                 temp  =  0;
 90                  while(!key4)
 91                 display(bai,shi,ge);
 92             }
 93         }
 94         
 95  }
 96   void init()
 97  {
 98      TMOD =  0x01;
 99     TH0 = ( 65536- 10000)/ 256;
100     TL0 = ( 65536- 10000)% 256;
101     EA =  1;
102     ET0 =  1;
103     TR0 =  1;
104  }
105   void display(uchar bai, uchar shi,uchar ge)
106  {
107     wela =  1;
108     P0 =  0xfe;
109     wela =      0;
110     dula =       1;
111     P0 = tabledu[bai];
112     dula =  0;
113     delay( 3);
114 
115     wela =  1;
116     P0 =  0xfd;
117     wela =      0;
118     dula =      1;
119     P0 = tabledu[shi];
120     dula =  0;
121     delay( 3);
122 
123     wela =  1;
124     P0 =  0xfb;
125     wela =      0;
126     dula =   1;
127     P0 = tabledu[ge];
128     dula =  0;
129     delay( 3);
130 
131  }
132   void timer0 () interrupt  1
133  {
134      TH0 = ( 65536- 10000)/ 256;
135     TL0 = ( 65536- 10000)% 256;
136     temp++;
137      if(temp ==  999)
138         temp =  0;
139     bai = temp/ 100;
140     shi = temp% 100/ 10;
141     ge = temp% 10;

142  } 

转载于:https://www.cnblogs.com/yelcoved/p/3192474.html

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值