单片机按键处理程序(长按 短按 松手检测)

发布者:古宝奇缘最新更新时间:2015-03-11 来源: 51hei关键字:单片机  按键处理程序  松手检测 手机看文章 扫描二维码
随时随地手机看文章
一个很精妙的单键程序:

 bit flag=0; 定义标志
以下是键盘处理程序:
void scankey()   //扫描按键
{

if(p10= =0&&flag= =0)  //p10口按键及处理程序,其中flag如果为1就不用再扫描    就是这里,没有消抖动了~是怎么回事咧
{
delay(10);
flag=1;
delay(5);
}
if(p10= =1&&flag= =1)  //如果p10为1,flag为1说明已经被按下并抬起
{
TR0=!TR0;    //松开时相应
flag=0;    //标志清零,为下次按键做准备(其实为一次处理)
}
}

以下是另一个一个检测的主要部分:

#include
#include
#define key_port P0    //键盘接口定义
sbit key_port_0=key_port^0;
sbit key_port_1=key_port^1;
sbit key_port_2=key_port^2;
sbit key_port_3=key_port^3;


if(Key_down==PRESSED)
{
     while(Key_down==PRESSED)          //计数,用来判断是长按还是短按
     {
  
      if( (counter++) > Long_cnt) //counter>65534:长按,
        {
     Key_Code=KEY_FP_DOWN;             //KEY1长按时返回的键值
    // counter=0;
           return;
        }
     }
     if(counter<=Long_cnt && counter>Short_cnt)   //counter<=65534:短按,counter>20:消抖动
     {    
     
      Key_Code=KEY_FP_DOWN;             //KEY1短按时返回的键值
   // counter=0;
           return;        
     } 
}
 

以下程序可以作为一个单独的 key.c 文件包含在项目里面:

#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);
bit flag=0; 定义标志
以下是键盘处理程序:
void scankey()   //扫描按键
{
if(p10= =0&&flag= =0)  //p10口按键及处理程序,其中flag如果为1就不用再扫描    就是这里,没有消抖动了~是怎么回事咧
{
delay(10);
flag=1;
delay(5);
}
if(p10= =1&&flag= =1)  //如果p10为1,flag为1说明已经被按下并抬起
{
TR0=!TR0;    //松开时相应
flag=0;    //标志清零,为下次按键做准备(其实为一次处理)
}
}

关键字:单片机  按键处理程序  松手检测 引用地址:单片机按键处理程序(长按 短按 松手检测)

上一篇:STC12C5A60S2各模块的应用分享大家
下一篇:基于单片机的频率测量计设计

推荐阅读最新更新时间:2024-03-16 13:54

Windows下PIC8位单片机程序汇编和固化(一)
单片机本身没有开发编程能力,所以要把单片机变成一种应用产品,必须借助于硬件开发和软件开发两种工具。在进行软件开发时,首先利用相关的编辑软件,按照相应的格式建立PIC单片机的源程序(助记符程序),然后对源程序进行汇编。在完成汇编之后,用户可以利用模拟调试软件(价位低)或者硬件在线仿真器(价位高)对其目标程序(机器代码)进行运行调试,以发现其错误并修改之。在经过调试、修改、再汇编之后,即可将修改后的目标程序用硬件(工具)编程器将目标代码烧写到用户的PIC芯片中。最后将烧写后(即固化)的芯片插入到用户板(实验板)脱机运行,如还有问题(通常是多条程序的条件下),就检查硬件电路和软件的设计,找出错误并修改、再汇编、调试直到脱机运行正常为止。
[单片机]
Windows下PIC8位<font color='red'>单片机</font>源<font color='red'>程序</font>汇编和固化(一)
基于uC/OS-II和MSP430单片机的RTOS的技术分析
  单片机作为嵌入式信息产品的一个重要应用方面,其使用、设计面临着全新的挑战。一方面,人们对嵌入式产品的要求越来越高,稳定可靠、功能丰富、物美价廉的信息产品将成为人们的首选。另一方面,随着微电子工艺水平的发展,单片机处理器的能力不断提高,从最初的8位单片机到16位,进而32位单片机,功能越来越强大,执行速度越来越快,集成度、精确度也越来越高,应用领域进一步拓宽。可以说,单片机芯片的性能已经能够满足现代人们对嵌入式信息产品的更高要求。为了能将二者有效地结合起来,嵌入式RTOS的软件设计方法也取代了以前的前后台(超循环)设计方法,越来越受到重视和应用。   正如分时操作系统中Linux的出现打破了Windows一统天下的局面一样,
