前言
通过C51单片机操控键盘在很多设计中都会用到,如如果要设计一个密码锁。如果没有掌握按键的使用,那么就真的没有办法实现了。今天这篇文章就系统的说一下,按键程序的原理和实现。
按键工作原理
目前我们在开发板上使用的按键有两种接线方式:
- 1、独立按键
- 2、矩阵键盘
轻触开关
轻触开关是一种电子开关,使用时,轻轻按开关就可使开关接通,当松手时,开关断开。如图:
按键消抖
在实际写程序的时候还要考虑另一个问题就是抖动。当我们按下按键开关的时候其实会产生电平上下抖动。如下图这种情况:
如果我们不考虑抖动,就会检测到多次开关按下,但实际上我们就按下一次,那么我们当然不想这种事情的发生。因此我们需要考虑如何消除抖动。
消除抖动的方法也分为两种,一种是采用高精度的按键,这样可以有效的减少抖动。但是我们一般采取的是第二种,通过软件的方式来消除抖动。通过上面的图上我们可以看到,波形只有在两端的时候会产生抖动,那么我们就利用这个特点添加一个延时,去除前面那一段时间,也就是当按键按下那一刻延时一段时间后再去检测电平变化。这样就可以完美的解决这个问题了。
1)独立按键
独立按键相对来说是比较简单的,使用的就是上面介绍的轻触开关,我们通过原理图进行讲解:
我们可以看到图上有四个开关,分别为K1、K2、K3、K4,它们的一端连接的都是GND,另一端分别连接在了RXD(P3.1)、TXD(P3.0)、P32、P33,几个引脚上。
当我们按下开关后,对应的引脚就会显示低电平。我们通过主程序中的循环,来检测对应的引脚电平的变化,来判断开关是否按下,从而完成对应的操作。
程序流程:
下面我们通过一个独立按键程序来看一下:(完整程序可独立运行)
/*******************************************************************************
* 实验名 : 左右流水灯实验
* 使用的IO : LED使用P2,键盘使用P3.1
* 实验效果 : 按下K1键,
* 注意 :
*******************************************************************************/
#include<reg51.h>
#include<intrins.h>
#define GPIO_LED P2
sbit K1=P0^0;
void Delay10ms( ); //延时10ms
/*******************************************************************************
* 函数名 : main
* 函数功能 : 主函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void main(void)
{
unsigned int i,j;
j=0x01;
while(1)
{
GPIO_LED=j;
if(K1==0) //检测按键K1是否按下
{
Delay10ms(); //消除抖动
if(K1==0)
{
j=_cror_(j,1);//1000 0000
while((i<50)&&(K1==0)) //检测按键是否松开
{
Delay10ms();
i++;
<