5375|20

48

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

急求4*4矩阵键盘 [复制链接]

c51 4*4矩阵键盘 我搞了好几天,就是没搞定, 要求: 键盘按下后,并弹开才执行按键值码, 如按键按住一直不放,则程序继续执行主程序,待松开键后
取到按键值, 兄弟们帮帮我呀

最新回复

这个好像有点问题吧。保存键值到再次发现无按键按下时才用?  详情 回复 发表于 2009-5-25 16:44
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
uchar kbscan(void)
            {
               uchar sccode,recode;
               P1=0xf0;
               if((P1&0xf0)!=0xf0)
                 { dlms();
                   if((P1&0xf0)!=0xf0)
                    {  sccode=0xfe;
                       while((sccode&0x10)!=0)
                        { P1=sccode;
                          if((P1&0xf0)!=0xf0)
                          { recode=(P1&0xf0)|0x0f;
                            return((~sccode)+(~recode));
                           }
                  else
                  sccode=(sccode<<1)|0x01;
                 }
                }
               }
              return(0);
             }
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
都不知道你的硬件接法,怎么能告诉你应该怎么做啊
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
然后在主程序里
main()
{
  key=kbscan();
  if(key)
  {//判断键值
    switch(key)
                   {  case 0x11:
                       break;
                      case 0x12:
                       break;
                      case 0x14:
                       break;
                      case 0x18:
                       break;
                      case 0x21:
                       break;
                      case 0x22:
                       break;
                      case 0x24:
                       break;
                      case 0x28:
                       break;
                      case 0x41:
                       break;
                      case 0x42:
                       break;
                      case 0x44:
                       break;
                      case 0x48:
                      break;
                      case 0x81:
                       break;
                      case 0x82:
                       break;
                      case 0x84:
                       break;
                      case 0x88:
                       break;
                   }
     delay();
  }
}
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
硬件如何连接的?

能检测按下、弹起,最好是接到外部中断0/1上,一般的IO口需要循环检查,浪费CPU。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
guetcw 可是可以,但一直按着键,就不停的收数据了,没有判断松开时的状态
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
应该还需要判断 是否松开了呀,否则程序执行了很多次,我一直以来就是这个判断松开时的问题没有解决,一直按键不放,要保证主程序继续执行,当按键松开后,再去执行 kbscan  ,这是个难点,我没解决
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 
按键的时候把哪个键被按下记录在数据缓冲区
下次扫描的时候发现上次按的那个键没有被按下了再动作
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

9
 
友情up
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

10
 
友情up
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

11
 
按下后,就扫描按键,获得键值,但仅仅是保存,而不做任何别的处理。

松开后,就可以按照刚才获得并保存的键值,进行对应的处理了。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

12
 
就是怎么判断松开状态 f=P0;   
                       f=f&0xf0;  
                           if (f==0xf0)
                           {
                                send(key)
                            }
这种方式判断按键是否松开?? 我一直按着不松开按键 ,程序为何也执行 send(key)
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

13
 
这样
uchar kbscan(void)
            {
              uchar sccode,recode;
              P1=0xf0;
              if((P1&0xf0)!=0xf0)
                { dlms();
                  if((P1&0xf0)!=0xf0)
                    {  sccode=0xfe;
                      while((sccode&0x10)!=0)
                        { P1=sccode;
                          if((P1&0xf0)!=0xf0)
                          { recode=(P1&0xf0)|0x0f;
                            return((~sccode)+(~recode));
                          }
                  else
                  sccode=(sccode < <1)|0x01;
                }
                }
              }
        while((P1&0xf0)!=0xf0);
              return(0);
            }

当你一直按着键的时候就一直执行这句while((P1&0xf0)!=0xf0);
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

14
 
当你一直按着键的时候就一直执行这句while((P1&0xf0)!=0xf0);
——这个很重要,如果一直按着就什么都不做。哈哈
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

15
 
while((P1&0xf0)!=0xf0);  不是吧,这样子做不会有问题吗?不松开其所有程序都不能执行,其它中断也是如此,
 
 
 

回复

103

帖子

0

TA的资源

一粒金砂(初级)

16
 
还是用中断吧,这样就解决了
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

17
 
关键就是在松手检测里编写相关功能的程序。
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

18
 
51系统应该没那么复杂吧,说说你的电路
扫描的话,用双边沿中断,按下有中断,扫描读键值,松开有中断执行~
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

19
 
配合外部的门电路实现组合逻辑,在松开的时候产生上升沿(下降沿)中断,在中断例程里响应。这样应该可以吧。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

20
 
中断的话使用上升沿中断;
扫描的话发现有按键按下保存键值,当再次发现无按键按下时发送之前的按键消息。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表