C51单片机-单按键输入识别,键盘消抖

【实验目的】

独立按键的识别方法、键盘消抖等。

【实验现象】

每按一次独立键盘的S2键,与P1口相连的八个发光二极管中点亮的一个往下移动一位。

【实验说明】

关于按键去抖动的解释,我们在手动按键的时候,由于机械抖动或是其它一些非人为的因素很有可能会造成误识别,一般手动按下一次键然后接着释放,按键两片金属膜接触的时间大约为50ms左右,在按下瞬间到稳定的时间为5-10ms,在松开的瞬间到稳定的时间也为5-10ms,如果我们在首次检测到键被按下后延时10ms左右再去检测,这时如果是干扰信号将不会被检测到,如果确实是有键被按下,则可确认,以上为按键识别去抖动的原理。

【硬件电路】

【程序代码】(程序源码在本博客资源里边,可自行下载使用)

//独立按键的识别方法、键盘消抖等。

//现象:每按一次独立键盘的S2键,与P1口相连的八个发光二极管中点亮的一个往下移动一位。

#include <reg52.h>

sbit BY1=P3^5; //定义按键的输入端S2键

unsigned char count; //按键计数,每按一下,count 加1

unsigned char temp;

unsigned char a,b;

void delay10ms(void) //延时程序

{

unsigned char i,j;

for(i=40;i>0;i--)

for(j=248;j>0;j--);

}

key() //按键判断程序

{

if(BY1=0)

//此处实际代码为if()判断P3^4口的状态 是否为0 (此编译器不支持)

//判断是否按下键盘,当单片机上电时所有IO 口为高电平,

//S2键一端接地另一端接P3.4,所以当键被按下时P3.4口直接接地,

//此时检测P3.4肯定为低电平。

{

delay10ms(); //延时,软件去抖动干扰

if(BY1=0) //此处实际代码为if()判断P3^4口的状态 是否为0 (此编译器不支持)//再次检测确认按键按下

{

count++; //按键计数加1

if(count=8) //计8次重新计数 //此处实际代码为判断count变量是否为8

{

count=0; //将count清零

}

}

while(BY1==0); //等待按键释放,如果键未释放则一直在此等待。

}

}

move() //广告灯向下移动移动函数

{

a=temp<<count; //这三句为一个循环移位

b=temp>>(8-count);

P1=a|b;

}

main()

{

count=0; //初始化参数设置

temp=0xfe;

P1=0xff;

P1=temp;

while(1) //永远循环,扫描判断按键是否按下

{

key(); //调用按键识别函数

move(); //调用广告灯移动函数

}

}

相关推荐
xiangw@GZ2 分钟前
SD / eMMC / SDIO 总线接口技术对比
单片机·嵌入式硬件
新晨单片机设计5 分钟前
S030D-WIFI空气净化器(温湿度、甲醛、空气质量)【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus·空气净化器
知识分享小能手27 分钟前
C学习教程,从入门到精通,C语言单片机基础 — 完整知识点手册(19)
c语言·单片机·学习
笨笨饿1 小时前
#143_屏幕画撕裂的问题及解决方法
linux·stm32·单片机·嵌入式硬件·mcu·lvgl·嵌入式实时数据库
李永奉1 小时前
杰理可视化SDK开发-音频录制功能使用教程
笔记·单片机·嵌入式硬件·mcu·物联网·音视频
_YouziTech_1 小时前
【STM32+MAX98357】MP3转PCM存入Flash并控制音频输出
stm32·单片机·音视频·内存·pcm·i2s·wav
沐欣工作室_lvyiyi1 小时前
基于STM32的老人跌倒与防走失报警系统设计与实现(论文+源码)
stm32·单片机·嵌入式硬件
我叫洋洋1 小时前
Allegro 画布“垃圾显示“清理指南:把板子调成干净工作台(实战总结)
c语言·c++·单片机·嵌入式硬件·eda·嘉立创
xiangw@GZ1 小时前
SPI Flash 接口模式与 XIP 技术详解
单片机·嵌入式硬件
沐欣工作室_lvyiyi2 小时前
基于STM32的人体健康检测设计(论文+源码)
stm32·单片机·嵌入式硬件