微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机独立按键检测的学习笔记

51单片机独立按键检测的学习笔记

时间:10-02 整理:3721RD 点击:
51单片机独立按键的结构图:


当按下开关后,由于开关的两端是线与关系,因此导线上的电平时0,也就是说如果我们初始化与开关连接的IO口电平为1,当我们按下去以后,我们只要检测这个IO口的电平是否为0,即可检测到是否按了键。
按键按下去的电压变化曲线:


程序如下 :

  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit d1=P1^0;     //声明第一个发光二极管的位
  5. sbit dula=P2^6;   //声明锁存器的锁存端的位
  6. sbit wela=P2^7;   //声明锁存器的锁存端的位
  7. sbit key1=P3^4;   //声明第一个按键的位
  8. uchar num;        //定义一个unsigned char型变量num,用来计数(记下按键的次数,不过最多到9)
  9. uchar code table[]={   
  10. 0x3f,0x06,0x5b,0x4f,
  11. 0x66,0x6d,0x7d,0x07,
  12. 0x7f,0x6f,0x77,0x7c,
  13. 0x39,0x5e,0x79,0x71};
  14. void delay(uint z);     //延时函数声明
  15. void main()
  16. {
  17.        wela=1;       //打开位选锁存端
  18.        P0=0xfe;     //选定第一个数码管工作
  19.        wela=0;   //关闭位选锁存端
  20.        P3=0xff;     //初始化P3的8个口的电平为高电平
  21.        while(1)     //进入死循环,扫描按键
  22.       {
  23.                if(key1==0)    //检测第一个按键是否按下去了,这里是如果按下去了
  24.                {
  25.                        delay(5);   //延时5ms,来消除按下去的抖动,也就是让这5ms啥都不做,一直到稳定电平
  26.                        if(key1==0) //再次检测是否按下去了,这里是如果确实是人给按下去了的话,不是其他的干扰信号
  27.                        {
  28.                                  d1=0;    //点亮第一个发光二极管
  29.                                  num++;   //同时num自加1
  30.                                  if(num==10)  //判断是否加到了10,因为一个数码管最多只能显示0-9
  31.                                          num=0;   //重新赋值num=0
  32.                         }
  33.                         while(!key1);     //松手
  34.                         delay(5);   //消除松手的抖动
  35.                         while(!key1);  //稳定时候的松手检测,跳出执行else后面的语句
  36.                }
  37.               else
  38.                        d1=1;
  39.              dula=1;             //数码管显示num
  40.              P0=table[num];
  41.              dula=0;
  42.      }
  43. }
  44. void delay(uint z)    //延时程序
  45. {
  46.       uint x,y;
  47.       for(x=z;x>0;x--)
  48.            for(y=110;y>0;y--);
  49. }

复制代码


上面的这个程序实现的是:刚开始的时候第一个发光二极管没有点亮且第一个数码管显示的是0,然后是独立键盘按键的检测,当我们按下第一个键后num的值变为1,且发光二极管点亮,松开手后数码管显示的就是1,然后发光二极管熄灭。第二次按下去的时候num的值变为2,且发光二极管点亮,松开手后数码管显示的就是2.。

来支持的

:P

发个资料文件
这样看的不舒服

说的还不错吗,

顶一个

  顶一个,这个问题困扰我很久了,如梦初醒,谢谢分享

谢谢小编分享

我用的是来科5单片机,是独立按键,可是将上面的程序写进去为什么没有反应,数码管也不亮

应该是缺少使能端吧

如梦初醒,谢谢分享

简单直接

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top