智能车制作

标题: k60 矩阵键盘程序-可用 [打印本页]

作者: JORY    时间: 2013-9-14 23:37
标题: k60 矩阵键盘程序-可用
#include  "key.h"

unsigned char KeyScan(void)  //键盘扫描函数,使用行列反转扫描法
{
unsigned char cord_h,cord_l;//行列值中间变量
                     
             //行线输出全为0
             gpio_init (PORTB, 0, GPO, LOW);
             gpio_init (PORTB, 2, GPO, LOW);
             gpio_init (PORTB, 9, GPO, LOW);
             gpio_init (PORTB, 11, GPO, LOW);
            
             gpio_init (PORTB, 17, GPI_UP, HIGH);
             gpio_init (PORTB, 19, GPI_UP, HIGH);
             gpio_init (PORTB, 21, GPI_UP, HIGH);
             gpio_init (PORTB, 23, GPI_UP, HIGH);

if( gpio_get (PORTB,  17)==0 || gpio_get (PORTB,  19)==0 || gpio_get (PORTB,  21)==0 || gpio_get (PORTB,  23)==0 )    //先检测有无按键按下
{
    KEY_DELAY_MS(5);        //去抖
    if( gpio_get (PORTB,  17)==0 || gpio_get (PORTB,  19)==0 || gpio_get (PORTB,  21)==0 || gpio_get (PORTB,  23)==0 )
    {
           if(gpio_get (PORTB,  17)==0 && gpio_get (PORTB,  19)!=0 && gpio_get (PORTB,  21)!=0 && gpio_get (PORTB,  23)!=0)
          cord_h=10;
      else if(gpio_get (PORTB,  17)!=0 && gpio_get (PORTB,  19)==0 && gpio_get (PORTB,  21)!=0 && gpio_get (PORTB,  23)!=0)
          cord_h=20;
      else if(gpio_get (PORTB,  17)!=0 && gpio_get (PORTB,  19)!=0 && gpio_get (PORTB,  21)==0 && gpio_get (PORTB,  23)!=0)
          cord_h=30;
      else if(gpio_get (PORTB,  17)!=0 && gpio_get (PORTB,  19)!=0 && gpio_get (PORTB,  21)!=0 && gpio_get (PORTB,  23)==0)
          cord_h=40;
      
             //列线输出全为0
             gpio_init (PORTB, 0, GPI_UP, HIGH);
             gpio_init (PORTB, 2, GPI_UP, HIGH);
             gpio_init (PORTB, 9, GPI_UP, HIGH);
             gpio_init (PORTB, 11, GPI_UP, HIGH);
            
             gpio_init (PORTB, 17,  GPO, LOW);
             gpio_init (PORTB, 19, GPO, LOW);
             gpio_init (PORTB, 21, GPO, LOW);
             gpio_init (PORTB, 23, GPO, LOW);
     
           if(gpio_get (PORTB,  0)==0 && gpio_get (PORTB,  2)!=0 && gpio_get (PORTB,  9)!=0 && gpio_get (PORTB,  11)!=0)
          cord_l=1;
      else if(gpio_get (PORTB,  0)!=0 && gpio_get (PORTB,  2)==0 && gpio_get (PORTB,  9)!=0 && gpio_get (PORTB,  11)!=0)
          cord_l=2;
      else if(gpio_get (PORTB,  0)!=0 && gpio_get (PORTB,  2)!=0 && gpio_get (PORTB,  9)==0 && gpio_get (PORTB,  11)!=0)
          cord_l=3;
      else if(gpio_get (PORTB,  0)!=0 && gpio_get (PORTB,  2)!=0 && gpio_get (PORTB,  9)!=0 && gpio_get (PORTB,  11)==0)
          cord_l=4;
  
      while(gpio_get (PORTB,  0)==0 || gpio_get (PORTB,  2)==0 || gpio_get (PORTB,  9)==0 || gpio_get (PORTB,  11)==0);//等待松开并输出
  
      return(cord_h+cord_l);//键盘最后组合码值
     }
  }
  return(0xff);
}

unsigned char KeyPro(void)
{
switch(KeyScan())
{
  case 11:return 0;break;
  case 16:return 1;break;
  case 13:return 2;break;
  case 18:return 3;break;
  case 21:return 4;break;
  case 22:return 5;break;
  case 23:return 6;break;
  case 24:return 7;break;
  case 31:return 8;break;
  case 32:return 9;break;
  case 33:return 10;break;
  case 34:return 11;break;
  case 41:return 16;break;
  case 42:return 13;break;
  case 43:return 18;break;
  case 44:return 15;break;
  default:return 0xff;break;
}
}
作者: 夏日的冰    时间: 2013-9-14 23:57
换一种写法会更精简,效率更高!
作者: 中华旺仔    时间: 2013-9-15 00:11
太难了吧,,看不懂啊
作者: JORY    时间: 2013-9-15 00:41
中华旺仔 发表于 2013-9-15 00:11
太难了吧,,看不懂啊

我是感觉k60不能像51那样,直接对P0或P1口直接赋值,就这么写了,反转扫描,     按键接口: PORTB0,PORTB2.PORTB9.PORTB11.PORTB17.PORTB19.PORTB21.PORTB23.


