搜索
bottom↓
回复: 4

按键弹起标志位

[复制链接]

出0入0汤圆

发表于 2008-7-18 23:27:36 | 显示全部楼层 |阅读模式
马老是您好!在4×4矩阵按键程序中。我用定时扫描方式防抖,什么时候清按键弹起标志位最合适?

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

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

出0入21汤圆

发表于 2008-7-19 10:04:40 | 显示全部楼层
有效按键执行完的时候清最好。
给一个4*3的扫描程序你参考,我在项目中用到的。
按键功能可区分长/短键,按键分辨率可以调节

//==========================================================================//
//按键代码读取;KeysetCode的bit7为长键标志,bit6-0为键值.此函数要10ms执行一次        //
//==========================================================================//
void KeysetCodeRead(void)
{
    static unsigned char KeysetScanOutputState, KeysetScanInputState;         //键盘扫描输出(x)/输入(y)状态
        static unsigned char KeysetPressCount;                                                                               //键盘前后两次状态相同计数
        static unsigned char KeysetPressTime=0xFF;                                                                   //按键压时时间
    unsigned char i, StateX, StateY;

    for(i=0;i<4;i++){
            KEYSET_SCAN_PORT |= 0x7F;
                KEYSET_SCAN_PORT &= ~(1<<i);
                asm("nop");
                StateX=0xFF;
                if((KEYSET_SCAN_PIN & 0x70) != 0x70){
                    StateX =i;
                    StateY =KEYSET_SCAN_PIN & 0x70;
                        break;
                }
        }
       
        if((KeysetScanOutputState== StateX) && (KeysetScanInputState== StateY)){
            
                if(KeysetPressTime < KEYSET_PRESS_MAX_TIME){
                    KeysetPressTime++;
                }        
                else if(KeysetPressTime == KEYSET_PRESS_MAX_TIME){
                    KeysetPressTime++;
                        if(!(SysFlag & KEY_LOCK_FLAG) || ((KeysetCode&0x7F) == KEY_LOCK))  BeepTaskMode=2;//键盘锁定后只有开锁键有提示
                }  
       
            if(KeysetPressCount < KEYSET_PRESS_MAX_COUNT){
                    KeysetPressCount++;
                }   
                else if(KeysetPressCount == KEYSET_PRESS_MAX_COUNT){
                    KeysetPressCount++;
                        //采样到有效按键
                        if(StateX==0){                                                                                 //X0
                        if(StateY==KEY_Y0)       i =KEY_1;                                  //Y0
                                else if(StateY==KEY_Y1)  i =KEY_CH1;                               //Y1
                                else if(StateY==KEY_Y2)  i =KEY_LOCK;                              //Y2
                }
                        else if(StateX==1){                                                                      //X1
                        if(StateY==KEY_Y0)       i =KEY_2;               
                                else if(StateY==KEY_Y1)  i =KEY_CH2;
                                else if(StateY==KEY_Y2)  i =KEY_OUT;
                }
                        else if(StateX==2){                                                                      //X2
                            if(StateY==KEY_Y0)       i =KEY_3;  
                                   else if(StateY==KEY_Y1)  i =KEY_PARA;
                                else if(StateY==KEY_Y2)  i =KEY_FINE_V;
                }
                        else if(StateX==3){                                                                      //X3
                            if(StateY==KEY_Y0)       i =KEY_4;
                                else if(StateY==KEY_Y1)  i =KEY_SER;
                                else if(StateY==KEY_Y2)  i =KEY_FINE_I;
                }
                        else{                                                  i=KEY_NO;                                      //无按键                                                  
                        }                                                                  
                   
                        if(i == 0){
                                if(KeysetPressTime >= KEYSET_PRESS_MAX_TIME){
                                    KeysetCode |=0x80;
                                }     
                                else{
                                    KeysetCode &=0x7F;
                                        if(!(SysFlag & KEY_LOCK_FLAG))  BeepTaskMode=1;
                                }
                                KeysetPressTime = KEYSET_PRESS_MAX_TIME+1;
                                TaskFlag |= KEYSET_READ_FLAG;
                        }       
                        else{
                            KeysetPressTime=0;
                                KeysetCode =i;                             //保存键值代码
                        }           
                }
        }
        else{
            if(KeysetPressCount >= KEYSET_PRESS_MAX_COUNT)    KeysetPressCount=0;
                else                                                                                             KeysetPressCount= KEYSET_PRESS_MAX_COUNT+1;
            KeysetScanOutputState =StateX;
                KeysetScanInputState =StateY;
        }
}

出0入0汤圆

 楼主| 发表于 2008-7-19 12:31:11 | 显示全部楼层
谢谢!请问你有没有用汇编写的

出0入0汤圆

发表于 2008-7-20 13:34:52 | 显示全部楼层
明白原理,用什么语言实现还是问题吗?

要真的使用汇编,自己练习编写吧。采用状态机方式的键盘扫描处理,一般人不用汇编的,写起来比较麻烦。而你能找到的汇编代码,基本上不是采用状态机方式的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 06:21

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

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