搜索
bottom↓
回复: 6

呼叫傻孩子,请教在你写的通用按键消抖函数中,在以下函数中是不是不支持组合按键

[复制链接]

出0入0汤圆

发表于 2010-11-9 22:36:38 | 显示全部楼层 |阅读模式
/***********************************************************
*   函数库说明:底层硬件初始化驱动函数库                   *
*   版本:                                                 *
*   作者:                                                 *
*   创建日期:                                             *
* -------------------------------------------------------- *
*  [硬件说明]                                              *
*   处理器:                                               *
*   系统时钟:                                             *
* -------------------------------------------------------- *
*  [支 持 库]                                              *
*   支持库名称:PF_Config.h                                *
*   需要版本:  -----                                      *
*   声明库说明:硬件平台配置声明库                         *
*                                                          *
*   支持库名称:HD_Support.h                               *
*   需要版本:  -----                                      *
*   声明库说明:底层硬件初始化声明库                       *
*                                                          *
*   支持库名称:EX_Support.h                               *
*   需要版本:  -----                                      *
*   声明库说明:底层硬件初始化驱动声明库                   *
* -------------------------------------------------------- *
*  [版本更新]                                              *
*   修改:                                                 *
*   修改日期:                                             *
*   版本:                                                 *
* -------------------------------------------------------- *
*  [版本历史]                                              *
* -------------------------------------------------------- *
*  [使用说明]                                              *
***********************************************************/

/********************
* 头 文 件 配 置 区 *
********************/
# include "PF_Config.h"
# include "EX_Support.h"
# include "LIB_Config.h"

/********************
*   系 统 宏 定 义  *
********************/

/*------------------*
*   常 数 宏 定 义  *
*------------------*/

/*------------------*
*   动 作 宏 定 义  *
*------------------*/

/********************
*  模块结构体定义区 *
********************/

/********************
*   函 数 声 明 区  *
********************/
void Delay_MS(uint16 wTime);
void Insert_Timer0_OVF_ISR_Code(void);
void Driver_INIT(void);
uint8 Key_Press_Scan(void);

/********************
*   模块函数声明区  *
********************/


/********************
*   模块变量声明区  *
********************/
static uint16 s_wSystemDelayTimerCounter = 0;

/********************
*   全局变量声明区  *
********************/
uint16 g_wSystemTimer = 0;
uint16 g_wCommunicationTimer = 0;

/***********************************************************
*   函数说明:软件驱动初始化函数                           *
*   输入:    无                                           *
*   输出:    无                                           *
*   调用函数:无                                           *
***********************************************************/
void Driver_INIT(void)
{
    CMOS_INIT();
    LCDInit();
    LED_Flash_Control_INIT();
}


/***********************************************************
*   函数说明:系统毫秒延时函数                             *
*   输入:    需要延时的时间长度                           *
*   输出:    无                                           *
*   调用函数:无                                           *
***********************************************************/
void Delay_MS(uint16 wTime)
{
    s_wSystemDelayTimerCounter = wTime;
   
    while(s_wSystemDelayTimerCounter);
}

/***********************************************************
*   函数说明:定时器0中断处理程序代码插入函数              *
*   输入:    无                                           *
*   输出:    无                                           *
*   调用函数:无                                           *
***********************************************************/
void Insert_Timer0_OVF_ISR_Code(void)
{
    g_wSystemTimer++;

    if (s_wSystemDelayTimerCounter)
    {
        s_wSystemDelayTimerCounter--;
    }
   
    //USEKEY_INSERT_MS_TIMER_OVF_ISR_CODE
   
    if (g_wCommunicationTimer)
    {
        g_wCommunicationTimer--;
        LED_DATA = LED_FLASH_VERY_FAST;
    }
    else
    {
        LED_DATA = LED_ON;
    }
    /*
    if (!(g_wSystemTimer & 0x0f))
    {
        LCDSP027_refresh_DISP_BUFF();
    }
    */
    //PROC_Serial_Transmitter();
    //Serial_Frame_Process_Refresh();
   
    PROC_LED_FLASH.IfProcAlive = TRUE;
}

