主要参考学习资料:B站【普中官方】51单片机手把手教学视频
前置知识:C语言
单片机套装:普中STC51单片机开发板A4标准版套餐7
码字不易,求点赞收藏加关注(´•ω•̥`)
有问题欢迎评论区讨论~
独立按键
按键介绍

一个按键拥有四个脚,其中①和②、③和④之间初始导通,而①和③、②和④之间只有按下按键才会导通。
在下拉电阻作用下,按键所处管脚默认为高电平,当按下按键时线路接地变成低电平。

在实际情况中,按键的状态切换过程存在抖动,而不是在高低电平之间瞬时、稳定地切换。由于抖动过程中的电平变化会造成按键状态的误判,因此需要采取消抖措施,有软件消抖和硬件消抖两种方法:
软件消抖根据实际经验估计抖动时间在5~10ms,于是可以在检测到第一次低电平后延时10ms再次检测,若仍为低电平可认为按键已处于按下状态。
硬件消抖在电路上并联滤波电容,利用按下按键后给电容充电的时间来滤除抖动影响。
由于硬件消抖占用的电路面积较大且产生的成本较高,在实际开发应用中通常使用软件消抖。


实验5 独立按键
实现功能:通过开发板上的独立按键K1控制D1指示灯的亮灭。
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
//定义四个按键的控制管脚
sbit KEY1 = P3^1;
sbit KEY2 = P3^0;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;
//定义D1指示灯的控制管脚
sbit LED1 = P2^0;
//延时函数
void delay_10us(u16 time)
{
   
   
	while(time --);
}
/*
按键扫描函数
扫描有两种方式:一种只对按下瞬间扫描,不考虑按下后是保持还是松开(点按控制);另一种为持续扫描按键按下的状态(长按控制)
mode参数决定该函数采用哪种扫描,0为点按,1为长按
*/
u8 key_scan(u8 mode)
{
   
   
    //定义控制是否检测按下状态的变量,1检测,0不检测,注意静态变量赋值只生效一次
	static u8 key = 1;
    //如果为长按扫描则检测按下状态
	if(mode)
		key = 1;
    //如果需要检测按下状态且有按键按下(低电平),则消抖后再检测具体是哪个按键被按下
	if(key == 1 && (KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0))
	{
   
   
		key = 0; //重置key变量默认下一次不需要检测按下状态
		delay_10us(1000); //消抖
        
        //检测到哪个按键按下则返回对应的按键序号
		if(KEY1 == 0)
			return 1;
		else if(KEY2 == 0)
			return 2;
		else if(KEY3 == 0)
			return 3;
                
                  
                  
                  
                  
最低0.47元/天 解锁文章
                          
                      
      
          
                
                
                
                
              
                
                
                
                
                
              
                
                
              
            
                  
					6416
					
被折叠的  条评论
		 为什么被折叠?
		 
		 
		
    
  
    
  
            


            