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

📄 key_service.lst

📁 液晶菜单 51串行实现 调试已通过
💻 LST
字号:
C51 COMPILER V8.16   KEY_SERVICE                                                           02/18/2009 16:41:08 PAGE 1   


C51 COMPILER V8.16, COMPILATION OF MODULE KEY_SERVICE
OBJECT MODULE PLACED IN ..\Output\Key_Service.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\UserCode\Key_Service.c BROWSE INCDIR(..\LCD_Driver;..\MzMenu_GUI;..\User
                    -Code) DEBUG OBJECTEXTEND PRINT(.\Key_Service.lst) OBJECT(..\Output\Key_Service.obj)

line level    source

   1          //========================================================================
   2          // 文件名:  Key_Service.c
   3          // 作  者: xinqiang Zhang(小丑)  (email: xinqiang@Mzdesign.com.cn)
   4          // 日  期: 2007/06/29
   5          // 描  述: 键盘服务程序,简单使用版
   6          //
   7          // 参  考: 无
   8          // 版  本:
   9          //      2007/06/29      First version    Mz Design
  10          //========================================================================
  11          
  12          #include "REG52.H"                       
  13          
  14          unsigned int Key_Sample1=0;                                     //当前对按键采样的值
  15          unsigned int Key_Sample2=0;                                     //上一次对按键采样的值
  16          unsigned int Key_Scan_old=0;                            //上一次有效的键值状态
  17                                                                                                  //(必需连续两次的采样值相同时才能载入该变量中)
  18          unsigned char Key_Down_flag=0;                          //键盘按下标识,注意是经过消抖后确认的按下标识
  19          unsigned char Key_Down_Counter=0;                       //用于消抖
  20          
  21          unsigned int Key_Value=0;                                       //最终经过确认的键值
  22          
  23          unsigned int Key_Data=0;
  24          unsigned char Key_flag=0;
  25          
  26          unsigned char Key_flag_long=0;                          //长时按键标识~
  27          unsigned int Key_Down_Counter_l=0;                      //长时按键计数器
  28          
  29          unsigned char Key_Release_flag=0;                       //在有些按键中防止长按键时重复响应用的
  30          
  31          
  32          void Key_Initial(void)
  33          {
  34   1              P0 = 0x0f;
  35   1      }
  36          
  37          void KeyScan_Service(void)
  38          {
  39   1              unsigned int uiTemp;
  40   1      //      Key_Sample1 = (IOPIN0&0xfef00000)>>20;//
  41   1              uiTemp = P0&0x0f;
  42   1              Key_Sample1 = uiTemp;
  43   1              Key_Sample1 ^=0x0f;
  44   1              if(Key_Sample1==Key_Sample2)
  45   1              {                                       //连续两次扫描的键值相同,有效,则处理
  46   2                      if(Key_Sample1)                         //是否有键按下?如有则处理
  47   2                      {
  48   3                              if(Key_Down_flag==0)    //如果键值还没有被消抖确认,则确认是否与之前的键值一至
  49   3                              {
  50   4                                      if(Key_Sample1==Key_Scan_old)
  51   4                                      {
  52   5                                              Key_Down_Counter++;
  53   5                                              if(Key_Down_Counter>=100) 
  54   5                                              {
C51 COMPILER V8.16   KEY_SERVICE                                                           02/18/2009 16:41:08 PAGE 2   

  55   6                                                      Key_Down_Counter = 0;
  56   6                                                      Key_Down_Counter_l=20;
  57   6                                                      Key_Down_flag = 1;
  58   6                                                      Key_Value = Key_Sample1;        //将确认的键值载入缓存器中,供键抬起后处理用
  59   6                                              }
  60   5                                      }
  61   4                                      else
  62   4                                      {
  63   5                                              Key_Down_Counter = 0;           //重新计数,即重新消抖
  64   5                                              Key_flag_long=0;
  65   5                                      //      Key_Down_Counter_l=0;
  66   5                                      }
  67   4                              }
  68   3                              else                                    //如已经过消抖,则判断是否有组合键按下?如无则直接退出处理
  69   3                              {
  70   4                                      Key_Down_Counter_l++;//
  71   4                                      if(Key_Down_Counter_l>=4000) 
  72   4                                      {
  73   5                                              Key_flag_long=1;
  74   5                                              Key_Down_Counter_l=150;
  75   5                                      }
  76   4                              }
  77   3                      }
  78   2                      else                                            //否则就处理之前是否有键是经过确认的
  79   2                      {                                                       //如果已经有键按下,并确认消抖后则处理键值
  80   3                              if(Key_Down_flag==1)
  81   3                              {
  82   4                                      Key_Down_flag = 0;//
  83   4                                      Key_Data = Key_Value;
  84   4                                      Key_flag = 1;
  85   4                                      Key_Down_Counter = 0;
  86   4                              //      Key_Down_Counter_l=0;
  87   4                                      Key_flag_long=0;
  88   4                              }
  89   3                              if(Key_Release_flag==1)
  90   3                              {
  91   4                                      Key_Release_flag=0;
  92   4                                      Key_flag = 0;
  93   4                              }
  94   3                      }
  95   2                      Key_Scan_old = Key_Sample1;                     //保存这次的有效键值
  96   2              }
  97   1              Key_Sample2 = Key_Sample1;                              //保存当次的值 
  98   1      }
  99          
 100          unsigned char Key_Get(void)
 101          {
 102   1              unsigned char KK=0;
 103   1              if(Key_Release_flag==1) return KK;
 104   1              if(Key_flag_long==1)
 105   1              {
 106   2                      Key_flag_long=0;
 107   2                      switch(Key_Value)
 108   2                      {
 109   3                              case 0x01: KK = 5;Key_Release_flag = 1;break;//
 110   3                              case 0x02: KK = 6;Key_Release_flag = 1;break;//
 111   3                              default : KK=0;
 112   3                      }
 113   2                      if(KK!=0)
 114   2                      {
 115   3                              Key_flag=0;
 116   3                      //      Key_Down_Counter = 0;
C51 COMPILER V8.16   KEY_SERVICE                                                           02/18/2009 16:41:08 PAGE 3   

 117   3                      //      Key_Down_flag = 0;
 118   3                              return KK;
 119   3                      }
 120   2              }
 121   1              if(Key_flag!=0)
 122   1              {
 123   2                      Key_flag=0;
 124   2                      Key_Down_Counter = 0;
 125   2                      Key_Down_flag = 0;
 126   2                      switch(Key_Data)
 127   2                      {
 128   3                              case 0x01: KK = 1;break;
 129   3                              case 0x02: KK = 2;break;
 130   3                              case 0x04: KK = 3;break;
 131   3                              case 0x08: KK = 4;break;
 132   3                      //      case 0x20: KK = 5;break;
 133   3                      //      case 0x40: KK = 6;break;
 134   3                              default : break;
 135   3                      //      case 0x0002: KK = 2;break;
 136   3                      }
 137   2                      return KK;
 138   2              }
 139   1              else return 0;
 140   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    252    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     17    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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