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

📄 按键程序设计-处理加速键、一键多功能等情况[c51].txt

📁 基于C51的键盘按键程序设计
💻 TXT
字号:


      按键程序设计-处理加速键、一键多功能等情况[C51]
   


      我的按键程序设计,可以处理加速键、一键多功能等情况 
      1、一般都不在键盘程序中延时,而是通过隔一段时间调用(比如10毫秒)来扫描按键,以尽量释放CPU资源;
      2、所有键盘程序基本上都是一个模式,可以处理加速键、一键多功能等情况;
      3、对外接口只有2个,换用不同硬件的键盘只需把该键盘程序加入工程编译即可,其他不需要作任何改动,非常方便。

      基本上都是一个模式:
      有键?--YES——和上次相同?--No--Keyold=0;退出 
        |      |
        |     YES--Keyold++;
        |      |
        |     Keyold==首键延时KEYDELAY?--No--退出
        |      |
        |     YES--Keyok=1;     //按下不放一定时间发首键,后面发加速键
        |            保存键值到Keydata;(必要时译码)
        |            Keyold=KEYDELAY-KEYLOOP(按住不放的延时);--退出
        |
        No--Keyold==0?--YES--退出
                  |
                 N0--Keyok=1;    //不为0说明按了键再放开,当然作按键有效处理
                       保存键值到Keydata;(必要时译码)
                       Keyold=0;--退出

      所有键盘程序对外接口:
      unsigned char KeyGetcode(void)        //返回按键码
      {
          key_ok=0;
          return(key_data);
      }

      bit KeyTest(void)            //检查有无按键
      {
          KeyScan();            //键扫描
          return(key_ok);
      }
           
      //--------------------------------------------------------------------------//
      //                                源程序大公开                              //
      //                    (c) Copyright 2001-2005 xuwenjun                     
      //
      //                            All Rights Reserved                          
       //
      //                                    V1.00                                
       //
      //--------------------------------------------------------------------------//
      //标 题: P1口行列式键盘程序                                                //
      //文件名: xwj_hlkey.c                                                       
//
      //版 本: V1.00                                                             
//
      //修改人: 徐文军                         E-mail:xuwenjun@21cn.com           //
      //日 期: 05-05-13                                                          
//
      //描 述: P1口行列式键盘程序                                                //
      //声 明:                                                                   
//

      #i nclude <reg52.h>
      #i nclude "xwj_hlkey.h"                //  P1口行列式键盘  //
      //#include "xwj_bp.h"                //峰鸣器

      #define KEYDELAY 25       /*首键延迟次数*/
      #define KEYLOOP 10        /*连续键间隔次数,需小于KEYDELAY*/
      unsigned char key_bak;
      unsigned char key_temp;
      unsigned char key_old;
      unsigned char key_data;
      bit key_ok;

       //  P1口行列式键盘  //
      #define KEYPIN_L  P1        // 定义键扫描列端口为 P1低四位输入 //
      #define KEYPIN_H  P1        // 定义键扫描行端口为 P1高四位扫描输出 //

       //内部私有函数  //
      unsigned char fnKeycode(unsigned char key); //根据键盘映射表输出顺序键值//

       //  P1口行列式键盘  //
      //---------------------------------------------------------------------------//
      void KeyScan(void)                    //键扫描
          {
          unsigned char sccode,recode;
          KEYPIN_L = KEYPIN_L|0x0f;                    //P1低四位为列线输入//
          KEYPIN_H = KEYPIN_H&0x0f;                    //P1高四位为行线发全零扫描码//
          if ((KEYPIN_L&0x0f) !=  0x0f)    //有键按下
              {
              key_temp = 键值;             //键扫描,获得键值
              if (key_temp == key_bak)
                  {
                  key_old++;
                  if (key_old==KEYDELAY)                //连续键,不要则把此if屏蔽
                      {
                      key_ok=1;
                      key_data=fnKeycode(key_temp);    //键解码
                      key_old=KEYDELAY-KEYLOOP;
                  }
              }
              else
                  {
                  key_old=0;
                  key_bak=key_temp;
              }
          }
          else                            //键抬起
              {
              if (key_old)
                  {
                  key_ok=1;
                  key_data=fnKeycode(key_temp);    //键解码
      /*
                  if (key_old==100)      //加上时间,不同时间不同功能,与连续键冲突
                      {
                      bp(1);
                      key_data    +=    0x10;
                      }
                  if (key_old==200)
                      {
                      bp(2);
                      key_data    +=    0x20;
                  }
      */
              }
              key_old=0;
          }
          KEYPIN_H = KEYPIN_H|0xf0;
      }

      //---------------------------------------------------------------------------//

      unsigned char KeyGetcode(void)  //返回按键码
      {
          key_ok=0;
          return(key_data);
      }

      bit KeyTest(void)          //检查有无按键
      {
          KeyScan();            //键扫描
          return(key_ok);
      }

⌨️ 快捷键说明

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