[单片机]
基于uC/OS-II和MSP430<font color='red'>单片机</font>的RTOS的技术分析
一种智能人体心率检测装置的设计
0 引 言   心率是人体中一个非常重要的生命信息,而传统的脉诊由于其定性化和主观性影响了心率测试的精度,成为中医脉诊应用、发展和交流中的制约因素。为了提高对此类生物医学信号的测试精度,必须结合现代科学技术。目前用于检测心率的仪器很多,常见的有基于压力传感器、光电传感器、电容传感器和电声传感器等类型的测试装置,但是对脉搏测试部位的选择没有太大区别,对于能在指端进行脉搏精确测量的仪器还是比较少。这里介绍的智能人体心率检测装置可以实现人体指端的无创测量,测试过程简单,能精确测量出心跳次数,实现数据显示和上、下限报警功能。 1 装置组成及工作原理   系统组成如图1所示。此设计以单片机AT89C2051为核心,由光电传感器采集脉搏
[医疗电子]
一种智能人体心率<font color='red'>检测</font>装置的设计
自制51单片机常用头文件(DS18B20)
/*-------------------------------------------------------------------------- TEMPERATURE.H The user function is C51. Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun All rights reserved. --------------------------------------------------------------------------*/ #ifndef __TEMPERATURE_H__ #define __TEMPERATURE
[单片机]
单片机汇编语言 如何实现点亮熄灭二极管
main: mov P0, #10011000B //P0口输出高电平 lcall Delay //延时 mov P0, #11111111B lcall Delay ljmp main //长转移到起始地址main标号处 Delay: mov R7, #250 D1: mov R6, #250 D2: djnz R6, D2 //R6寄存器不为0 则转移到D2标号处 djnz R7, D1 //R7寄存器不为0 则转移到D1标号处 ret end 用汇编语言写了这个程序之后,感觉就是 毫无所获的快感,因为感觉用汇编语言编写的速度太慢了,效率太低了。 于是就想: 是否 要开始学习汇编语言编写单片机程序呢
[单片机]
基于MC32P21单片机的移动电源设计
移动电源是一种集供电和充电功能于一体的便携式充电器,可以给手机等数码设备随时随地充电或待机供电。一般由锂电芯或者干电池作为储电单元。区别于产品内部配置的电池,也叫外挂电池。一般配备多种电源转接头, 通常具有大容量、多用途、体积小、寿命长和安全可靠等特点,是可随时随地为智能手机、平板电脑、数码相机、MP3、MP4等多种数码产品供电或待机充电的功能产品。 移动电源可以通过USB电缆线使用在任何符合USB国际标准的设备,其具有短路、过充过放、恒流恒压等保护措施,还有高性能电源管理技术。 移动电源方案,根据是否可以编程,分为硬件移动电源和软件移动电源两种技术路线。硬件移动电源方案主要存在的问题是:1.发热严重,采用非同步整流模式,温度高后
[电源管理]
基于MC32P21<font color='red'>单片机</font>的移动电源设计
基于78K0/LE3MCU的血糖监视仪应用方案
  概要   血糖监视仪之前一直在欧美等地广泛流行,不过随着包括日本在内的亚洲诸国因饮食欧美化,为了预防糖尿病,对它的需求逐渐增强。因为一天要测量多次,便于携带的小型装置及电池的高寿命化成为所需。另外,糖尿病患者一般视力不好,必须要用大型的液晶显示屏来显示测量值。而测出来的数据需要和医院进行信息共享,因此需要能够和电脑进行通信的USB或Bluetooth功能。   测量时,根据血糖值,微小的电流从检测试纸处被输出,由运算放大器得出电流转换成电压的值,并通过高精度A/D转换器读取出来。为了测量血糖值, A/D转换器需要具有12位以上的分辨率。另外,为了实现装置的小型化、电池的高寿命化,必须具有低功耗。   瑞萨的78K0/LE
[单片机]
基于78K0/LE3<font color='red'>MCU</font>的血糖监视仪应用方案
单片机测控系统中的抗干扰技术
摘 要:本文针对单片机测控系统中的干扰因素,并结合实际应用系统给出了采取软、硬件两种方法抗干扰的具体措施。 关键词:单片机测控系统抗干扰 概述 干扰是造成单片机测控系统故障的主要原因之一。干扰对系统的影响轻则影响测量与控制精度,重则使工作系统完全失常。要消除干扰必须抓住形成干扰的三要素,即:干扰源、耦合通道和接收设备。 1干扰因素 在单片机测控系统中,主要存在空间辐射干扰、信号通道干扰、电源干扰和数字电路引起的干扰。 抗干扰就是针对干扰的产生性质、传播途径、侵入的位置和侵入的形式,采取适当的方法消除干扰源,抑制耦合通道,减弱电路对噪声干扰的敏感性,通常需要采取“综合治理”的措施。
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved