在线情况
楼主
  • 头像
  • 级别
  • 门派
  • 职务总版主
  • 声望+9
  • 财富5
  • 积分3065
  • 经验390701
  • 文章6744
  • 注册2006-03-07
按键程序设计-处理加速键和一键多功能等情况
 [COLOR=blue]作者:徐文军[/COLOR]
我的按键程序设计,可以处理加速键、一键多功能等情况
1、一般都不在键盘程序中延时,而是通过隔一段时间调用(比如10毫秒)来扫描按键,以尽量释放CPU资源;
2、所有键盘程序基本上都是一个模式,可以处理加速键、一键多功能等情况;
3、对外接口只有2个,换用不同硬件的键盘只需把该键盘程序加入工程编译即可,其他不需要作任何改动,非常方便。
[CODE]基本上都是一个模式:
有键?--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);
}
[/CODE]
[ 此帖最后由DC在2012-11-8 0:12:13从 电子通识 转移过来 ]
[COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
在线情况
2
  • 头像
  • 级别
    • 积分30
    • 经验4170
    • 文章139
    • 注册2006-10-19
    收下,慢慢看!!!
    微控网感谢您的参与
    在线情况
    3
    • 头像
    • 级别
      • 积分1
      • 经验323
      • 文章4
      • 注册2007-01-26
      代码简洁,试一下
      微控网感谢您的参与
      在线情况
      4
      • 头像
      • 级别
        • 积分1
        • 经验30
        • 文章2
        • 注册2007-04-06
        找到了与我毕业设计相关的
        未来希望我更加努力
        在线情况
        5
        • 头像
        • 级别
          • 积分1
          • 经验754
          • 文章15
          • 注册2007-05-27
          請問程式中的 key_data=fnKeycode(key_temp);
          fnKeycode副程式在哪找不到??可寄給我原版的代碼嗎??
          tallaha1102@yahoo.com.tw
          微控网感谢您的参与
          在线情况
          6
          • 头像
          • 级别
            • 积分1
            • 经验74
            • 文章1
            • 注册2007-11-10
            很好,给别人一种授人以渔的感觉,我有个问题请问斑竹:在现在的开发中经常有关于遥控器的编程,用单片机接收控制的,比如第一次按下某个键,单片机系统在一定时间内比如4S内收到的话就把它写入93C46,此为学习按键,我们常说的学习遥控器,下次就可以要遥控器来对单片机系统进行控制,第二次如果学习的是遥控器上的同一个按键,则删除这个学习到的键,用的是无线RF通讯方式,RF解码怎么实现?你能给我详细讲讲这些问题吗?谢谢!
            微控网感谢您的参与
            Powered by LeadBBS 9.2 .
            Page created in 0.1875 seconds with 6 queries.