/***********************************************************
*   函数说明:键盘扫描函数(不去抖)                       *
*   输入:    无                                           *
*   输出:    无                                           *
*   调用函数:无                                           *
***********************************************************/
uint8 Key_Press_Scan(void)
{
    uint8 cKeyScanValue = KEY_NULL;
   
    //扫描第一行
    SET_KEY_OUT_ALL_PORT_HIGH
    KEY_OUT_Y_P1 = LOW;
    NOP();
    if (!KEY_IN_X_P1)
    {
        cKeyScanValue = 0x00;
    }
    if (!KEY_IN_X_P2)
    {
        cKeyScanValue = 0x01;
    }
    if (!KEY_IN_X_P3)
    {
        cKeyScanValue = 0x02;
    }
    if (!KEY_IN_X_P4)
    {
        cKeyScanValue = 0x03;
    }
   
    //扫描第二行
    SET_KEY_OUT_ALL_PORT_HIGH
    KEY_OUT_Y_P2 = LOW;
    NOP();
    if (!KEY_IN_X_P1)
    {
        cKeyScanValue = 0x04;
    }
    if (!KEY_IN_X_P2)
    {
        cKeyScanValue = 0x05;
    }
    if (!KEY_IN_X_P3)
    {
        cKeyScanValue = 0x06;
    }
    if (!KEY_IN_X_P4)
    {
        cKeyScanValue = 0x07;
    }
   
    //扫描第三行
    SET_KEY_OUT_ALL_PORT_HIGH
    KEY_OUT_Y_P3 = LOW;
    NOP();
    if (!KEY_IN_X_P1)
    {
        cKeyScanValue = 0x08;
    }
    if (!KEY_IN_X_P2)
    {
        cKeyScanValue = 0x09;
    }
    if (!KEY_IN_X_P3)
    {
        cKeyScanValue = 0x0a;
    }
    if (!KEY_IN_X_P4)
    {
        cKeyScanValue = 0x0b;
    }
   
    //扫描第四行
    SET_KEY_OUT_ALL_PORT_HIGH
    KEY_OUT_Y_P4 = LOW;
    NOP();
    if (!KEY_IN_X_P1)
    {
        cKeyScanValue = 0x0c;
    }
    if (!KEY_IN_X_P2)
    {
        cKeyScanValue = 0x0d;
    }
    if (!KEY_IN_X_P3)
    {
        cKeyScanValue = 0x0e;
    }
    if (!KEY_IN_X_P4)
    {
        cKeyScanValue = 0x0f;
    }
   
    //扫描第五行
    SET_KEY_OUT_ALL_PORT_HIGH
    KEY_OUT_Y_P5 = LOW;
    NOP();
    if (!KEY_IN_X_P1)
    {
        cKeyScanValue = 0x10;
    }
    if (!KEY_IN_X_P2)
    {
        cKeyScanValue = 0x11;
    }
    if (!KEY_IN_X_P3)
    {
        cKeyScanValue = 0x12;
    }
    if (!KEY_IN_X_P4)
    {
        cKeyScanValue = 0x13;
    }
   
    return cKeyScanValue;
   
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-10-26 09:08:44 | 显示全部楼层
按键不消抖的啊!

出0入296汤圆

发表于 2012-10-26 09:40:06 | 显示全部楼层
有两种解决方案:
1、在前端扫描函数中,给专门的组合按键独立的按键编码即可解决这个问题
2、使用按键地图技术——就是在内存里面开一个存储区域,区域内每一个bit都对应一个按键的按下或者抬起状态。
   这个方法是用来结合按键队列来用的。

出0入296汤圆

发表于 2012-10-26 09:41:10 | 显示全部楼层
tranquilly86 发表于 2012-10-26 09:08
按键不消抖的啊!

楼主粘贴出来的是扫描前端,前端不负责去抖,去抖实际上被扩展为一个状态机,负责识别长短按键,持续按键这样的情况了,
他没有粘贴出完整的代码。

出0入0汤圆

发表于 2012-10-26 09:56:47 | 显示全部楼层
Gorgon_Meducer 发表于 2012-10-26 09:41
楼主粘贴出来的是扫描前端,前端不负责去抖,去抖实际上被扩展为一个状态机,负责识别长短按键,持续按键 ...

新书什么时候出来

出0入296汤圆

发表于 2012-10-26 10:12:35 | 显示全部楼层
solojimes 发表于 2012-10-26 09:56
新书什么时候出来

永恒的筹备……时间不确定,有问题问就好了……

出0入0汤圆

发表于 2013-4-7 12:00:47 来自手机 | 显示全部楼层
学习一下....
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表