搜索
bottom↓
回复: 0

有BUG的硬件按键,本以为程序扫描能解决,但还是有问题?

[复制链接]

出0入0汤圆

发表于 2011-11-23 10:03:03 | 显示全部楼层 |阅读模式
有BUG的硬件按键,本以为程序扫描能解决,但还是有问题?


(原文件名:QQ截图20111123095528.png)

这个硬件电路有问题,但是板子已经设计好了,因为考虑到按键不会同时按下,每次只能单个按键按下,我就通过软件来实现,可是问题存在,程序如下,问题是,S1,S2,S3,S4能实现短按长按功能,但是S4,S5,S6,S7,S8,S9,S10,长按功能实现不了,而且有时短按时灵时不灵

#define KEY_LONGDOWN_TIME       330    // 330*6ms=1.98s
#define KEY_SHORTDOWN_TIME      6      // 6*6ms=36ms
#define KEY_LONGDOWN_STATE      2
#define KEY_SHORTDOWN_STATE     1
#define KEY_NODOWN_STATE        0

//S1  = 0b01 1111 1111
//S2  = 0b10 1111 1111
//S3  = 0b11 0111 1111
//S4  = 0b11 1111 1110
//S5  = 0b11 1111 1101
//S6  = 0b11 1110 1111
//S7  = 0b11 1111 1011
//S8  = 0b11 1101 1111
//S9  = 0b11 1111 0111
//S10 = 0b11 1011 1111
typedef enum KEY {
    KEY_NULL      = (u16)0x03FF,
    KEY_VALUE_1   = (u16)0x01B7,  
    KEY_VALUE_2   = (u16)0x02DB,
    KEY_VALUE_3   = (u16)0x036D,
    KEY_VALUE_4   = (u16)0x03FE,
    KEY_VALUE_5   = (u16)0x03FD,
    KEY_VALUE_6   = (u16)0x03EF,
    KEY_VALUE_7   = (u16)0x03FB,
    KEY_VALUE_8   = (u16)0x03DF,
    KEY_VALUE_9   = (u16)0x03F7,       
    KEY_VALUE_10  = (u16)0x03BF,
       
    KEY_POS_SPEED = (u16)0x0401
} KEY_VALUE;

void Key_Scan(void)
{       
    if(gStruKey.KeyStatus == TRUE)
        return;
       
    gStruKey.BackKey = (gStruKey.BackKey<<3)|((PINB&0xE0)>>5);
    switch(gStruKey.ScanCnt)
    {
        case 0:
            cbi(PORTD,PD0);
            sbi(PORTD,PD1);
            gStruKey.ScanCnt = 1;
            return;
        case 1:
            sbi(PORTD,PD0);
            cbi(PORTD,PD1);
            gStruKey.ScanCnt = 2;
            return;
        case 2:
            sbi(PORTD,PD0);
            sbi(PORTD,PD1);
            gStruKey.ScanCnt = 0;
            break;
        default:
            break;
    }
    gStruKey.BackKey <<= 1;
    gStruKey.BackKey |= (PIND&0x04)>>2;
    gStruKey.BackKey &= KEY_NULL;
       
    gStruKey.KeyTempWord[2] = gStruKey.KeyTempWord[1];
    gStruKey.KeyTempWord[1] = gStruKey.KeyTempWord[0];
    gStruKey.KeyTempWord[0] = gStruKey.BackKey;
       
    if((gStruKey.KeyTempWord[2] == gStruKey.KeyTempWord[1])
      &&(gStruKey.KeyTempWord[2] == gStruKey.KeyTempWord[0])
      &&(gStruKey.BackKey != KEY_NULL))
    {
        if(gStruKey.CurrentKey == gStruKey.BackKey)
        {
            gStruKey.KeyPrsTime++;
            if(gStruKey.KeyPrsTime >= KEY_LONGDOWN_TIME)  // 长按
            {
                gStruKey.KeyStatus = TRUE;
                gStruKey.IsRealse = TRUE;
                gStruKey.KeyPrsState = KEY_LONGDOWN_STATE;
                gStruKey.KeyPrsTime = 0;
            }
        }
        else
        {
            gStruKey.KeyPrsTime = 0;  
            gStruKey.CurrentKey = gStruKey.BackKey;
        }
    }
    else
    {
        if((gStruKey.IsRealse==FALSE)&&(gStruKey.KeyPrsTime>=KEY_SHORTDOWN_TIME))  // 短按
        {
            gStruKey.KeyStatus = TRUE;
            gStruKey.IsRealse = TRUE;
            gStruKey.KeyPrsState = KEY_SHORTDOWN_STATE;
        }
        else
        {
            gStruKey.KeyStatus = FALSE;
            gStruKey.IsRealse = FALSE;
            gStruKey.KeyPrsState = KEY_NODOWN_STATE;      
        }
        gStruKey.KeyPrsTime = 0;
    }
}
Key_Scan()放在2MS的定时中断0里面
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-20 02:43

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

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