打印

本版4*3键盘扫描问题

[复制链接]
1719|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jwwhy|  楼主 | 2013-6-6 17:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在按键情况较复杂的情况,如有长按键,组合键,连键等一些复杂功能的按键时候,我们跟倾向于用状态机来实现键盘的扫描;
//avr 单片机 中4*3扫描状态机实现
char read_keyboard_FUN2()
{
    static char key_state = 0, key_value, key_line,key_time;
    char key_return = No_key,i;
    switch (key_state)
    {
    case 0: //最初的状态,进行3*4的键盘扫描
        key_line = 0b00001000;
        for (i=1; i<=4; i++) // 扫描键盘
        {
            PORTD = ~key_line; // 输出行线电平
            PORTD = ~key_line; // 必须送2次!!!(注1)
            key_value = Key_mask & PIND; // 读列电平
             if (key_value == Key_mask)
                 key_line <<= 1; // 没有按键,继续扫描
            else
             {
                key_state++; // 有按键,停止扫描
                 break; // 转消抖确认状态
             }
        }
    break;
   case 1: //此状态来判断按键是不是抖动引起的
        if (key_value == (Key_mask & PIND)) // 再次读列电平,
        {
            key_state++; // 转入等待按键释放状态
            key_time=0;
        }
        else
            key_state--; // 两次列电平不同返回状态0,(消抖处理)
    break;
    case 2: // 等待按键释放状态
        PORTD = 0b00000111; // 行线全部输出低电平
        PORTD = 0b00000111; // 重复送一次
        if ( (Key_mask & PIND) == Key_mask)
        {
            key_state=0; // 列线全部为高电平返回状态0
            key_return=  (key_line | key_value);//获得了键值
        }
        else if(++key_time>=100)//如果长时间没有释放
        {
                key_time=0;
                key_state=3;//进入连键状态
                key_return= (key_line | key_value);
         }   
    break;
    case 3://对于连键,每隔50ms就得到一次键值,windows xp 系统就是这样做的
        PORTD = 0b00000111; // 行线全部输出低电平
        PORTD = 0b00000111; // 重复送一次
        if ( (Key_mask & PIND) == Key_mask)
            key_state=0; // 列线全部为高电平返回状态0
        else if(++key_time>=5)     //每隔50MS为一次连击的按键
        {
                key_time=0;
                key_return= (key_line | key_value);
          }   
    break;
    }
    return key_return;
}

问题点: 请问  key_value = Key_mask & PIND; 什么意思?   Key_mask是做什么用的? 如何初始化定义?

相关帖子

沙发
ayb_ice| | 2013-6-7 07:50 | 只看该作者
应该是没有用到那么引脚吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

83

主题

281

帖子

0

粉丝