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

[复制链接]
4138|17
 楼主| xingaiking 发表于 2011-5-12 10:33 | 显示全部楼层 |阅读模式
是这样的,P1口接8个不自锁按键开关,P0口接8个发光二极管。我想用P1口的P1.0 P1.1 P1.2 P1.3分别控制P0口的其中4个发光二极管,按一次亮,在按一次就灭,能实现么?  请各位大虾不吝赐教·~~~
maychang 发表于 2011-5-12 10:42 | 显示全部楼层
太容易了。程序中将各LED状态(即P0口四条线输出状态)读出取反即可。
Dominator 发表于 2011-5-12 11:09 | 显示全部楼层
按键要去抖,最好不要用Delayms(10)这种方式来去抖。其他的书上都有,仔细看看吧。
 楼主| xingaiking 发表于 2011-5-12 12:00 | 显示全部楼层
请给出具体程序吧~~这种思想很容易~~~
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 谢谢了

查看全部评分

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;
               }
          }
}
 楼主| xingaiking 发表于 2011-5-12 12:20 | 显示全部楼层
谢了~~~要是在能详细点就好了  我是初学者 5# Dominator
Dominator 发表于 2011-5-12 12:20 | 显示全部楼层
//key.h
#ifndef _key_h_
        #define        _key_h_
                 uchar ReadKey();
#endif
Dominator 发表于 2011-5-12 12:21 | 显示全部楼层
写的很乱,自己研究下吧。
 楼主| xingaiking 发表于 2011-5-12 12:36 | 显示全部楼层
编译有两个错误额·~~H文件我添加进去了,P1口我不知道怎么定义 6# Dominator
yjhon 发表于 2011-5-12 12:41 | 显示全部楼层
6L够详细了都
 楼主| xingaiking 发表于 2011-5-12 12:59 | 显示全部楼层
因为我按键是无线遥控的,是不是效果不明显? 6# Dominator
luckycrow 发表于 2011-5-12 15:40 | 显示全部楼层
可以不用单片机,反向器74s14就行。
yujie870705 发表于 2011-5-12 16:06 | 显示全部楼层
检测到有键按下,就把LED端口取反
yangtao9189 发表于 2011-5-12 16:19 | 显示全部楼层
dog_xin 发表于 2011-5-12 16:33 | 显示全部楼层
浪费资源,键盘与LED公用一个口
Dominator 发表于 2011-5-12 16:58 | 显示全部楼层
10# xingaiking
reg52.h里面有P1的定义。
sfr P1 = 0x90h;
我用的是AT89S52,别的不了解,不清楚你用的什么型号的。
Dominator 发表于 2011-5-12 16:58 | 显示全部楼层
12# xingaiking
无线我没用过,帮不了你了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

69

帖子

1

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