打印

按键检测,快疯了,大家帮帮忙!

[复制链接]
1678|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#include "global.h"
#include "key.h"
#include "menu.h"

char key;
unsigned char nkey;
char keycol;
char keyrow;
char keytimer;
char flagkeydown;
char flagkeyvalid;
char flagkeyunprocessed;                                                        //当前按键有Flag
unsigned char keyline[] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF};
#define keyscanline P2OUT
#define keyNotPressed() (P2IN & 0xe0) == 0xE0
#define getkeycol() (P2IN & 0xe0)

void InitKey(){                                                                 //按键处理初期化
        P2SEL = 0x00;
        P2DIR = 0x1F;
        P2OUT = 0xFF;
        P2REN = 0x00;                                                                //拉功能禁止
        P2DS = 0x00;
        P2IE = 0x00;                                                                //中断禁止
        keytimer = 0;
}

unsigned char keyscan(){
        unsigned char keytemp = 0xFF;
        if(keyNotPressed()){
                keytimer ++;
                if(keytimer > 4)
                        keytimer = 0;
                keyscanline = keyline[keytimer];
                return 0xFF;
        }
       
        switch(getkeycol()){
                case 0x60:
                        keytemp = 2;
                        break;
                case 0xA0:
                        keytemp = 1;
                        break;
                case 0xC0:
                        keytemp = 0;
                        break;
        }
        keytemp += keytimer * 3;
        switch(keytemp){
                case 0:
                        return KEY_1;                                           //
                case 1:
                        return KEY_4;                                           //
                case 2:
                        return KEY_7;                                           //
                case 3:
                        return KEY_2;                                           //
                case 4:
                        return KEY_5;                                           //
                case 5:
                        return KEY_8;                                           //
                case 6:
                        return KEY_3;                                           //
                case 7:
                        return KEY_6;                                           //
                case 8:
                        return KEY_9;                                           //
                case 9:
                        return KEY_UP;                                          //
                case 10:
                        return KEY_0;                                           //
                case 11:
                        return KEY_DOWN;                                        //
                case 12:
                        return KEY_BACK;                                        //
                case 13:
                        return KEY_CLEAR;                                       //
                case 14:
                        return KEY_OK;                                          //
                default:
                        break;               
        }
        return 0xFF;              //return 0xFF有什么用?
}

void Get_key(){                                                                 //获得键值
        unsigned char keytemp;
       
        keytemp = keyscan();
        if(keytemp >= 0x0F){                                                    //如果当前键值在0x0F以上
                nkey = 0xFF;                                                    //前回键值
                flagkeydown = 0;
                flagkeyvalid = 0;
                flagkeyunprocessed = 0;                                         //当前按键有Flag CLR
                return;
        }

        if(keytemp != nkey){
                flagkeydown = 1;
                nkey = keytemp;
                return;
        }

        if(flagkeyvalid == 0){
                key = nkey;
                if(key != KEY_BACK){
                        back_menuflag = 0;
                }
               
                flagkeyvalid = 1;
                flagkeyunprocessed = 1;                                                //当前按键有Flag SET                       
        }
}

连接图是这样的。完全看不懂程序到底什么意思。这应该属于独立按键吧,是用来模拟成3*4的矩形按键码?

相关帖子

沙发
ningling_21| | 2016-9-29 15:58 | 只看该作者
//return 0xFF有什么用?

表示没有按键按下

使用特权

评论回复
板凳
NE5532| | 2016-9-30 08:44 | 只看该作者
看了本版精华《程序调试黑宝书》,经医治无效,再疯也不迟。

使用特权

评论回复
地板
416356084| | 2016-9-30 09:37 | 只看该作者
自己都说了3X4,还独立按键,也是没有谁了

使用特权

评论回复
5
dirtwillfly| | 2016-9-30 10:21 | 只看该作者
416356084 发表于 2016-9-30 09:37
自己都说了3X4,还独立按键,也是没有谁了

不知道从哪里copy来的程序吧

使用特权

评论回复
6
李小川希比|  楼主 | 2016-9-30 11:20 | 只看该作者
dirtwillfly 发表于 2016-9-30 10:21
不知道从哪里copy来的程序吧

嗯,公司上个项目的程序,才到公司不久,表示看不懂!

使用特权

评论回复
7
长的帅怪我落| | 2016-9-30 11:30 | 只看该作者
然后你想干嘛呢?

使用特权

评论回复
8
416356084| | 2016-9-30 11:39 | 只看该作者
李小川希比 发表于 2016-9-30 11:20
嗯,公司上个项目的程序,才到公司不久,表示看不懂!

你现在想干什么?

使用特权

评论回复
9
teddeng| | 2016-9-30 14:18 | 只看该作者
unsigned char keyline[] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF};
知道这句什么意思,其他都简单了。

使用特权

评论回复
10
songchenping| | 2016-9-30 14:27 | 只看该作者
楼主还不如老老实实自己一句一句写呢。不会出错的。还有就是最好能自己画个流程图。

使用特权

评论回复
11
李小川希比|  楼主 | 2016-9-30 14:51 | 只看该作者
416356084 发表于 2016-9-30 11:39
你现在想干什么?

公司设备要改进,需要修改部分程序

使用特权

评论回复
12
416356084| | 2016-9-30 15:28 | 只看该作者
李小川希比 发表于 2016-9-30 14:51
公司设备要改进,需要修改部分程序

那跟按键有什么关系???

使用特权

评论回复
13
jyrpxj| | 2016-10-7 12:18 | 只看该作者
一个按键扫描的程序也看不懂,也是没谁了

使用特权

评论回复
14
李小川希比|  楼主 | 2016-10-8 10:45 | 只看该作者
jyrpxj 发表于 2016-10-7 12:18
一个按键扫描的程序也看不懂,也是没谁了

还望兄弟指教

使用特权

评论回复
15
李小川希比|  楼主 | 2016-10-8 13:27 | 只看该作者
本帖最后由 李小川希比 于 2016-10-8 13:57 编辑

程序功能:3*5的矩阵检测,困惑很久的原因:1、电路图外部的接口连接没看。以为是8个按键模拟3*5的矩阵,想想也是醉了,2、程序看得太少,很多模块的处理方法,运算方法不知道。理解起来比较难。

使用特权

评论回复
16
lrqzsu| | 2016-10-8 15:33 | 只看该作者
是一个3*5的按键阵列,扫描法,没看懂?那百度一下按键扫描法的基本流程。。。

使用特权

评论回复
17
李小川希比|  楼主 | 2016-10-9 11:11 | 只看该作者
lrqzsu 发表于 2016-10-8 15:33
是一个3*5的按键阵列,扫描法,没看懂?那百度一下按键扫描法的基本流程。。。 ...

谢谢!已弄懂,智商有点着急

使用特权

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

本版积分规则

15

主题

84

帖子

2

粉丝