当前位置: 首页 > article >正文

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(); //调用广告灯移动函数
}
}


http://www.kler.cn/a/303767.html

相关文章:

  • 简易入手《SOM神经网络》的本质与原理
  • DIP switch是什么?
  • 【机器学习】如何配置anaconda环境(无脑版)
  • Docker compose部署portainer
  • 软件测试:测试用例详解
  • 性能测试|JMeter接口与性能测试项目
  • 【原创教程】电气电工18:三大品牌的IO_LINK
  • Leetcode 每日一题:Count Complete Tree Nodes
  • webpack打包原理
  • QT 串口上位机读卡显示
  • DMA与AXI DMA ip
  • PMP–一、二、三模–分类–14.敏捷–技巧–敏捷团队通才型专家
  • Golang数据流处理:掌握Reader和Writer接口的技巧
  • 信息系统容灾等级
  • 【docker】docker network 网络
  • C++数据结构
  • STM32 HAL freertos零基础(九)任务通知
  • 【Python深度学习】逆强化学习(IRL):通俗揭开学习背后的奥秘
  • vue devtools的使用
  • 外包干了3天,技术退步明显.......
  • Apache DataFusion查询引擎简介
  • 0to1使用Redis实现“登录验证”次数限制
  • 【面试题】什么是代理以及如何实现代理
  • shader 案例学习笔记之将坐标系分成4个象限
  • JVM面试真题总结(八)
  • 浅谈WebApi