⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key2.lst

📁 key多种按键方式(单机和连击 短击和长击 单击和双击)
💻 LST
字号:
C51 COMPILER V8.08   KEY2                                                                  11/04/2008 09:03:15 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE KEY2
OBJECT MODULE PLACED IN key2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE key2.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //////////////////////////////////////////////////////
   2          
   3          
   4          ///注意分时调度机制
   5          
   6          //矩阵第一列4个键:单机和连击 P3^4接地
   7          //独立键盘第2个键:短击和长击
   8          //独立键盘第3个键:单击和双击
   9          
  10          ///////////////////////////////
  11          
  12          
  13          #include<reg52.h>
  14          
  15          #define uchar unsigned char
  16          #define uint unsigned int
  17          
  18          sbit dula=P2^6;
  19          sbit wela=P2^7;
  20          
  21          uchar flag8ms;
  22          bit a;
  23          uchar keyzhi;
  24          uchar key0;
  25          uchar beifenkey;
  26          uchar shumaguan=0;
  27          uchar yanshi=20;
  28          uchar changjiyanshi=30;
  29          uchar shuangjiyanshi=30;
  30          bit shuangjiflag,shuangjiflag1;
  31          uchar aa=0;
  32          uchar count=0;
  33          
  34          uchar code table[]={       //数码管 
  35          0x3f,0x06,0x5b,0x4f,
  36          0x66,0x6d,0x7d,0x07,
  37          0x7f,0x6f,0x77,0x7c,
  38          0x39,0x5e,0x79,0x71};
  39          
  40          void delay(uint z)
  41          {
  42   1              uint x,y;
  43   1              for(x=z;x>0;x--)
  44   1                      for(y=110;y>0;y--);
  45   1      }
  46          
  47          void fun1();
  48          void fun2();
  49          void funduanji();
  50          void funchangji();
  51          uchar getkey()  ;
  52          void key();
  53          void display(uchar shi,uchar ge);
  54          
  55          
