一、电路图及分析
(部分解释参考网络,仅用于学习记录)
蓝桥杯单片机的板子将独立按键和矩阵按键结合了起来,通过一个短接片选择使用独立按键还是矩阵按键。
首先我们先看原理图的左下角绿色方框所标的地方,这里与我们板子上的短接片所对应,是选择按键工作模式的地方。
如果短接23,按键中,我们能检测到的按键就只有第一列的按键,那么按键工作模式被设置成独立按键;如果我们选择短接12,那么就可以检测到全部按键,按键工作模式被设置成矩阵按键。
当按键未被按下时,连接到单片机的I/O端口通过上拉电阻维持高电平状态;当按键被按下时,该端口被拉至低电平。单片机通过检测端口电平的变化来判断按键是否被按下。
相应的独立按键也对应着P3^0~P3^3端口。
理想中,我们摁下独立接键瞬间,我们能得到低电平,在我们松开手的瞬间,我们又得到一个高电平。但是在实际中,我们由高电平到低电平,再由低电平到高电平是需要一定的变化时间的,很短但是存在。
同样,为了避免因按键接触不良或外界干扰造成的误操作,通常会采用软件去抖动的方法。这通常涉及到检测到按键状态变化后,延时一段时间再次检测,以确认按键是否真的被按下。
根据不同的题目要求,独立按键的状态也要作出相应的变化。有的题目要求摁下时是一个状态,松开是另外一个状态。有的题目则只要求摁下是什么状态。
二、代码
#include "reg52.h" //定义51单片机特殊功能寄存器
/** 独立按键接口 */
sbit S7 = P3 ^ 0;
sbit S6 = P3 ^ 1;
sbit S5 = P3 ^ 2;
sbit S4 = P3 ^ 3;
void delay5ms()
{
unsigned char i,j;
i=54;
j=199;
do
{
while(--j);
}while(--i);
}
void cls_buzz(void)
{
P2 = (P2 & 0x1F | 0xA0);
P0 = 0x00;
P2 &= 0x1F;
}
//主函数
void main(void)
{
cls_buzz();
while(1)
{
if(S7 == 0)//如果S7被摁下
{
delay5ms();//延时消抖
if(S7 == 0)//确认S7被摁下
{
//输入你想进行的操作(摁下独立按键时)
while(S7 == 0);∥如果按键一直被摁下,状态不改变
//输入你想进行的操作(松开独立按键时)
}
}
if(S6 == 0)
{
delay5ms();//延时消抖
if(S6 == 0)//确认S6被摁下
{
//输入你想进行的操作(摁下独立按键时)
while(S6 == 0);
//输入你想进行的操作(松开独立按键时)
}
}
if(S5 == 0)
{
delay5ms();//延时消抖
if(S5 == 0)//确认S5被摁下
{
//输入你想进行的操作(摁下独立按键时)
while(S5 == 0);
∥输入你想进行的操作(松开独立按键时)
}
}
if(S4 == 0)
{
delay5ms();//延时消抖
if(S4 == 0)//确认S4被摁下
{
//输入你想进行的操作(摁下独立按键时)
while(S4 == 0);
∥输入你想进行的操作(松开独立按键时)
}
}
}
}
以上就是我们独立按键的基本控制的代码,下一节我会给出具体的例子。
标签:P3,delay5ms,S7,3.1,51,独立,while,按键,基本操作 From: https://blog.csdn.net/2301_81325637/article/details/142731133