单片机Day07---独立按键实验

[复制链接]
发表于 2025-9-26 04:32:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目次
一、原理图: 
二、思绪梳理:
三、一些分析:
1.界说独立按键控制脚:
2.利用宏界说独立按键按下的键值:#define KEY1_PRESS    1#define KEY2_PRESS    2#define KEY3_PRESS    3#define KEY4_PRESS    4#define KEY_UNPRESS    0
3.key_scan 函数:
4.按键状态: 
5.按键扫描模式:
6.消抖:
7.key为0:
8.返回值标题:
9.调用key_scan 函数:
四、步伐实现:



一、原理图: 


二、思绪梳理:

1.独立按键控制角
2.LED灯控制角
3.独立按键键值
4.延时函数
5.独立按键扫描函数
6.主函数
三、一些分析:

1.界说独立按键控制脚:

 sbit KEY1=P3^1;
 sbit KEY2=P3^0;
 sbit KEY3=P3^3;
 sbit KEY4=P3^4;
2.利用宏界说独立按键按下的键值:
#define KEY1_PRESS    1
#define KEY2_PRESS    2
#define KEY3_PRESS    3
#define KEY4_PRESS    4
#define KEY_UNPRESS    0


#define KEY1_PRESS 1 :将 KEY1_PRESS 界说为 1 ,表现按键 K1 按下时,步伐中用 KEY1_PRESS 这个标识符代表其键值 。当步伐检测到 K1 按键被按下,key_scan 函数会返回 KEY1_PRESS ,即返回 1 。
下面会有key_scan 函数。
3.key_scan 函数:

  1. u8 key_scan(u8 mode)
复制代码


  • mode 是函数的参数,用于控制按键扫描的模式:

    • 当 mode 为 0 时,表现单次扫描按键,即按键按下一次,函数只返回一次键值,直到按键开释后才气再次触发。
    • 当 mode 为 1 时,表现一连扫描按键,即只要按键不绝按下,函数会不停返回对应的键值。


4.按键状态: 

key 用于记载按键的状态,初始值为 1,表现按键处于未按下状态。肯定要分清,key为1就是未按下,以是一开始要设置key=1.
KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0 表现检测是否有恣意一个按键被按下。在硬件电路中,按键按下时对应的引脚电平通常为低电平(0)。
将 key 置为 0,表现按键已经被按下。
key 是在 key_scan 函数中界说的静态变量(static u8 key = 1;),它的作用是标记当前按键检测的状态。key 的值只有 1 和 0 两种情况:


  • 当 key 为 1 时,意味着当前按键处于未被按下大概已经开释的状态,步伐可以开始检测是否有新的按键按下变乱。
  • 当 key 为 0 时,表明按键已经被按下,而且还未开释,在这种状态下,步伐不会再次对按键按下变乱举行检测,以此制止重复触发按键相应。
岂论key照旧单个按键,都是为0的时间是被按下。key标记当前按键检测的状态,key为1表现可以检测按键状态。
5.按键扫描模式:

一连扫描模式:当 mode 参数为非零值(一样寻常设为 1)时,if(mode) 条件满足,会实验 key = 1;。这意味着不管当前按键状态怎样,都会把 key 置为 1,即允许函数再次检测按键按下变乱。在这种模式下,只要按键不绝被按着,key_scan 函数每次被调用时都会去查抄按键状态,一旦检测到按键按下,就会返回相应键值,告竣一连扫描的效果。
单次扫描模式:当 mode 参数为 0 时,if(mode) 条件不创建,key 的值不会被欺压置为 1。这就包管了只有在按键开释(key 变为 1)之后,再次按下按键才会被检测到。在这种模式下,按键按下一次,函数仅返回一次键值,实用于只必要相应一次按键按下变乱的场景,好比开关控制。
笨人明白:
在一连扫描模式下,可以举行长按,得到的效果就是长按想要的。
在单次扫描模式下,举行长按时,只会算一次效果,并不能到达长按的想要的状态。
6.消抖:

在检测到有按键按下后,步伐先调用 delay_10us(1000); 举行延时消抖,然后再次检测按键状态,若按键仍旧处于按下状态,就判断为有效按键按下变乱,并返回对应的键值。
7.key为0:

当检测到有按键按下,而且颠末消抖处置惩罚确认是有效按下变乱之后,将 key 置为 0。在按键开释之前,由于 key 已经是 0,if (key == 1 && ...) 这个条件就不会创建,函数不会再次判断按键按下,如许就制止了在按键一连按下的过程中对同一变乱举行重复检测。
8.返回值标题:

将 return KEY_UNPRESS; 放在 else if 语句块外貌,是为了确保函数在没有检测到有效按键按下变乱时,可以或许有一个明白的默认返回值。
9.调用key_scan 函数:

调用 key_scan 函数举行按键扫描,0 作为参数通报给 key_scan 函数,表现利用单次扫描模式。在单次扫描模式下,按键按下一次,函数只返回一次键值,直到按键开释后才气再次触发。
四、步伐实现:

#include <REGX51.H>
 typedef unsigned int u16;
 typedef unsigned char u8;
 sbit KEY1=P3^1;
 sbit KEY2=P3^0;
 sbit KEY3=P3^3;
 sbit KEY4=P3^4;
 sbit LED=P2^0;
 #define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0
void delay_10us(u16 t)
{
while(t--);
}
u8 key_scan(u8 mode)
{
static u8 key=1;
if(mode)key=1;
if (key==1&(KEY1==0||KEY2==0||KEY3==0||KEY4==0)    )
{
delay_10us(1000);
key=0;
if(KEY1==0)
return KEY1_PRESS;
else if(KEY2==0)
return KEY2_PRESS;
else if(KEY3==0)
return KEY3_PRESS;
else if(KEY4==0)
return KEY4_PRESS;
}
else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)
{
key=1;
}
return KEY_UNPRESS;
}
void main( )
{
u8 key=0;
while(1)
{
  key=key_scan(0);
  if (key==KEY1_PRESS)
  {
  LED=!LED;
  }
  }
  }
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表