作者: JORY    时间: 2013-9-15 00:41
夏日的冰 发表于 2013-9-14 23:57
换一种写法会更精简,效率更高!

求指导。。

作者: 正先生、正能量    时间: 2013-9-15 08:37
拿k60做矩阵键盘...好奢侈..
作者: wangyao19920204    时间: 2013-9-15 09:19
夏日的冰 发表于 2013-9-14 23:57
换一种写法会更精简,效率更高!

求指导,有什么好的方法做键盘扫描啊?

作者: xiaobai727    时间: 2013-9-15 09:32
用两个AD口即可。。。。
作者: xiaobai727    时间: 2013-9-15 09:33
wangyao19920204 发表于 2013-9-15 09:19
求指导,有什么好的方法做键盘扫描啊?

两个AD口就可以实现3X4键盘。。。
作者: JORY    时间: 2013-9-15 12:40
xiaobai727 发表于 2013-9-15 09:33
两个AD口就可以实现3X4键盘。。。

有时间试试。。

作者: JORY    时间: 2013-9-15 12:41
正先生、正能量 发表于 2013-9-15 08:37
拿k60做矩阵键盘...好奢侈..

做项目用到的,没办法。。。

作者: xiaobai727    时间: 2013-9-15 12:46
JORY 发表于 2013-9-15 12:40
有时间试试。。

嗯嗯。。。
作者: 似水流年、    时间: 2013-9-15 22:15
这种写法效率太低
作者: 夏日的冰    时间: 2013-9-16 14:13
JORY 发表于 2013-9-15 00:41
求指导。。

八个io口一起操作,就跟51的八位总线操作一样,十来个语句就可以扫描完了!

作者: 夏日的冰    时间: 2013-9-16 14:14
wangyao19920204 发表于 2013-9-15 09:19
求指导,有什么好的方法做键盘扫描啊?

TESTPORT_D=0xff;//输出模式
    TESTPORT_O=0xF0;   //1111 0000
    TESTPORT_D=0x0f;//高四位输入模式(0:输入,1:输出)0000 1111
    Delay_key(100);

    temp=TESTPORT_I; //读取了高四位的值
    temp=temp&0xF0;        //看看高四位有谁变成了低电平
    temp=temp>>4;//将高四位右移四位,看看那个是低电平的(按键的位置)
    switch(temp)       
    {                   
        case 7:key=3;break;   //0111
        case 11:key=2;break;  //1011
        case 13:key=1;break;  //1101
        case 14:key=0;break;  //1110
        default:key=0xff;break;
    }  

    TESTPORT_D=0xff;//输出模式
    TESTPORT_O=0x0f;      //0000 1111
    TESTPORT_D=0xf0;//低四位输入模式
    Delay_key(100);

    temp=TESTPORT_I;          //读取低四位的值         
    temp=temp&0x0F;//看看谁编程了低电平
    switch(temp)  
    {                             
        case 7:key=key+12; break; //0111
        case 11:key=key+8; break;//1011
        case 13:key=key+4; break;//1101
        case 14:key=key+0;break;//1110
        default:key=0xff; break;
    }


作者: 夏日的冰    时间: 2013-9-16 14:16
JORY 发表于 2013-9-15 00:41
求指导。。

看楼下,我附了代码!或许这种方式会更好一些!

作者: JORY    时间: 2013-9-16 16:21
夏日的冰 发表于 2013-9-16 14:16
看楼下,我附了代码!或许这种方式会更好一些!

谢谢了,确实比我的简洁多了

作者: JORY    时间: 2013-9-16 16:21
夏日的冰 发表于 2013-9-16 14:16
看楼下,我附了代码!或许这种方式会更好一些!

谢谢了,确实比我的简洁多了

作者: zhangjiaming    时间: 2013-12-29 21:29
有AW60的矩阵代码吗

作者: dbld2006    时间: 2014-11-18 14:25
楼主请问你们矩阵键盘弄上拉了么?
作者: 聪聪雷    时间: 2015-1-14 14:52
夏日的冰 发表于 2013-9-16 14:14
TESTPORT_D=0xff;//输出模式
    TESTPORT_O=0xF0;   //1111 0000
    TESTPORT_D=0x0f;//高四位输入模 ...

K60怎么一次对8个IO进行的操作啊?

作者: 浅笑无痕    时间: 2015-5-18 21:29
聪聪雷 发表于 2015-1-14 14:52
K60怎么一次对8个IO进行的操作啊?

//8位操作
#define     _PTX_Bn_T(ptx,n,type)  (ptx##_B##n##_##type)
#define     PTX_Bn_T(ptx,n,type)   _PTX_Bn_T(ptx,n,type)



作者: 风中溯    时间: 2015-7-29 15:35
:):):):):):):):):)
作者: a136498491    时间: 2015-8-5 02:05
应该写成状态机形式,写成阻塞型的,其他任务怎么办
作者: 玄金龙_pJKuF    时间: 2017-4-19 16:38
楼主用的什么库?
作者: 玄金龙_pJKuF    时间: 2017-4-19 16:40
夏日的冰 发表于 2013-9-16 14:14
TESTPORT_D=0xff;//输出模式
    TESTPORT_O=0xF0;   //1111 0000
    TESTPORT_D=0x0f;//高四位输入模 ...

这是什么库啊?





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2