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

📄 keycontrol.lst

📁 51键盘控制
💻 LST
📖 第 1 页 / 共 2 页
字号:
 194   6                               {
 195   7                                 task++;                            //按键状态转入重复的延缓阶段
 196   7                                 keycnt = 0;                        //按键年龄清零
 197   7                               }
 198   6                         }
 199   5                         break;
 200   5                       case 1:                                  //重复的延缓阶段
 201   5                         if(keycnt == MaxRate)                  //按键年龄等于重复的延缓时间
 202   5                         {
 203   6                           enflash = 0;                         //不允许闪烁
 204   6                               
 205   6                               keyprocess = 1;                      //进行键值处理
 206   6                               keycnt = 0;                          //按键年龄清零
 207   6                               task++;                              //按键状态转入重复阶段
 208   6                         }
 209   5                         break;
 210   5                       case 2:                                  //重复阶段
 211   5                         if(keycnt == MinRate)                  //重复时间到
 212   5                         {
 213   6                           enflash = 0;                         //不允许闪烁
 214   6                               keyprocess=1;                        //进行按键值处理
 215   6                               keycnt=0;                            //按键年龄清零
 216   6                         }
 217   5                         break;
 218   5                      }
 219   4                }
 220   3              }
 221   2        }
 222   1      }
 223          /***********************************************************************************
 224          *函数原型:void key_handler()
 225          *功能:按键1处理
 226          *说明:正常工作模式下,按下按键1即进入设定状态,此时第一个数码管闪烁,同时对应LED1的指示灯亮。
 227          *      设定模式下,按下按键1,在LED1和LED4之间循环切换选择被选中的数码管闪烁,相应的指示灯亮
 228          ************************************************************************************/  
 229          void key1_handler()
 230          {
 231   1        if(!keymark)                                     //进入设定状态
 232   1        {
 233   2          led_buf[0] = 0xFE;                             //点亮第一个LED
 234   2              pb=&led_buf[1];                                //pb指向第一个数码管
 235   2              blink=0x08;                                    //第一位数码管闪烁
 236   2              keymark=1;
C51 COMPILER V8.06   KEYCONTROL                                                            11/26/2007 23:22:43 PAGE 5   

 237   2              enflash=1;                                     //允许闪烁
 238   2        }
 239   1        else
 240   1        {
 241   2          pb++;                                           //指向下一个数码管
 242   2              blink>>=1;                                      //该数码管闪烁
 243   2              led_buf[0]=_crol_(led_buf[0],2);                //调整指示灯
 244   2              if(pb>=(uchar*)(led_buf+5))
 245   2              {
 246   3                pb=&led_buf[1];
 247   3                blink=0x08;                                    //第一个数码管闪烁
 248   3              }
 249   2        }
 250   1      }
 251          /***********************************************************************************
 252          *函数原型:void key2_handler()
 253          *功能:按键2处理
 254          *说明:设定状态下,每执行一次选中的数码管的显示数值加1,
 255          *      常按数值以一定速度连续递增,当数值大于9时又回到0;
 256          *      正常状态下,按该键无效
 257          ************************************************************************************/    
 258          void key2_handler()
 259          {
 260   1        if(keymark)
 261   1        {
 262   2          *pb+=1;
 263   2              if(*pb==0x0A)
 264   2                *pb=0x00;
 265   2        }
 266   1      }            
 267          /***********************************************************************************
 268          *函数原型:void key3_handler()
 269          *功能:按键3处理
 270          *说明:设定状态下,每执行一次选中的数码管的显示数值减1,
 271                 常按数值以一定速度连续递减,当数值等于0时又回到9;
 272                     正常状态下,按该键无效
 273          ************************************************************************************/
 274          void key3_handler()
 275          {
 276   1        if(keymark)
 277   1        {
 278   2          if(*pb==0)              *pb=9;
 279   2              else                    *pb-=1;
 280   2        }
 281   1      }
 282          /***********************************************************************************
 283          *函数原型:void key4_handler()
 284          *功能:按键4处理
 285          *说明:该键为确定键,按下后熄灭指示灯,不闪烁,进入工作状态
 286          ************************************************************************************/
 287          void key4_handler()
 288          {
 289   1        blink=0x00;
 290   1        led_buf[0]=0xFF;
 291   1        keymark=0;
 292   1      }
 293          /***********************************************************************************
 294          *函数原型:void keymix_handler()
 295          *功能:复合键(上档键5+功能键8)处理
 296          *说明:执行复位功能。4个数码管全显0,不闪烁。8个指示灯全灭,进入正常工作方式
 297          ************************************************************************************/
 298          void keymix_handler()
