目录

一、键盘、微动开关概述

二、按键工作原理

(1)按键构成

(2)(蓝桥杯开发板)独立按键电路图(非实际,参考理解)

(3)独立按键工作原理

三、单片机I/O口-输入

四、按键例程

(0)开发板设置

(1)例程1:按键控制LED点亮或熄灭(本例以按下S7按键打开L1灯,按下S6按键打开L2灯)

(2)例程2:按键控制LED点亮或者熄灭。本例以按下S7按键打开L1灯,按下S6按键打开L2灯按下s5按键打开L5灯,按下S6按键关闭L5灯为例。

(3)例程3:按键控制流水灯移位(一)。本例以S7按键每按下一次LED向右移动1位。 注:多次检测此程序,观察此程序存在的问题

(4)例程4:按键控制流水灯移位(二)。本例以S7按键每按下一次LED向右移动1位 注:此程序已加入按键消抖、LED效果为按键按下执行,

(5)例程5:按键控制流水灯移位(三)。本例以S7按键每按下一次LED向右移动1位 注:此程序已加入按键消抖、LED效果为按键松开执行,


一、键盘、微动开关概述

  • 键盘分编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘;
  • 而靠软件编程来识别的称为非编码键盘;
  • 在单片机组成的各种系统中,用的最多的是非编码键盘。也有用到编码键盘的。
  • 非编码键盘有分为:独立键盘和行列式(又称为矩阵式)键盘。

二、按键工作原理

(1)按键构成

微动开关是具有微小接点间隔和快动机构,用规定的行程和规定的力进行开关动作的接点机构用外壳覆盖,其外部有驱动杆的一种开关,因为其开关的触点间距比较小,故名微动开关,又叫灵敏开关、触动开关、轻触开关。
【蓝桥杯单片机入门记录】独立按键-LMLPHP

(2)(蓝桥杯开发板)独立按键电路图(非实际,参考理解)

【蓝桥杯单片机入门记录】独立按键-LMLPHP

【蓝桥杯单片机入门记录】独立按键-LMLPHP



(3)独立按键工作原理

【蓝桥杯单片机入门记录】独立按键-LMLPHP

按键在闭合和断开时,触点回存在抖动现象;涉及后续(软件)消抖

三、单片机I/O口-输入

【蓝桥杯单片机入门记录】独立按键-LMLPHP

【蓝桥杯单片机入门记录】独立按键-LMLPHP

【蓝桥杯单片机入门记录】独立按键-LMLPHP

四、按键例程

(0)开发板设置

  • J13跳线帽:IO模式
  • J5跳线帽:BIN模式(独立按键)

(1)例程1:按键控制LED点亮或熄灭(本例以按下S7按键打开L1灯,按下S6按键打开L2灯)

//头文件声明区域
#include <STC15F2K60S2.H>

//变量声明区域


//函数定义区域


//程序主体
void main()
{
	P2 = 0XA0;
	P0 = 0X00;
	P2 = 0X80;
	P0 = 0XFF;
	
	while(1)
	{
		if(P30 == 0) P00 = 0;
		if(P31 == 0) P01 = 0;
		
		
		
	}
	
	
}

(2)例程2:按键控制LED点亮或者熄灭。本例以按下S7按键打开L1灯,按下S6按键打开L2灯按下s5按键打开L5灯,按下S6按键关闭L5灯为例。

//头文件声明区域
#include <STC15F2K60S2.H>

//变量声明区域
sbit S4 = P3^3;
sbit S5 = P3^2;
sbit L5 = P0^4;

//函数定义区域


//程序主体
void main()
{
	P2 = 0XA0;
	P0 = 0X00;
	P2 = 0X80;
	P0 = 0XFF;
	
	while(1)
	{
		if(P30 == 0) P00 = 0;
		if(P31 == 0) P01 = 0;
		if(S5 == 0) L5 = 0;
		if(S4 == 0) L5 = 1;
		
		
		
	}
	
	
}

(3)例程3:按键控制流水灯移位(一)。本例以S7按键每按下一次LED向右移动1位。 注:多次检测此程序,观察此程序存在的问题

//头文件声明区域
#include <STC15F2K60S2.H>

//变量声明区域
unsigned char LED = 0;
//函数定义区域



//程序主体
void main()
{
	P2 = 0XA0;
	P0 = 0X00;
	P2 = 0X80;
	P0 = 0XFF;
	
	while(1)
	{
		if(P30 == 0)
		{
			P0 = ~(0x01<<LED);
		  LED++;
		  if(LED == 8) LED = 0;
		
			
		}
					

		
		
	}
	
	
}
//存在的问题:按下按键后,由于程序执行的太快,现象不明显

(4)例程4:按键控制流水灯移位(二)。本例以S7按键每按下一次LED向右移动1位 注:此程序已加入按键消抖、LED效果为按键按下执行

//头文件声明区域
#include <STC15F2K60S2.H>

#include<intrins.h>
//变量声明区域
unsigned char LED = 0;
//函数定义区域
void Delay(unsigned int time)		//@11.0592MHz
{
	unsigned char i, j;
 while(time--)
 {
	 	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
 }

}



//程序主体
void main()
{
	P2 = 0XA0;
	P0 = 0X00;
	P2 = 0X80;
	P0 = 0XFF;
	
	while(1)
	{
		if(P30 == 0 )
		{
			Delay(10);//消抖
			
			if(P30 == 0)
			{
				P0 = ~(0x01<<LED);
				LED++;
				if(LED == 8) LED = 0;
				
			}
		while(!P30);//一直在读取P30的状态,程序不会往下进行,知道松开手
		Delay(10);//消抖
		while(!P30);
		
		}
		
		
	}
	
	
}

(5)例程5:按键控制流水灯移位(三)。本例以S7按键每按下一次LED向右移动1位 注:此程序已加入按键消抖、LED效果为按键松开执行

//头文件声明区域
#include <STC15F2K60S2.H>
#include<intrins.h>
//变量声明区域
unsigned char LED = 0;
unsigned char S7_Flag = 0;
//函数定义区域
void Delay(unsigned int time)		//@11.0592MHz
{
	unsigned char i, j;
 while(time--)
 {
	 	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
 }

}



//程序主体
void main()
{
	P2 = 0XA0;
	P0 = 0X00;
	P2 = 0X80;
	P0 = 0XFF;
	
	while(1)
	{
		if(P30 == 0)
		{
			Delay(10);//消抖
			if(P30 == 0)
			{
			S7_Flag = 1;
			}
			while(!P30);
			
		}
		

		
		if(S7_Flag == 1)
		{
			S7_Flag = 0;
			P0 = ~(0x01<<LED);
			LED++;
			if(LED == 8) LED = 0;
			
		}
			
		
	}
	
	
}
02-22 03:50