搜索
bottom↓
回复: 233

4*4按键,状态机思想:定时扫描+多键组合+连_发功能(具有实际应用意义)

  [复制链接]

出0入0汤圆

发表于 2008-6-5 22:04:38 | 显示全部楼层
学习了

出0入0汤圆

发表于 2008-6-5 23:19:48 | 显示全部楼层
1、该段程序是4*4键盘扫描程序, 功能比较全, 根据实际情况可在次基础上进行修改;
2、已调试通过,但没有优化;

/*********************************************************************
文件:scankey.c
用途:通用4*4按键接口驱动程序
注意:
创建:2008.5.15
修改:2008.5.15
设计:raosibin
版本:ver1.3
功能说明:每隔10MS调用一次 ,实现了组合按键功能;连_发功能     
**********************************************************************/
#include "..\config.h"

/*********************************************************************
       COL0 COL1 COL2 COL3
* ROW4   0    1    2    3
* ROW5   4    5    6    7
* ROW6   8    9    A    B
* ROW7   C    D    E    F
*  
* 普通按键:
* 2~E:数字按键
*  
* 连_发按键:
* 0:
* 1:
*   
* 组合按键
* F  : 引导键
* F+0:
* F+1:
* 状态机思路
* F为组合引导键
* 每10MS扫描一次键盘   

* 状态0:检测是否有键按下;   
* 状态1:消抖处理   
* 状态2:确认按键,同状态1比较,除F引导键外相同则返回键值,
*       F引导键未按下转状态3;F引导键按下转状态5;   
* 状态3:计数1,(按3S,连_发判断);   
* 状态4:计数2,连_发功能  

* 状态5:500MS内检测是否有F引导键+其他键按下;有转状态6,没有转状态8  
* 状态6:消抖处理  
* 状态7:同状态6比较,确认组合按键,返回组合键值,转状态3  
* 状态8:消抖处理  
* 状态9:先导键为单按键,返键值,转状态3.  
**********************************************************************/
//按键初始化
void key_board_int1( void )
{
  KEY_DDR_ROW |= KEY_ROW_ALL;                                                              //行输出,
  KEY_PORT_ROW &= ~ KEY_ROW_ALL;
  KEY_DDR_COL &= ~ KEY_COL_ALL;                                                              //列输入,并使能内部上拉
  KEY_PORT_COL |= KEY_COL_ALL;
}

void key_board_int2( void )                                                                                 //翻转初始化
{
  KEY_DDR_ROW &= ~ KEY_ROW_ALL;                                                              //行输入,并使能内部上拉
  KEY_PORT_ROW |= KEY_ROW_ALL;
  KEY_DDR_COL |= KEY_COL_ALL;                                                              //列输出;
  KEY_PORT_COL &= ~ KEY_COL_ALL;
}

unsigned char key_board_scan( void )
{
  unsigned key_value_buf;
  key_board_int1();
  KEY_PORT_ROW &= ~ KEY_ROW_ALL;                                                        // 必须送2次!!!
  key_value_buf = ( ~KEY_ROW_ALL ) & KEY_PIN_COL;                                           // 读列电平

  key_board_int2();                                                                          // 翻转扫描
  KEY_PORT_COL &= ~ KEY_COL_ALL;
  key_value_buf |= ( ~KEY_COL_ALL ) & KEY_PIN_ROW;                                              // 读行电平,并同翻转前的结果或
  return key_value_buf;
}

uchar read_keypad( void )
{//10ms 读一次
  static uchar preKey = 0, curKey, keytimes = 0;
  uchar keyCode = noKey;

  curKey = key_board_scan();

  if ( curKey != noKey )
    { //可能有键按下

      if ( preKey == curKey )
        { //同一按键消抖
          keytimes++;

          if ( ( keytimes % 5 ) == 0 )
            { //50ms 短按或加速键 时间自已把握
             // keyCode = shortpush|preKey;
            }

        /*  if ( keytimes > 100 )
            {
              keytimes = ( 101 ); //锁定 长按
             // keyCode = longpush|preKey;
             //keyCode =
            }*/
            
            return keycode;
        }


      else if ( preKey != curKey )
        { //不同按键按下
          {
            keytimes = 0;
            preKey = curKey;
            
          }
        }

    }

       else
       { //键已释放,或无键按下
        keytimes = 0;
        return keyCode;
       }


}


/*
实现短按键 长按键或加速键
能不能实现长按与加速功能呢
*/

出0入0汤圆

发表于 2008-6-5 23:21:54 | 显示全部楼层
键值获得与处理就不写了,以上按键可以实现加速键功能,不知道能不能一起实现长按功能,希各高手指点
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-3 05:07

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

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