51单片机——独立键盘输入

一.认识按键

在这里插入图片描述
如上图所示为直插式按键,按下按键后松手按键立即弹起。有4个引脚,可以看出4各引脚每两个向内弯曲,弯曲的对立面两个引脚导通,其余不导通。即1和4之间是导通的,2和3之间是导通的,而1和2,3和4之间是不导通的,只有按下按键才能使其导通。

二.P3口的第二功能

在不使用第二功能时它就是普通的I/O口。
P3口第二功能表

引脚 第二功能
P3.0 RxD:串行口接收数据输入端
P3.1 TxD:串行口发送数据输出端
P3.2 TNT0:外部中断申请输入端0
P3.3 TNT1:外部中断申请输入端1
P3.4 T0:外部计数脉冲输入端0
P3.5 T1:外部计数脉冲输入端1
P3.6 WR:写外设控制信号输出端
P3.7 RD:读外设控制信号输出端

三.按键消抖

键盘软件消抖

按键一般是利用机械触点的闭合、断开作用,由于机械触点的弹性作用,在其闭合、断开瞬间均有抖动过程,抖动时间一般在5一10mS,稳定闭合时间由操作人员的按键动作决定,一般为零点几秒到几秒。为了保证单片机对一次闭合,仅作一次键输入操作,必须在编程时候编写必要的程序代码来去除抖动影响,称键盘软件消抖。

判断键一次按下的具体方法

先判断键是否按下,若按下了延时10 ms,跳过按下抖动期,然后再判断按键是否按下,若是说明按键真的按下了,否则说明是干扰信号,如果键真的按下了,则等待键释放,如果键释放了,延时10 ms,再判断键是否释放,若释放了,说明按键真的释放了,否则说明是干扰信号,如果按键真的释放了,说明一次完整的按键过程完成了。在一次完整的按键后,可以连接该键对应的功能程序段,以实现特定的功能。
在这里插入图片描述

硬件消抖

利用电容的放电延时,采用并联电容法,电路图如下所示:
在这里插入图片描述
除了利用电容进行消抖,也可利用RS触发器:
在这里插入图片描述

四.程序流程图(程序思路)

Created with Raphaël 2.2.0检测按键是否按下延时消抖检测按键是否按下执行按键按下之后要执行的程序检测按键是否松手
Created with Raphaël 2.2.0开始键是否按下?延时10ms 键是否按下? 键是否释放?延时10ms 键是否释放?执行改键对应的功能程序段 结束yesnoyesnoyesnoyesno

五.实现代码与电路

1.一个按键控制两个LED灯

按键按下后,两个灯亮起,按键松开,灯灭
代码

 //独立键盘输入
 #include<reg51.h>
 sbit led1=P1^0;  //red
 sbit led2=P1^1;  //red
 sbit k1=P3^4;
 void main()
 {
 P1=0xff;   //熄灭所有LED灯
 while(1)
 {
    if(k1==0)  
    {
    led1=0;
    led2=0;
    }
    else
    {
    led1=1;
    led2=1;
    }
 }
 }

电路原理图
在这里插入图片描述

2.四个按键控制八个LED灯

按键按下后,两个灯亮起,按键松开,灯灭,以此对应4个按键
代码

 //独立键盘输入
 #include<reg51.h>
 sbit led1=P1^0;  //red
 sbit led2=P1^1;  //red
 sbit led3=P1^2;  //blue
 sbit led4=P1^3;  //blue
 sbit led5=P1^4;  //yellow
 sbit led6=P1^5;  //yellow
 sbit led7=P1^6;  //green
 sbit led8=P1^7;  //green
 sbit k1=P3^4;
 sbit k2=P3^5;
 sbit k3=P3^6;
 sbit k4=P3^7;
 void main()
 {
  P1=0xff; 
 while(1)
 {
  /*  if(k1==0)  
    {
    led1=0;
    led2=0;
    }
    else
    {
    led1=1;
    led2=1;
    }
    if(k2==0)   
    {
    led3=0;
    led4=0;
    }
    else
    {
    led3=1;
    led4=1;
    }if(k3==0)
    {
    led5=0;
    led6=0;
    }
    else
    {
    led5=1;
    led6=1;
    }if(k4==0)  
    {
    led7=0;
    led8=0;
    }
    else
    {
    led7=1;
    led8=1;
    }   */
    //优化之后
   led1=k1;
   led2=k1;
   led3=k2;
   led4=k2;
   led5=k3;
   led6=k3;
   led7=k4;
   led8=k4;
 }
 }

电路原理图
在这里插入图片描述

3.利用按键改变LED灯的状态

按下第一个按键,松开按键后,第一个LED灯改变状态
因为此时要不管检测是否有按下,因此要加防消抖编程代码
代码

#include<reg51.h>
#include"delay.h"
sbit led1=P1^0;
sbit k1=P3^4;
void main()
{
  P1=0xff;
  while(1)
  {
  if(k1==0)    //判断是否有按下按键的信号
  {
  delay(10);  //延时10ms,消抖
    if(k1==0) //再次判断按键是否被按下
    {
    while(k1==0);  //直到按键判断松开,此处若k1==0,按键一直按下,则在此处程序死循环
    led1=~led1;  //取反即改变状态
    }
  }
  }
}

电路原理图
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章