51单片机入门教程(4)——按键控制


单片机与外界的信息交互主要有两大类,输入信息和输出信息。
之前的博客介绍了通过单片机控制LED灯和数码管向外界输出信息,该教程介绍单片机常用的输入设备——独立按键和矩阵键盘。

一、独立按键

1.1 独立按键的原理

独立按键一共有四个针脚,两个短针脚之间默认不导通,两个长针脚之间默认导通。实物图如图:
在这里插入图片描述

1.2 独立按键的仿真电路

在Proteus中对按键进行了简化,只有两个接线针脚。按键的一端接到单片机的IO口上,另一端与GND连接。当按键按下时,单片机的IO口与GND连接,端口电平被拉低。因此通过读取端口电平即可获知按键状态。
仿真电路如图:
在这里插入图片描述

1.3 按键消抖

关于按键抖动
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。即单片机在按键被按下的一瞬间检测到的信号是很多次的忽高忽低的电平信号,如图:
在这里插入图片描述
这种信号是不稳定的。因此,我们需要使用按键消抖的算法使单片机获取到正常稳定的信号。
为了避免在最不稳定的时候采集信号,常用的操作是延时,即当检测到低电平输入时,延时若干时间(常用20ms),再次采集信号,如果仍是低电平,则为按键被按下。
示例程序如下:

/**************************
* 说明: 按键被按下时led灯灭
**************************/
#include <reg52.h>
#define uint unsigned int 
#define uchar unsigned char
//定义按键端口
sbit key = P1^0;
//定义LED灯端口
sbit led = P2^0;
//延时函数声明
void delay(uint xms);
//程序入口
void main(){
   
  while(1){
   
    //第一次判断
    if(key == 0){
   
	  //延时20ms 消除抖动
	  delay(20);
	  //第二次判断
	  if(key == 0){
   
	    led = 0;	  //灯灭
	  }
	  else {
   
	    led = 1;	  //灯亮
	  }
	  //等待按键被松开
	  while(!key);  //当按键未松开时,key为0,执行该死循环。
	}
  }
}
void delay(uint xms)
{
   
  uint i,
  • 121
    点赞
  • 531
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
要使用51单片机控制4x4矩阵按键,你需要了解以下几个步骤: 1. 连接硬件:将4x4矩阵按键连接到51单片机的I/O口,需要使用8个I/O口进行连接,其中4个I/O口连接行,4个I/O口连接列。 2. 初始化:初始化I/O口为输入模式,将所有行I/O口设置为高电平状态,所有列I/O口设置为低电平状态。 3. 扫描:在扫描过程中,首先将所有行I/O口置为低电平状态,然后依次扫描每一列,如果某个按键被按下,则相应的行I/O口与列I/O口会连接,这时候该行I/O口会被拉低,我们可以通过检测行I/O口的状态来判断是否有按键按下。 4. 处理:对于每一个被按下的按键,我们需要进行相应的处理,例如发送数据或者执行某个操作等。 以下是一个简单的代码示例: ```c #include <reg51.h> #define KEY_PORT P1 void main() { unsigned char key_code[] = {0xee, 0xde, 0xbe, 0x7e}; unsigned char row, col, i, j; while(1) { for(col = 0; col < 4; col++) { KEY_PORT = 0x0f ^ (1 << col); for(row = 0; row < 4; row++) { if(!(KEY_PORT & (1 << (row + 4)))) { // 处理按键事件 // 发送按键码 key_code[row * 4 + col] } } } } } ``` 在这个示例中,我们使用P1口作为输入输出口,将第0-3位用作输出控制列,将第4-7位用作输入检测行。在扫描过程中,我们依次将每一列输出低电平,然后检测每一行的输入状态,如果检测到某一行的输入为低电平,则说明该行与当前列连接的按键被按下,我们可以根据按键的位置来确定按键码,并进行相应的处理。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值