C51 COMPILER V8.08   KEY2                                                                  11/04/2008 09:03:15 PAGE 2   

  56          void init()
  57          {       
  58   1              P1=0xff;
  59   1              P3=0xef;
  60   1              TMOD=0x11;
  61   1              TH0=(65536-8000)/256;
  62   1              TL0=(65536-8000)%256;
  63   1      
  64   1              EA=1;
  65   1              ET0=1;
  66   1              TR1=1;
  67   1              TR0=1;
  68   1      }
  69          
  70          void main()
  71          {
  72   1              init();
  73   1              while(1)
  74   1              {
  75   2                      display(shumaguan/16,shumaguan%16);               //不能写在key()里面 
  76   2                      key();
  77   2                      
  78   2              }
  79   1      }
  80          
  81          uchar getkey()                     //取键值
  82          {
  83   1              key0=P3;
  84   1      
  85   1              switch(~key0)           //取反了
  86   1              {
  87   2                      case 0x11:
  88   2                              keyzhi=1;
  89   2                              break;
  90   2                      case 0x12:
  91   2                              keyzhi=2;
  92   2                              break;
  93   2                      case 0x14:
  94   2                              keyzhi=3;
  95   2                              break;
  96   2                      case 0x18:
  97   2                              keyzhi=4;
  98   2                              break;
  99   2                      case 0x30:
 100   2                              keyzhi=5;
 101   2                              break;
 102   2                      case 0x50:
 103   2                              keyzhi=6;
 104   2                              break;
 105   2                      default:
 106   2                              keyzhi=0;       
 107   2                              break;
 108   2              }
 109   1              return keyzhi ;
 110   1      }
 111          
 112          void key()
 113          {
 114   1              if(flag8ms==1) //分时调度机制
 115   1              {
 116   2                      flag8ms=0;
 117   2                      if(getkey())
C51 COMPILER V8.08   KEY2                                                                  11/04/2008 09:03:15 PAGE 3   

 118   2                      {
 119   3                              if(beifenkey==getkey()) //通过备份值检验来完成消抖
 120   3                              {
 121   4                                       switch(beifenkey)
 122   4                                       {
 123   5                                              case 5:           //短击与长击
 124   5                                                      if(changjiyanshi!=0)    //为了完成长击后使changjiyanshi保持0
 125   5                                                      {
 126   6                                                              changjiyanshi--;
 127   6                                                              if(changjiyanshi==0)
 128   6                                                              {
 129   7                                                              funchangji();
 130   7                                                              }
 131   6                                                      }
 132   5                                                      break;
 133   5                                              case 6:                                    //单击与双击    注意 shuangjiflag shuangjiflag1 aa count 的重置
 134   5                                                      
 135   5                                                      if(shuangjiflag1==1)             //shuangjiflag1第一次按下抬起后标志
 136   5                                                      {
 137   6                                                              shuangjiflag=0;
 138   6                                                              aa=1;
 139   6                                                      }
 140   5                                                      else  shuangjiflag=1;
 141   5                                                                                      
 142   5      
 143   5      
 144   5                                              default:
 145   5                                                      yanshi-- ;              //连击的延时计时 
 146   5                                                      if(!yanshi)
 147   5                                                      {
 148   6                                                              fun1();
 149   6                                                              fun2();
 150   6                                                              yanshi=20;
 151   6                                                      }
 152   5                                                      break;
 153   5                                       }
 154   4                                      
 155   4                              }
 156   3                              else
 157   3                              {                                                               //勿忘更新备份
 158   4                                      beifenkey=getkey();
 159   4                              }
 160   3                                      
 161   3                      }               
 162   2                      else
 163   2                      {
 164   3                              if(beifenkey==5)
 165   3                              {                                                         //确定短击
 166   4                                      beifenkey=0;
 167   4                                      if(1<changjiyanshi<24)
 168   4                                      {       
 169   5                                              changjiyanshi=25;
 170   5                                              funduanji();
 171   5                                      }
 172   4                              }
 173   3                              if(beifenkey==6)
 174   3                              {
 175   4                                      if(shuangjiflag==1)                   //第一次按下后标志
 176   4                                      {
 177   5                                              shuangjiflag=0;
 178   5                                              shuangjiflag1=1;
 179   5                                              aa=0;
C51 COMPILER V8.08   KEY2                                                                  11/04/2008 09:03:15 PAGE 4   

 180   5                                              TH1=(65536-10000)/256;
 181   5                                              TL1=(65536-10000)%256;
 182   5                                              ET1=1;
 183   5                                      }                       
 184   4                              }
 185   3      
 186   3                      }
 187   2      
 188   2              }
 189   1      }
 190          
 191          void funchangji()
 192          {
 193   1              P1=0x00;
 194   1              shumaguan=-1;
 195   1      }
 196          void funduanji()
 197          {
 198   1              P1--;
 199   1              shumaguan++;
 200   1      }
 201          
 202          void fun1()
 203          {
 204   1              switch(beifenkey)
 205   1              {
 206   2                      case 1:
 207   2                              P1--;
 208   2                              break;
 209   2                      case 2:
 210   2                              P1++;
 211   2                              break;
 212   2                      case 3:
 213   2                              P1=~P1;
 214   2                              break;
 215   2                      case 4:
 216   2                              if(P1==0xff)
 217   2                              {
 218   3                                      P1=0;
 219   3                              }
 220   2                              else P1=0xff;
 221   2                              break;
 222   2              }
 223   1      }
 224          
 225          void fun2()
 226          {
 227   1               switch(beifenkey)
 228   1              {
 229   2                      case 1:
 230   2                              shumaguan++;
 231   2                              break;
 232   2                      case 2:
 233   2                              shumaguan--;
 234   2                              break;
 235   2                      case 3:
 236   2                              shumaguan=256-shumaguan;
 237   2                              break;
 238   2                      case 4:
 239   2                              if(shumaguan==0)
 240   2                              {
 241   3                                      shumaguan=0xff;
C51 COMPILER V8.08   KEY2                                                                  11/04/2008 09:03:15 PAGE 5   

 242   3                              }
 243   2                              else shumaguan=0;
 244   2                              break;
 245   2              }
 246   1              
 247   1      }
 248          void display(uchar shi,uchar ge)
 249          {
 250   1              dula=1;
 251   1              P0=table[shi];
 252   1              dula=0;
 253   1              P0=0xff;
 254   1              wela=1;         
 255   1              P0=0xfe;
 256   1              wela=0;
 257   1              delay(1);
 258   1              
 259   1              dula=1;
 260   1              P0=table[ge];
 261   1              dula=0;
 262   1              P0=0xff;
 263   1              wela=1;
 264   1              P0=0xfd;
 265   1              wela=0;
 266   1              delay(1);       
 267   1      }
 268          
 269          void timer0() interrupt 1
 270          {
 271   1              TH0=(65536-8000)/256;
 272   1              TL0=(65536-8000)%256;
 273   1              flag8ms=1;
 274   1      }
 275          void timer1() interrupt 3
 276          {
 277   1              TH1=(65536-10000)/256;
 278   1              TL1=(65536-10000)%256;
 279   1              count++;
 280   1              if(count==80)
 281   1              {
 282   2                      count=0;
 283   2                      shuangjiflag1=0;                //否则不能进行下一次按键动作
 284   2                      ET1=0;
 285   2                      if(aa==1)
 286   2                      {
 287   3                              P1--;
 288   3                      }
 289   2                      else if(aa==0)
 290   2                      {
 291   3                              P1++;
 292   3                      }
 293   2                      aa=0;
 294   2              }
 295   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    485    ----
   CONSTANT SIZE    =     16    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     10    ----
C51 COMPILER V8.08   KEY2                                                                  11/04/2008 09:03:15 PAGE 6   

   IDATA SIZE       =   ----    ----
   BIT SIZE         =      3    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -