打印

关于按键部分~~请教高手

[复制链接]
3194|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xingaiking|  楼主 | 2011-5-12 10:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
maychang| | 2011-5-12 10:42 | 只看该作者
太容易了。程序中将各LED状态(即P0口四条线输出状态)读出取反即可。

使用特权

评论回复
板凳
Dominator| | 2011-5-12 11:09 | 只看该作者
按键要去抖,最好不要用Delayms(10)这种方式来去抖。其他的书上都有,仔细看看吧。

使用特权

评论回复
地板
xingaiking|  楼主 | 2011-5-12 12:00 | 只看该作者
请给出具体程序吧~~这种思想很容易~~~

使用特权

评论回复
5
Dominator| | 2011-5-12 12:11 | 只看该作者
/**************************************************************************/
//文 件 名:key.c
//功    能:短击\连击
//调用方法:unsigned char keyValue = ReadKey();
//说    明:该程序不适用于阵列键盘.
//                   该程序不需要使用定时器.
//                   调用处要加入switch语句来判断相应按键按下并执行相应动作.
//                   如需要在按键松开后执行动作,则调用函数需要定义一个bit标志位,在default语句里判断标志位状态.
//         KEY_WOBBLE_TIME 指程序程序执行次数.实际应用中要根据程序的长短来调整成合适的数值.
//                  
//备    注:程序思路是当按键被按下时开始计算程序的执行次数,如小于KEY_WOBBLE_TIME,则认为按键没有被按下.
//         引用自http://www.rupeng.com/forum/thread-12239-1-1.html,略做更改.

/*************************************************************************/
#include <reg52.h>
                typedef unsigned int uint;
                typedef unsigned char uchar;
#define KEY_WOBBLE_TIME         200   //去抖动时间
#define KEY_IO P1                                                                                //按键所连的IO口
#define NO_KEY_VALUE 0xf                                                                //当按键没有被按下时IO口的值
uchar  ReadKey(){                                                                               //判断哪个键被按下
        static uchar lastKey = NO_KEY_VALUE;
        static uint  keyCount = 0;
        uchar  keyTemp = NO_KEY_VALUE;
        keyTemp = KEY_IO & NO_KEY_VALUE;                                                                           //读取键值
        if(keyTemp == NO_KEY_VALUE){                                                                           //无按键按下时返回0xf
                keyCount = 0;
                return NO_KEY_VALUE;
        }else{                                                                                            //有按键按下时
                if(keyTemp==lastKey){
                         if(++keyCount == KEY_WOBBLE_TIME){                    //不是第1次按下判断抖动是否结束
                                        return keyTemp;                                            //去抖结束,返回键值
                        }
                }else{                                                                                    //是第1次按下则保存键值,下次执行此函数时与读到的键值作比较
                        lastKey = keyTemp ;                                                    //保存第1次读到的键值
                        keyCount = 0;                                                            //延时计数器清零
                        return NO_KEY_VALUE;
                }
        }
}

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xingaiking + 1 谢谢了
6
Dominator| | 2011-5-12 12:19 | 只看该作者
#include <reg52.h>
#include "key.h"
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
sbit LED4 = P0^3;
main(){
    unsigned char keyValue;
    while(1){         
        keyValue = ReadKey() ;
        switch(keyValue){
                    case 0x0e:
                              LED1= ~LED1;
                              break;
                    case 0x0d:
                              LED2= ~LED2;
                              break;
                    case 0x0b:
                              LED3= ~LED3;
                              break;
                    case 0x07:
                              LED4= ~LED4;
                              break;
                    default:
                              break;
               }
          }
}

使用特权

评论回复
7
xingaiking|  楼主 | 2011-5-12 12:20 | 只看该作者
谢了~~~要是在能详细点就好了  我是初学者 5# Dominator

使用特权

评论回复
8
Dominator| | 2011-5-12 12:20 | 只看该作者
//key.h
#ifndef _key_h_
        #define        _key_h_
                 uchar ReadKey();
#endif

使用特权

评论回复
9
Dominator| | 2011-5-12 12:21 | 只看该作者
写的很乱,自己研究下吧。

使用特权

评论回复
10
xingaiking|  楼主 | 2011-5-12 12:36 | 只看该作者
编译有两个错误额·~~H文件我添加进去了,P1口我不知道怎么定义 6# Dominator

使用特权

评论回复
11
yjhon| | 2011-5-12 12:41 | 只看该作者
6L够详细了都

使用特权

评论回复
12
xingaiking|  楼主 | 2011-5-12 12:59 | 只看该作者
因为我按键是无线遥控的,是不是效果不明显? 6# Dominator

使用特权

评论回复
13
luckycrow| | 2011-5-12 15:40 | 只看该作者
可以不用单片机,反向器74s14就行。

使用特权

评论回复
14
yujie870705| | 2011-5-12 16:06 | 只看该作者
检测到有键按下,就把LED端口取反

使用特权

评论回复
15
yangtao9189| | 2011-5-12 16:19 | 只看该作者
:o

使用特权

评论回复
16
dog_xin| | 2011-5-12 16:33 | 只看该作者
浪费资源,键盘与LED公用一个口

使用特权

评论回复
17
Dominator| | 2011-5-12 16:58 | 只看该作者
10# xingaiking
reg52.h里面有P1的定义。
sfr P1 = 0x90h;
我用的是AT89S52,别的不了解,不清楚你用的什么型号的。

使用特权

评论回复
18
Dominator| | 2011-5-12 16:58 | 只看该作者
12# xingaiking
无线我没用过,帮不了你了。

使用特权

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

本版积分规则

1

主题

69

帖子

1

粉丝