11651|11

6366

帖子

4929

TA的资源

版主

楼主
 

C51按键程序设计 [复制链接]

按键程序设计,可以处理加速键、一键多功能等情况
后面有P1口行列式键盘程序实例

设计按键程序的思路

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口行列式键盘程序                                                //
//声 明:                                                                   //
//        以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. //
//        如用于商业用途请与作者联系.    E-mail:xuwenjun@21cn.com           //
//        有问题请mailto
xuwenjun@21cn.com   欢迎与我交流!                  //
//--------------------------------------------------------------------------//
//老版本: 无                             老版本文件名:                      //
//创建人: 徐文军                         E-mail:xuwenjun@21cn.com           //
//日 期: 05-05-13                                                          //
//--------------------------------------------------------------------------//
#i nclude
#i nclude "xwj_hlkey.h"                //  P1口行列式键盘  //
//#i nclude "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);

此帖出自51单片机论坛

最新回复

顶  详情 回复 发表于 2014-7-17 21:59
点赞 关注(2)
 

回复
举报

179

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
顶顶,各种顶,超级顶,真是太好了!!!
此帖出自51单片机论坛
 
个人签名张世远
 
 

回复

31

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
好好学习学习  谢谢楼主
此帖出自51单片机论坛
 
 
 

回复

107

帖子

0

TA的资源

五彩晶圆(初级)

4
 
学习中
此帖出自51单片机论坛
 
个人签名本人博客:https://home.eeworld.com.cn/?88198
 
 

回复

33

帖子

0

TA的资源

一粒金砂(初级)

5
 
多看看別人寫的技巧      
感謝
此帖出自51单片机论坛
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(初级)

6
 
,支持楼主
此帖出自51单片机论坛
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(初级)

7
 
顶一把
此帖出自51单片机论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

8
 
正在学习,感谢楼主分享,谢谢
此帖出自51单片机论坛
 
 
 

回复

19

帖子

4

TA的资源

一粒金砂(初级)

9
 
好好好
此帖出自51单片机论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

10
 
要好好结合自己的程序运用,谢谢!
此帖出自51单片机论坛
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(初级)

11
 
顶顶,各种顶,超级顶,真是太好了
此帖出自51单片机论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

12
 
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表