前言
本篇文章将带大家学习独立按键按键的基本操作。
独立按键式直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。
一、按键原理图
板子上面一共有4个独立按键,分别接到了P30-P33。
通过原理图可以知道当按键按下时P30-P33都接到了GND,电平为低电平,当按键没有按下时电平为高电平。
二、代码编写
这里我们需要对按键进行消抖,因为当按键按下时会发生抖动,当按键发生抖动的时候去读取按键值这个时候读出的按键值是不准确的。
在这里我们可以延时10ms等按键电平稳定的时候再去读取按键的值,这样就可以得到比较稳定的按键值了。
当按键按下时引脚的电平会发生如下图一样的抖动,所以需要等待一段时间再去读取电平数值。
#include <reg52.h> //定义独立按键控制脚 sbit KEY1=P3^1; sbit KEY2=P3^0; sbit KEY3=P3^2; sbit KEY4=P3^3; unsigned char key_val = 0; /*延时函数 单位:ms x:延时的数值 */ void delayms(unsigned int x) { unsigned char i; while(x--) { for(i=0;i<113;i++); } } unsigned char key_scan(void) { if(KEY1 == 0) { delayms(10);//延时消抖 if(KEY1 == 0) { return 0;//代表按键1按下 } while(KEY1 == 0);//等待按键松开 } else if(KEY2 == 0) { delayms(10);//延时消抖 if(KEY2 == 0) { return 0;//代表按键2按下 } while(KEY2 == 0);//等待按键松开 } else if(KEY3 == 0) { delayms(10);//延时消抖 if(KEY3 == 0) { return 0;//代表按键3按下 } while(KEY3 == 0);//等待按键松开 } else if(KEY4 == 0) { delayms(10);//延时消抖 if(KEY4 == 0) { return 0;//代表按键4按下 } while(KEY4 == 0);//等待按键松开 } } void main(void) { while(1) { key_val = key_scan();//读取按键值 } }
三、模块化管理按键
什么叫模块化编程?我的理解就是每一个模块都分别写成对应的.c和.h文件,有的人可能会问道为什么要这样写呢?这样写不是增加文件数量吗?其实模块化编程主要的好处就是代码看起来更加整洁,不会显得凌乱,而且方便移植。
这里我们创建一个key.c和key.h文件将按键代码模块化管理起来,方便我们以后的调用。
以后需要使用到按键这个模块的时候将.c和.h文件添加进入我们的工程即可。
key.c
unsigned char key_val = 0; unsigned char key_scan(void) { if(KEY1 == 0) { delayms(10);//延时消抖 if(KEY1 == 0) { return 0;//代表按键1按下 } while(KEY1 == 0);//等待按键松开 } else if(KEY2 == 0) { delayms(10);//延时消抖 if(KEY2 == 0) { return 0;//代表按键2按下 } while(KEY2 == 0);//等待按键松开 } else if(KEY3 == 0) { delayms(10);//延时消抖 if(KEY3 == 0) { return 0;//代表按键3按下 } while(KEY3 == 0);//等待按键松开 } else if(KEY4 == 0) { delayms(10);//延时消抖 if(KEY4 == 0) { return 0;//代表按键4按下 } while(KEY4 == 0);//等待按键松开 } }
key.h
下面的这些宏的作用就是防止头文件的重复包含。
#ifndef __KEY_H #define __KEY_H //定义独立按键控制脚 sbit KEY1=P3^1; sbit KEY2=P3^0; sbit KEY3=P3^2; sbit KEY4=P3^3; unsigned char key_scan(void); #endif
总结
独立按键的操作还是很简单的,主要就是要主要按键的延时消抖处理。
这里再给大家提一点:延时函数在项目开发中最好就是少使用。延时函数的大量使用会造成系统的卡顿。大家可以想一下可以使用什么方法对按键进行消抖处理。