一、原理部分
我们这里使用独立按键,所以J5跳线帽连接2和3。此时S7-S4为独立按键,按键左侧连在一起接地,右侧则分别对应P30-P33。当按键按下时,导线联通,按键对应的IO口则会被拉低为低电平,所以我们只需要检测哪一个IO口为低电平,即可知道哪一个按键按下了。
机械按键在按下的时候存在抖动现象,我们这里采用延时消抖,即按键按下时,判断一次对应IO是否为低电平,延时一段时间后再次判断是否为低电平,如果还是低电平则说明按键确实是按下了。松开按键时,对应的IO口会变成高电平,以此来进行松手检测。
独立键盘还有其他的扫描方式如三行代码。三行代码搞定独立按键
二、代码部分
实验平台:CT107D
实验芯片:stc15f2k60s2
实验现象:S7打开继电器,S6关闭继电器
代码如下
#include "stc15f2k60s2.h"
#include "intrins.h"
sbit relay = P0^4; //位定义继电器
sbit buzz = P0^6; //位定义蜂鸣器
sbit key_1 = P3^0; //位定义按键S7
sbit key_2 = P3^1; //位定义按键S6
void Delay5ms() //定义5ms延时函数
{
unsigned char i, j;
i = 54;
j = 199;
do
{
while (--j);
} while (--i);
}
void close_buzz() //蜂鸣器上电默认高电平,所以关闭蜂鸣器
{
P2=0xa0;
buzz = 0;
P2=0x00;
}
void main()
{
close_buzz();
if(key_1 == 0) //判断按键按下
{
Delay5ms(); //延时5ms消除抖动
if(key_1 == 0) //确定按键按下,执行按键功能
{
P2=0xa0;
relay = 1;
P2=0x00;
}
while(!key_1); //松手检测
}
if(key_2 == 0)
{
Delay5ms();
if(key_2 == 0)
{
P2=0xa0;
relay = 0;
P2=0x00;
}
while(!key_2);
}
}