7034|11

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

51单片机矩4X4阵键盘怎么采用定时中断进行按键状态检测。 [复制链接]

我看了郭天祥的视频。。他扫描键盘的那个函数代码太长了。有无简便点的。。

  1. uchar keyscan()
  2. {
  3.                 P3=0xfe;
  4.                 temp=P3;
  5.                 temp=temp&0xf0;
  6.                 while(temp!=0xf0)
  7.                 {
  8.                         delay(5);
  9.                         temp=P3;
  10.                         temp=temp&0xf0;
  11.                         while(temp!=0xf0)
  12.                         {
  13.                                 temp=P3;
  14.                         switch(temp)
  15.                                 {
  16.                                         case 0xee:num=1;
  17.                                                 break;
  18.                                         case 0xde:num=2;
  19.                                                 break;
  20.                                         case 0xbe:num=3;
  21.                                                 break;
  22.                                         case 0x7e:num=4;
  23.                                                 break;
  24.                                 }
  25.                         while(temp!=0xf0)
  26.                                 {
  27.                                         temp=P3;
  28.                                         temp=temp&0xf0;
  29.                                 }
  30.                         }
  31.                 }

  32.                 P3=0xfd;
  33.                 temp=P3;
  34.                 temp=temp&0xf0;
  35.                 while(temp!=0xf0)
  36.                 {
  37.                         delay(5);
  38.                         temp=P3;
  39.                         temp=temp&0xf0;
  40.                         while(temp!=0xf0)
  41.                         {
  42.                                 temp=P3;
  43.                         switch(temp)
  44.                                 {
  45.                                         case 0xed:num=5;
  46.                                                 break;
  47.                                         case 0xdd:num=6;
  48.                                                 break;
  49.                                         case 0xbd:num=7;
  50.                                                 break;
  51.                                         case 0x7d:num=8;
  52.                                                 break;
  53.                                 }
  54.                         while(temp!=0xf0)
  55.                                 {
  56.                                         temp=P3;
  57.                                         temp=temp&0xf0;
  58.                                 }
  59.                         }
  60.                 }   

  61.                 P3=0xfb;
  62.                 temp=P3;
  63.                 temp=temp&0xf0;
  64.                 while(temp!=0xf0)
  65.                 {
  66.                         delay(5);
  67.                         temp=P3;
  68.                         temp=temp&0xf0;
  69.                         while(temp!=0xf0)
  70.                         {
  71.                                 temp=P3;
  72.                         switch(temp)
  73.                                 {
  74.                                         case 0xeb:num=9;
  75.                                                 break;
  76.                                         case 0xdb:num=10;
  77.                                                 break;
  78.                                         case 0xbb:num=11;
  79.                                                 break;
  80.                                         case 0x7b:num=12;
  81.                                                 break;
  82.                                 }
  83.                         while(temp!=0xf0)
  84.                                 {
  85.                                         temp=P3;
  86.                                         temp=temp&0xf0;
  87.                                 }
  88.                         }
  89.                 }


  90.                 P3=0xf7;
  91.                 temp=P3;
  92.                 temp=temp&0xf0;
  93.                 while(temp!=0xf0)
  94.                 {
  95.                         delay(5);
  96.                         temp=P3;
  97.                         temp=temp&0xf0;
  98.                         while(temp!=0xf0)
  99.                         {
  100.                                 temp=P3;
  101.                         switch(temp)
  102.                                 {
  103.                                         case 0xe7:num=13;
  104.                                                 break;
  105.                                         case 0xd7:num=14;
  106.                                                 break;
  107.                                         case 0xb7:num=15;
  108.                                                 break;
  109.                                         case 0x77:num=16;
  110.                                                 break;
  111.                                 }
  112.                         while(temp!=0xf0)
  113.                                 {
  114.                                         temp=P3;
  115.                                         temp=temp&0xf0;
  116.                                 }
  117.                         }
  118.                 }
  119. return num;

  120. }
复制代码


下面是我的电路图


最新回复

我在pudn下载过一个状态机模式的4x4按键代码,但是我的电脑被一mm借走了,你在pudn去找找。 也可以看看马潮那本书,里面有介绍状态机的。  详情 回复 发表于 2010-6-30 07:29
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
怎么看不到,键盘驱动太多了,只要能实现就行
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

4
 
定时中断进行按键状态检测是怎么回事。
要实现的话我那个电路图得怎么改。。
能不能请高手给份代码学习下。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

5
 
简单的肯定有,什么与与或或,一堆处理之后,终于算出来了键值,这样不好。代码长无所谓,最重要的是思路清晰,流程易懂,当然最好可以兼顾一下运行效率,,
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
线反转法——矩阵键盘的识别
我拿这份代码去试了下。怎么不行呢?
while(1)
{
       P0=0x0F;
      if((P0&0x0F)!=0x0F)
       {
            switch(P0)
           {
              case 0x07: i=3;   break;
              case 0x0b: i=2;   break;
              case 0x0d: i=1;   break;
              case 0x0e: i=0;   break;
              default: break;
           }
     }
     delay10ms();//软件去抖动
     P0=0xF0;//反转行和列上的电平
     if((P0&0xF0)!=0xF0)
     {
           switch(P0)
           {
            case 0x70: j=3;   break;
            case 0xb0: j=2;   break;
            case 0xd0: j=1;   break;
            case 0xe0: j=0;   break;
            default: break;
           }
            P1=num[j];//P1输出对应的按键值
      }
}
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 4 楼 peasant_lee 的回复:
简单的肯定有,什么与与或或,一堆处理之后,终于算出来了键值,这样不好。代码长无所谓,最重要的是思路清晰,流程易懂,当然最好可以兼顾一下运行效率,,

给份代码,行不?
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

8
 
这个虽然长,但比较好用

用定时器扫描键盘,里面也需要这个函数
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
这样的代码是不能拿来用的,效率极低。当然作为入门学习还是可以的,建议用状态机模式来写。学习一下状态机吧,也不难,对于规划代码还是比较好的!
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 8 楼 dong20072 的回复:
这样的代码是不能拿来用的,效率极低。当然作为入门学习还是可以的,建议用状态机模式来写。学习一下状态机吧,也不难,对于规划代码还是比较好的!


那能不能给份简单点的扫描按键键值的代码。
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

11
 
谁能帮我解决这个问题。谢谢
引用 5 楼 a006045 的回复:
线反转法——矩阵键盘的识别
我拿这份代码去试了下。怎么不行呢?
while(1)
{
  P0=0x0F;
  if((P0&0x0F)!=0x0F)
  {
  switch(P0)
  {
  case 0x07: i=3; break;
  case 0x0b: i=2; break;
  case 0x0d: i=1; break;
  case 0x0e……
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 9 楼 a006045 的回复:
引用 8 楼 dong20072 的回复:
这样的代码是不能拿来用的,效率极低。当然作为入门学习还是可以的,建议用状态机模式来写。学习一下状态机吧,也不难,对于规划代码还是比较好的!


那能不能给份简单点的扫描按键键值的代码。


我在pudn下载过一个状态机模式的4x4按键代码,但是我的电脑被一mm借走了,你在pudn去找找。
也可以看看马潮那本书,里面有介绍状态机的。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表