智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 9890|回复: 25
打印 上一主题 下一主题

k60 矩阵键盘程序-可用

  [复制链接]

21

主题

106

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1589
威望
778
贡献
511
兑换币
449
注册时间
2012-11-29
在线时间
150 小时
跳转到指定楼层
1#
发表于 2013-9-14 23:37:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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;
}
}

12

主题

342

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4494

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

QQ
威望
2002
贡献
1188
兑换币
931
注册时间
2012-9-4
在线时间
652 小时
2#
发表于 2013-9-14 23:57:45 | 只看该作者
换一种写法会更精简,效率更高!
回复 支持 反对

使用道具 举报

3

主题

563

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3808

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章

QQ
威望
1710
贡献
906
兑换币
1148
注册时间
2013-8-24
在线时间
596 小时
3#
发表于 2013-9-15 00:11:08 | 只看该作者
太难了吧,,看不懂啊
回复 支持 反对

使用道具 举报

21

主题

106

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1589
威望
778
贡献
511
兑换币
449
注册时间
2012-11-29
在线时间
150 小时
4#
 楼主| 发表于 2013-9-15 00:41:02 | 只看该作者
中华旺仔 发表于 2013-9-15 00:11
太难了吧,,看不懂啊

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

回复 支持 反对

使用道具 举报

21

主题

106

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1589
威望
778
贡献
511
兑换币
449
注册时间
2012-11-29
在线时间
150 小时
5#
 楼主| 发表于 2013-9-15 00:41:38 | 只看该作者
夏日的冰 发表于 2013-9-14 23:57
换一种写法会更精简,效率更高!

求指导。。
回复 支持 反对

使用道具 举报

2

主题

49

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1606
威望
789
贡献
457
兑换币
518
注册时间
2012-12-30
在线时间
180 小时
毕业学校
sanxiadaxue
6#
发表于 2013-9-15 08:37:51 | 只看该作者
拿k60做矩阵键盘...好奢侈..
回复 支持 反对

使用道具 举报

31

主题

370

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6026

活跃会员奖章优秀会员奖章在线王奖章论坛元老奖章

威望
3707
贡献
1593
兑换币
1043
注册时间
2012-12-27
在线时间
363 小时
毕业学校
三江学院
7#
发表于 2013-9-15 09:19:53 | 只看该作者
夏日的冰 发表于 2013-9-14 23:57
换一种写法会更精简,效率更高!

求指导,有什么好的方法做键盘扫描啊?
回复 支持 反对

使用道具 举报

17

主题

356

帖子

0

精华

常驻嘉宾

菜鸟一枚

Rank: 8Rank: 8

积分
4240
QQ
威望
2035
贡献
1297
兑换币
944
注册时间
2011-8-23
在线时间
454 小时
8#
发表于 2013-9-15 09:32:06 | 只看该作者
用两个AD口即可。。。。
回复 支持 反对

使用道具 举报

17

主题

356

帖子

0

精华

常驻嘉宾

菜鸟一枚

Rank: 8Rank: 8

积分
4240
QQ
威望
2035
贡献
1297
兑换币
944
注册时间
2011-8-23
在线时间
454 小时
9#
发表于 2013-9-15 09:33:31 | 只看该作者
wangyao19920204 发表于 2013-9-15 09:19
求指导,有什么好的方法做键盘扫描啊?

两个AD口就可以实现3X4键盘。。。
回复 支持 反对

使用道具 举报

21

主题

106

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1589
威望
778
贡献
511
兑换币
449
注册时间
2012-11-29
在线时间
150 小时
10#
 楼主| 发表于 2013-9-15 12:40:48 | 只看该作者
xiaobai727 发表于 2013-9-15 09:33
两个AD口就可以实现3X4键盘。。。

有时间试试。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-26 03:30 , Processed in 0.055958 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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