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

[复制链接]
 楼主| 李小川希比 发表于 2016-9-29 15:49 | 显示全部楼层 |阅读模式
  1. #include "global.h"
  2. #include "key.h"
  3. #include "menu.h"

  4. char key;
  5. unsigned char nkey;
  6. char keycol;
  7. char keyrow;
  8. char keytimer;
  9. char flagkeydown;
  10. char flagkeyvalid;
  11. char flagkeyunprocessed;                                                        //当前按键有Flag
  12. unsigned char keyline[] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF};
  13. #define keyscanline P2OUT
  14. #define keyNotPressed() (P2IN & 0xe0) == 0xE0
  15. #define getkeycol() (P2IN & 0xe0)

  16. void InitKey(){                                                                 //按键处理初期化
  17.         P2SEL = 0x00;
  18.         P2DIR = 0x1F;
  19.         P2OUT = 0xFF;
  20.         P2REN = 0x00;                                                                //拉功能禁止
  21.         P2DS = 0x00;
  22.         P2IE = 0x00;                                                                //中断禁止
  23.         keytimer = 0;
  24. }

  25. unsigned char keyscan(){
  26.         unsigned char keytemp = 0xFF;
  27.         if(keyNotPressed()){
  28.                 keytimer ++;
  29.                 if(keytimer > 4)
  30.                         keytimer = 0;
  31.                 keyscanline = keyline[keytimer];
  32.                 return 0xFF;
  33.         }
  34.        
  35.         switch(getkeycol()){
  36.                 case 0x60:
  37.                         keytemp = 2;
  38.                         break;
  39.                 case 0xA0:
  40.                         keytemp = 1;
  41.                         break;
  42.                 case 0xC0:
  43.                         keytemp = 0;
  44.                         break;
  45.         }
  46.         keytemp += keytimer * 3;
  47.         switch(keytemp){
  48.                 case 0:
  49.                         return KEY_1;                                           //
  50.                 case 1:
  51.                         return KEY_4;                                           //
  52.                 case 2:
  53.                         return KEY_7;                                           //
  54.                 case 3:
  55.                         return KEY_2;                                           //
  56.                 case 4:
  57.                         return KEY_5;                                           //
  58.                 case 5:
  59.                         return KEY_8;                                           //
  60.                 case 6:
  61.                         return KEY_3;                                           //
  62.                 case 7:
  63.                         return KEY_6;                                           //
  64.                 case 8:
  65.                         return KEY_9;                                           //
  66.                 case 9:
  67.                         return KEY_UP;                                          //
  68.                 case 10:
  69.                         return KEY_0;                                           //
  70.                 case 11:
  71.                         return KEY_DOWN;                                        //
  72.                 case 12:
  73.                         return KEY_BACK;                                        //
  74.                 case 13:
  75.                         return KEY_CLEAR;                                       //
  76.                 case 14:
  77.                         return KEY_OK;                                          //
  78.                 default:
  79.                         break;               
  80.         }
  81.         return 0xFF;              //return 0xFF有什么用?
  82. }

  83. void Get_key(){                                                                 //获得键值
  84.         unsigned char keytemp;
  85.        
  86.         keytemp = keyscan();
  87.         if(keytemp >= 0x0F){                                                    //如果当前键值在0x0F以上
  88.                 nkey = 0xFF;                                                    //前回键值
  89.                 flagkeydown = 0;
  90.                 flagkeyvalid = 0;
  91.                 flagkeyunprocessed = 0;                                         //当前按键有Flag CLR
  92.                 return;
  93.         }

  94.         if(keytemp != nkey){
  95.                 flagkeydown = 1;
  96.                 nkey = keytemp;
  97.                 return;
  98.         }

  99.         if(flagkeyvalid == 0){
  100.                 key = nkey;
  101.                 if(key != KEY_BACK){
  102.                         back_menuflag = 0;
  103.                 }
  104.                
  105.                 flagkeyvalid = 1;
  106.                 flagkeyunprocessed = 1;                                                //当前按键有Flag SET                       
  107.         }
  108. }

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
ningling_21 发表于 2016-9-29 15:58 | 显示全部楼层
//return 0xFF有什么用?

表示没有按键按下
NE5532 发表于 2016-9-30 08:44 | 显示全部楼层
看了本版精华《程序调试黑宝书》,经医治无效,再疯也不迟。
416356084 发表于 2016-9-30 09:37 | 显示全部楼层
自己都说了3X4,还独立按键,也是没有谁了
dirtwillfly 发表于 2016-9-30 10:21 | 显示全部楼层
416356084 发表于 2016-9-30 09:37
自己都说了3X4,还独立按键,也是没有谁了

不知道从哪里copy来的程序吧
 楼主| 李小川希比 发表于 2016-9-30 11:20 | 显示全部楼层
dirtwillfly 发表于 2016-9-30 10:21
不知道从哪里copy来的程序吧

嗯,公司上个项目的程序,才到公司不久,表示看不懂!
长的帅怪我落 发表于 2016-9-30 11:30 | 显示全部楼层
然后你想干嘛呢?
416356084 发表于 2016-9-30 11:39 | 显示全部楼层
李小川希比 发表于 2016-9-30 11:20
嗯,公司上个项目的程序,才到公司不久,表示看不懂!

你现在想干什么?
teddeng 发表于 2016-9-30 14:18 | 显示全部楼层
unsigned char keyline[] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF};
知道这句什么意思,其他都简单了。
songchenping 发表于 2016-9-30 14:27 | 显示全部楼层
楼主还不如老老实实自己一句一句写呢。不会出错的。还有就是最好能自己画个流程图。
 楼主| 李小川希比 发表于 2016-9-30 14:51 | 显示全部楼层
416356084 发表于 2016-9-30 11:39
你现在想干什么?

公司设备要改进,需要修改部分程序
416356084 发表于 2016-9-30 15:28 | 显示全部楼层
李小川希比 发表于 2016-9-30 14:51
公司设备要改进,需要修改部分程序

那跟按键有什么关系???
jyrpxj 发表于 2016-10-7 12:18 | 显示全部楼层
一个按键扫描的程序也看不懂,也是没谁了
 楼主| 李小川希比 发表于 2016-10-8 10:45 | 显示全部楼层
jyrpxj 发表于 2016-10-7 12:18
一个按键扫描的程序也看不懂,也是没谁了

还望兄弟指教
 楼主| 李小川希比 发表于 2016-10-8 13:27 | 显示全部楼层
本帖最后由 李小川希比 于 2016-10-8 13:57 编辑

程序功能:3*5的矩阵检测,困惑很久的原因:1、电路图外部的接口连接没看。以为是8个按键模拟3*5的矩阵,想想也是醉了,2、程序看得太少,很多模块的处理方法,运算方法不知道。理解起来比较难。
lrqzsu 发表于 2016-10-8 15:33 | 显示全部楼层
是一个3*5的按键阵列,扫描法,没看懂?那百度一下按键扫描法的基本流程。。。
 楼主| 李小川希比 发表于 2016-10-9 11:11 | 显示全部楼层
lrqzsu 发表于 2016-10-8 15:33
是一个3*5的按键阵列,扫描法,没看懂?那百度一下按键扫描法的基本流程。。。 ...

谢谢!已弄懂,智商有点着急
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

84

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部