搜索
bottom↓
回复: 5

求助:请教个线反转按键扫描 不能检测到组合键的问题

[复制链接]

出0入0汤圆

发表于 2013-9-27 16:40:39 | 显示全部楼层 |阅读模式
扫描程序如下,在定时中断扫键,主循环中查键,但组合键一直只能识别为shift键。不解啊?

/******************************************************************************/
#define _KEY_SCAN_C_
/******************************************************************************/

#include <STC90CxxAD.H>
#include <intrins.H>
#include "DELAY.h"
#include "KEY_SCAN.h"

/***************************************************************
功能:判断是否有按键按下
      keycode=0                无效        表示当前没有键按下
      keycode=1                UP                表示当前UP键按下
      keycode=2                DOWN        表示当前DOWN键按下
      keycode=3                LEFT        表示当前LEFT/shift键按下
      keycode=4                RIGHT        表示当前RIGHT键按下
      keycode=5                OK                表示当前ENTER键按下
      keycode=6                BACK        表示当前BACK键按下
      keycode=7                ZHISHU        表示当前ZHISHU键按下

      keycode=8                BLINC        表示当前UP键与shift键按下
      keycode=9                BLDEC        表示当前DOWN键与shift键按下
      keycode=10        CLRDEP        表示当前取消键与shift键按下
      keycode=11        CPLDIR        表示当前换向键与shift键按下

行列键盘 分布图
K06----[ -- ]----[ -- ]----[SET ]
         |         |         |
K05----[BACK]----[ OK ]----[RIGH]
         |         |         |
K04----[LEFT]----[DOWN]----[ UP ]
         |         |         |
        K03       K02       K01
***************************************************************/

void Beep(void)
{
        Buzz_cnt =0;
        Buzz_flag =1;
        BUZZ =1;
}

unsigned char GetKey(void)
/************************************
函数功能:键盘消抖        连续按键120MS为键有效
输入参数:无
输出参数:unsigned char keycode;
全局变量:
************************************/
{
        if (KeyCount >30)
        {
                Beep();
                KeyCount =0;
                Key_Press_flag =1;

                switch (KeyCode)
                {
                        case 0x1B:
                        return KEY_UP;

                        case 0x2B:
                        return KEY_DOWN;

                        case 0x33:
                        return KEY_LEFT;

                        case 0x1D:
                        return KEY_RIGHT;

                        case 0x2D:
                        return KEY_OK;

                        case 0x35:
                        return KEY_BACK;

                        case 0x1E:
                        return KEY_ZHISHU;

                        case 0x15:
                        return KEY_CPLDIR;

                        case 0x19:
                        return KEY_CLRDEP;

                        default:
                        Key_Press_flag =0;
                        return NO_KEY;
                }
        }
        else
        {
                return NO_KEY;
        }
}

void Scan_Key(void)
/************************************
函数功能:线反转行列扫描
输入参数:先行清零列扫描; 再列清零行扫描;
全局变量:KeyCode  KeyCount
************************************/
{
        unsigned char Scan_Code,Col_Scan_Code,Row_Scan_Code;       

// 置键 行清零列扫描                        K01=K02=K03=0; K04=K05=K06=1
        KEYBUS &=0xF8;       
        _nop_();        _nop_();
        Col_Scan_Code =KEYBUS &0x38;
        KEYBUS |=0x3F;
        if (0x38 ==Col_Scan_Code)
        {
                Scan_Code =NO_KEY;
                Key_Press_flag =0;
                return;
        }

// 置键 列清零行扫描                        K01=K02=K03=1; K04=K05=K06=0
        KEYBUS &=0xC7;
        _nop_();        _nop_();
        Row_Scan_Code =KEYBUS &0x07;
        KEYBUS |=0x3F;
        if (0x07 ==Row_Scan_Code)
        {
                Scan_Code =NO_KEY;
                Key_Press_flag =0;
                return;
        }

        if (!Key_Press_flag)
        {
                Scan_Code =(Col_Scan_Code | Row_Scan_Code);

                if (KeyCode ==Scan_Code)
                {
                        if (255!=KeyCount)
                        {
                                KeyCount++;
                        }
                }
                else
                {
                        KeyCode =Scan_Code;
                        KeyCount=1;
                }
        }
}

中断调用
void INTER_Timer0(void) interrupt 1
// T0定时4毫秒@11.0592MHz时钟12T模式
{
        TH0 =0xF1;
        TL0 =0x9A;

        Scan_Key();                                                //每4ms扫描按键

        T0_cnt ++;

        if (125==T0_cnt)
        {
                flash_flag =~flash_flag;        //闪烁频率 0.5秒
        }

        if (1==Buzz_flag)
        {
                Buzz_cnt ++;
                if (15==Buzz_cnt)
                {
                        BUZZ =0;
                        Buzz_flag =0;
                        Buzz_cnt =0;                        //蜂鸣60ms
                }
        }
}

大致就这麽多相关部分了,请大家帮忙看看

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

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

出0入0汤圆

发表于 2013-9-27 16:47:44 | 显示全部楼层
输出口一般设置为开漏极输出.
若不能设置,那只能有一个口为输出,其它口设置为输入.然后逐行扫描

出0入0汤圆

 楼主| 发表于 2013-9-27 16:56:38 | 显示全部楼层
你是说我的硬件上组合键的时候,一个输出口不能驱动2个端口被检测到低电平么?
硬件用的是P1口的P1^0到P1^5, 但示波器上是能检测到电平拉低

出0入0汤圆

 楼主| 发表于 2013-9-29 08:53:03 | 显示全部楼层
就这么的沉了啊~~
帮忙看看吧~~
谢谢了~

出130入129汤圆

发表于 2013-9-29 09:47:54 来自手机 | 显示全部楼层
有些组合能,有些不能,得看两个键所在行列位置

出0入0汤圆

 楼主| 发表于 2013-9-29 12:03:47 | 显示全部楼层
68336016 发表于 2013-9-29 09:47
有些组合能,有些不能,得看两个键所在行列位置

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

本版积分规则

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

GMT+8, 2024-7-23 14:27

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

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