请问如何获取键盘的值

[复制链接]
5944|22
 楼主| binsea 发表于 2011-2-8 14:23 | 显示全部楼层 |阅读模式
本帖最后由 binsea 于 2011-2-9 15:56 编辑

单片机的键盘扫描程序网上很多,我找了一个用。
现在的问题是:我要把两次按键的值赋给一个变量供其他程序使用。

举个例子:我按下8和9后,把8和9取得,组合成89,然后赋给变量key怎么弄?

while(1)
{
if (当按键被按下)
  {
  执行键扫描;
  把得到的键值赋给key;
  }
}

键扫描程序不分第几次按键,按一次有一次的值。我现在就是不知道怎么把两次按键的值取出来,然后组合?



***********************************************************

我用了个计数器来判断第几次按键,但是最后得到的数据是错的。
k=0;
if (当按键被按下)
{
      k=k+1;
        if (k==1表示第一次按键)
            {
                 执行键扫描;
           把得到的键值赋给key1;
             }
          if (k==2第二次按键)
             {
               键扫描;
          把得到的值赋给key2;
              }
}

这样把两次按键所得到的值赋给key1和key2好像不对,但是矩阵键盘扫描程序没办法区分并得到两次按键的值。
mcuisp 发表于 2011-2-8 16:48 | 显示全部楼层
(行*列数)+列
或者(列*行数)+行
乘法也可以用移位代替,比如*8=移3位,*16=移4位
 楼主| binsea 发表于 2011-2-8 19:00 | 显示全部楼层
怎么算我知道。问题是怎么取得第一次按键和第二次?程序怎么区分两次按键,两次按键的值怎么取得?
 楼主| binsea 发表于 2011-2-8 19:01 | 显示全部楼层
怎么算我知道。问题是怎么取得第一次按键和第二次?程序怎么区分两次按键,两次按键的值怎么取得?
NE5532 发表于 2011-2-8 20:22 | 显示全部楼层
怎么算我知道。问题是怎么取得第一次按键和第二次?程序怎么区分两次按键,两次按键的值怎么取得?
binsea 发表于 2011-2-8 19:01


你想下啥叫“一次按键”呢,看问题要看本质。
NE5532 发表于 2011-2-8 20:23 | 显示全部楼层
先想一下,答案回复可见。

游客,如果您要查看本帖隐藏内容请回复
mentlely 发表于 2011-2-8 23:27 | 显示全部楼层
我是来看答案的
mcuisp 发表于 2011-2-9 00:28 | 显示全部楼层
产品对按键的需求各不相同,楼主的问题没有标准答案,只有很多参考答案
jacob1kao 发表于 2011-2-9 15:50 | 显示全部楼层
jacob1kao 发表于 2011-2-9 16:05 | 显示全部楼层
天凉好个秋 发表于 2011-2-9 16:25 | 显示全部楼层
刘前辈 发表于 2011-2-9 17:54 | 显示全部楼层
参考参考。
刘前辈 发表于 2011-2-9 20:34 | 显示全部楼层

缺少的变量说明自己填上即可。

本帖最后由 刘前辈 于 2011-2-9 20:39 编辑

本帖子中包含更多资源

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

×
 楼主| binsea 发表于 2011-2-9 22:31 | 显示全部楼层
#include "Main.h"
#include "Port.h"
#include "Keypad.h"

能否把头文件也发上来,这个程序的复杂程度可见一斑,还用到了指针,不太好理解啊,我只能照抄了。
流行音乐 发表于 2011-2-9 23:19 | 显示全部楼层
13楼给出的程序不能解决楼主的问题。
刘前辈 发表于 2011-2-10 09:52 | 显示全部楼层
13楼的程序非常精彩,连消抖都隐藏了。看懂了,C水平就会大长。
他的组合键方法是先按下功能键“*”键,然后输入多个有效键码。

指针形参看上去挺吓人的,实际上理解C语言一个重要概念“形参里数组的表达形式……。”所以,scan函数里那2个形参指针,是指2个数组缓冲区,1个存放键值,一个存放功能键。它的2个形参,是已经说明了的2个小的数组缓冲区。

同意15楼。没什么他人的程序可以拿来就套用的,都是参考编程思想,然后感悟,然后自己修改以适合自己。14楼照抄,肯定不行。还是先看懂,然后采用它的思想方法,写出自己程序为好。

网上去下载这本书《           》,(本论坛以前有分部下载。)参考第19、20章内容。

.
刘前辈 发表于 2011-2-10 09:53 | 显示全部楼层
本帖最后由 刘前辈 于 2011-2-10 09:58 编辑

13楼的程序非常精彩,连消抖都隐藏了。看懂了,C水平就会大长。
他的组合键方法是先按下功能键“*”键,然后输入多个有效键码。

指针形参看上去挺吓人的,实际上理解C语言一个重要概念“形参里数组的表达形式……。”所以,scan函数里那2个形参指针,是指2个数组缓冲区,1个存放键值,一个存放功能键。它的2个形参,是已经说明了的2个小的数组缓冲区。

同意15楼。没什么他人的程序可以拿来就套用的,都是参考编程思想,然后感悟,然后自己修改以适合自己。14楼照抄,肯定不行。还是先看懂,然后采用它的思想方法,写出自己程序为好。

网上去下载这本书《 时间触发嵌入式系统设计模式  》,(本论坛以前有分部下载。)参考第19、20章内容。

.
 楼主| binsea 发表于 2011-2-10 10:54 | 显示全部楼层
谢谢,楼上的。
问题我已经解决了。我用计数器解决了两次取值的问题,至于按键出来的数字驴唇不对马嘴是因为按键的消抖和松手检测的问题没处理好。我在网上重新找了个键盘扫描程序,带防抖和松手检测的,完美解决了问题。谢谢大家。
fushaobing 发表于 2011-2-10 11:39 | 显示全部楼层
简单点就是把上次的键值暂时保存起来。
复杂点就是用一个循环队列(先进先出)保存最近的两次键值。
hesperusiris 发表于 2011-7-5 18:39 | 显示全部楼层
学习学习~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

34

帖子

1

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