打印
[51单片机]

请教个按键的问题

[复制链接]
1339|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yuanquan12345|  楼主 | 2015-10-15 08:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用一个按键,设置状态,在状态1,按下第二个按键,使一个数++。我应该是整个扫描按键的状态,并处理相应的函数,在这个函数里应该怎样实现,按一次第二个按键,数加1.如:
        if(keycode == 0x1B)        // 功能键按下
        {
                SetUp(i);                // 设置函数
                i++;
                if(i >= 5)
                {
                        i = 0;
                }
        }
        else if(keycode == 0x26)        // 增加键按下
        {
                num++;
                NumberAddr((i - 1), num);
        }
还是在状态下,扫描第二个按键。如:在状态1,扫描按键?
                        case 1:
                         if(keycode == 0x26)
                               i++;
                        break;
请大家指点,谢谢。
               

相关帖子

沙发
ayb_ice| | 2015-10-15 08:34 | 只看该作者
本帖最后由 ayb_ice 于 2015-10-15 08:35 编辑

按键始终扫描,

然后根据状态处理

这有什么问题吗

while(1)
{
        key_scan();

        if(stage == 1){
                if(key == KEY2){
                        var++;
                }
        }
}
至于状态怎么改变,你没有说明,这本身也是另外的事情

使用特权

评论回复
板凳
chenyu988| | 2015-10-15 08:34 | 只看该作者
扫描第一个按键,扫描第二个按键,分别写成两个函数。
在扫描第二个按键函数里面判断当前的状态是状态几,然后进行相应的操作

使用特权

评论回复
地板
ywlzh| | 2015-10-15 09:21 | 只看该作者
让CPU不断的扫描按键,那不是大材小用吗?你加个定时器,用100ms去扫描按键,是什么值就做什么事!额外多的时间就进去低功耗。让cpu休息休息

使用特权

评论回复
5
yuanquan12345|  楼主 | 2015-10-15 11:38 | 只看该作者
ayb_ice 发表于 2015-10-15 08:34
按键始终扫描,

然后根据状态处理

我没有说清楚,这里消抖都处理完了,就是判断:按键1按下有四种状态,在每一个状态里都要都要检测按键2,当按键2按下就将一个数加或者减。我的问题是:
       if(keycode == 0x1B)        // 功能键按下
        {
                SetUp(i);                // 设置函数
                i++;    判断状态
                if(i >= 5)
                {
                        i = 0;
                }
        }
        else if(keycode == 0x26)        // 增加键按下
        {
                NumberAddr();处理函数
        }
        else if(keycode == 0x28)        // 减少键按下
        {
                NumberLost(i - 1);       
        }
        else if(keycode == 0x0D)        // 确认键按下
        {
                Confirm(i - 1);                // 确认键,处理函数
        }
是这样处理,但是数怎样加?
还是在功能键按下后:
还是在状态下,再检测第二个按键。
                        case 1:
                         if(keycode == 0x26)
                               i++;
                        break;

使用特权

评论回复
6
yuanquan12345|  楼主 | 2015-10-15 11:41 | 只看该作者
我是做了一个,1602显示,用5045存储,用按键设置,用超声波测距。
正常显示超声波数据,在第一行,在第二行显示,存储到5045里的四个数据,用所测数据与存储数据比较,然后动作。
不知道,现在说明白了不?
谢谢大家的回复。

使用特权

评论回复
7
yuanquan12345|  楼主 | 2015-10-15 11:42 | 只看该作者
ywlzh 发表于 2015-10-15 09:21
让CPU不断的扫描按键,那不是大材小用吗?你加个定时器,用100ms去扫描按键,是什么值就做什么事!额外多的 ...

消抖,刷新都做完了,现在只是检测按下的是哪个按键,再执行相应的动作。
谢谢。

使用特权

评论回复
8
yuanquan12345|  楼主 | 2015-10-15 11:43 | 只看该作者
chenyu988 发表于 2015-10-15 08:34
扫描第一个按键,扫描第二个按键,分别写成两个函数。
在扫描第二个按键函数里面判断当前的状态是状态几, ...

您的意思,是加标志位吗?
谢谢。

使用特权

评论回复
9
ayb_ice| | 2015-10-15 11:45 | 只看该作者
本帖最后由 ayb_ice 于 2015-10-15 11:46 编辑
yuanquan12345 发表于 2015-10-15 11:38
我没有说清楚,这里消抖都处理完了,就是判断:按键1按下有四种状态,在每一个状态里都要都要检测按键2, ...

请恕我笨,真不明白

就是根据状态处理而已,只要维护好状态就行了,在什么状态下按键是什么功能就可以了,这都是根据项目需要处理的,有什么问题吗
这样不是很明白吗,
if(stage == 1 && key == KEYx){
    ....
}
else
if(){
   ....
}


使用特权

评论回复
10
yuanquan12345|  楼主 | 2015-10-15 14:00 | 只看该作者
ayb_ice 发表于 2015-10-15 11:45
请恕我笨,真不明白

就是根据状态处理而已,只要维护好状态就行了,在什么状态下按键是什么功能就可以了 ...

必须加标志位吗?

使用特权

评论回复
11
ayb_ice| | 2015-10-15 14:28 | 只看该作者
本帖最后由 ayb_ice 于 2015-10-15 14:30 编辑

什么标志位啊

你状态不需要变量维持吗
什么状态,什么按键做什么事不是最清楚了吗,这语法也简单明了,我不明白有什么不好还是有什么不明白

使用特权

评论回复
12
yuanquan12345|  楼主 | 2015-10-15 14:39 | 只看该作者
ayb_ice 发表于 2015-10-15 14:28
什么标志位啊

你状态不需要变量维持吗

谢谢,明白了。每种状态都置位一个变量。

使用特权

评论回复
13
lvyunhua| | 2015-10-15 20:42 | 只看该作者
状态需要变量维持。

使用特权

评论回复
14
yuanquan12345|  楼主 | 2015-10-16 00:00 | 只看该作者
lvyunhua 发表于 2015-10-15 20:42
状态需要变量维持。

谢谢。

使用特权

评论回复
15
ywlzh| | 2015-10-16 09:16 | 只看该作者
yuanquan12345 发表于 2015-10-15 11:42
消抖,刷新都做完了,现在只是检测按下的是哪个按键,再执行相应的动作。
谢谢。 ...

其实,你用一个变量读到的按键值就是它的状态,为什么还要去加标志位?难道你读的按键会有重复的值?

使用特权

评论回复
16
yuanquan12345|  楼主 | 2015-10-16 10:21 | 只看该作者
是,按一次执行一种处理,按第二次执行另一种处理,按第三次……。
谢谢。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

1155

帖子

3

粉丝