C51 COMPILER V8.06   KEYCONTROL                                                            11/26/2007 23:22:43 PAGE 6   

 299          {
 300   1        led_buf[0]=0xFF;
 301   1        led_buf[1]=0x00;
 302   1        led_buf[2]=0x00;
 303   1        led_buf[3]=0x00;
 304   1        led_buf[4]=0x00;
 305   1        keymark=0;
 306   1        blink=0x00;
 307   1      }
 308          /***********************************************************************************
 309          *函数原型:void key_processing()
 310          *功能:键值处理
 311          *说明:根据键值执行相应按键功能
 312          *参数:keyprocess keypre[1] keypre[0]
 313          ************************************************************************************/
 314          void key_processing()
 315          {
 316   1        if(keyprocess)                               //keyprocess为1时,函数实体才被执行
 317   1        {
 318   2          keydone=0;
 319   2              keyprocess=0;
 320   2              switch(keypre[1])
 321   2              {
 322   3                case 0x00:
 323   3                  switch(keypre[0])
 324   3                      {
 325   4                        case 0x01:key1_handler();break;
 326   4                        case 0x02:key2_handler();break;
 327   4                        case 0x03:key3_handler();break;
 328   4                        case 0x04:key4_handler();break;
 329   4                      }
 330   3                      break;
 331   3                case 0x05:
 332   3                  if(keypre[0]==8)
 333   3                         keymix_handler();
 334   3                      break;
 335   3              }
 336   2              keydone = 1;
 337   2        }
 338   1      }
 339          /***********************************************************************************
 340          *函数原型:void timer0() interrupt 1
 341          *功能:定时器0中断服务程序
 342          *说明:键盘和LED一起构成1/6扫描,每6次中断进行一次键盘处理
 343          ************************************************************************************/
 344          void timer0() interrupt 1
 345          {
 346   1        TH0=V_TH0;
 347   1        TL0=V_TL0;                                //时间常数重载
 348   1        if(state<=4)
 349   1        {
 350   2          lflash();
 351   2              display(state);
 352   2              state++;
 353   2        }
 354   1        else
 355   1        {
 356   2          key();
 357   2              state=0;
 358   2        }
 359   1      }
 360          /***********************************************************************************
C51 COMPILER V8.06   KEYCONTROL                                                            11/26/2007 23:22:43 PAGE 7   

 361          *函数原型:void main()
 362          *功能:主程序,执行初始化操作,循环等待按键事件
 363          *说明:无
 364          ************************************************************************************/
 365          void main()
 366          {
 367   1        TMOD=V_TMOD;
 368   1        TH0=V_TH0;
 369   1        TL0=V_TL0;                                //定时器T0初始化
 370   1        TR0=1;
 371   1        ET0=1;
 372   1        EA=1;
 373   1        task=0x00;
 374   1        state=0x00;                               //标量和变量初始化
 375   1        keyprocess=0;
 376   1        keydone=1;
 377   1        ledtime=ledshow;
 378   1        ledtask=0;
 379   1        keymark=0;
 380   1        while(1)
 381   1        {
 382   2          key_processing();
 383   2        }
 384   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    731    ----
   CONSTANT SIZE    =     28    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     15       5
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      6       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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