一.认识按键
如上图所示为直插式按键,按下按键后松手按键立即弹起。有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触发器:
四.程序流程图(程序思路)
五.实现代码与电路
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; //取反即改变状态
}
}
}
}
电路原理图