C51
按键检测原理
- 当按键未摁下时,输入芯片引脚的电平为高电平;按键摁下时,输入芯片引脚的电平为低电平
- 因此,通过使用以下代码首先对KEY1进行位定义,检测对应P3.2引脚电平是否为低电平,即可判断摁键是否被摁下
sbit KEY1 = P3.2; // 定义按键KEY1 if (0 == KEY1) // 判断按键是否被摁下 { ......按键摁下处理 }
按键去抖处理
- 在开关切换的瞬间,在接触点会出现来回弹跳的现象,这种现象被称为抖动
- 当单片机连接到按键的引脚上第一次检测到低电平时,先等待50ms,若低电平持续时间小于50ms,则将该输入信号视为抖动。若50ms后检测该引脚的电平仍为低电平,则判断为按键有效摁下
- 对应的去抖代码如下
if (0 == KEY1) // 第一次检测到KEY1按键被摁下 { DelayNms(50); // 等待约50ms后再次检测按键是否被摁下,消除按键抖动带来的影响 if (0 == KEY1) { ...... // 确定按键被摁下,执行按键被摁下时的响应代码 } else if (1 == KEY1) { ...... // 按键没有被摁下 } }
实例与代码解析
- 包含头文件
#include
- 位定义按键和LED
sbit KEY1 = P3 ^ 2; // 定义按键KEY1 sbit KEY2 = P3 ^ 3; sbit KEY3 = P3 ^ 4; sbit LED1 = P2 ^ 4; // 定义LED1 sbit LED2 = P2 ^ 5; sbit LED3 = P2 ^ 6;
- 编写延时函数
static void DelayNms(int nms); // 内部函数声明 static void DelayNms(int nms) { unsigned int i, j; for (i = 0; i
- 编写主函数
void main() { LED1 = 0; // 打开LED1 LED2 = 0; LED3 = 0; while (1) { if (0 == KEY1) // 第一次检测到KEY1按键被摁下 { DelayNms(50); // 等待约50ms后再次检测按键是否被摁下,消除按键抖动带来的影响 if (0 == KEY1) { LED1 = ~LED1; // 对LED1状态取反,改变LED1的亮灭状态 while (0 == KEY1); // 等待按键被弹起 } } if (0 == KEY2) { DelayNms(50); if (0 == KEY2) { LED2 = ~LED2; while (0 == KEY2); } } if (0 == KEY3) { DelayNms(50); if (0 == KEY3) { LED3 = ~LED3; while (0 == KEY3); } } } }
(图片来源网络,侵删)(图片来源网络,侵删)(图片来源网络,侵删)
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。
还没有评论,来说两句吧...