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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 极狐GitLab CI/CD 作业一直处于等待状态,如何解决?
  • 用Qt 对接‌百度语音识别接口
  • Altium designer布线技巧
  • 在字节跳动干了3年网络安全工程师,网络工程师30岁以后还有企业要吗
  • 机器学习和深度学习存在显著区别
  • CentOS Stream 8 通过 Packstack 安装开源 OpenStack(V版)
  • 60. n 个骰子的点数【难】
  • 裸金属服务器怎么实现算力共享,裸金属服务器提供者怎么做,租户怎样使用,共享平台需要搭建什么
  • 深入理解Appium定位策略与元素交互
  • FISC安全対策基準
  • 网络工程师考试真题及解析
  • 代码随想录算法训练营第28天 | 第九章动态规划 part01
  • 深度解读:从新手到专业,大模型开发者知识技能养成之路
  • 大数据开发:可视化组件Redash安装部署
  • Linux df命令详解,Linux查看磁盘使用情况
  • [Vue CLI 3] 配置解析之 css.extract
  • 「面试题」如何实现一个圣杯布局?
  • 【Leetcode】104. 二叉树的最大深度
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • IDEA 插件开发入门教程
  • JavaScript对象详解
  • js递归,无限分级树形折叠菜单
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • SQLServer之创建显式事务
  • 从0到1:PostCSS 插件开发最佳实践
  • 将回调地狱按在地上摩擦的Promise
  • 利用jquery编写加法运算验证码
  • 聊聊directory traversal attack
  • 前端代码风格自动化系列(二)之Commitlint
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 使用 Docker 部署 Spring Boot项目
  • 数组的操作
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​TypeScript都不会用,也敢说会前端?
  • #NOIP 2014# day.1 T2 联合权值
  • (10)ATF MMU转换表
  • (13)Hive调优——动态分区导致的小文件问题
  • (pytorch进阶之路)扩散概率模型
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (四)事件系统
  • (算法)大数的进制转换
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET delegate 委托 、 Event 事件,接口回调
  • .net SqlSugarHelper
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 中让 Task 支持带超时的异步等待
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @软考考生,这份软考高分攻略你须知道
  • [20160902]rm -rf的惨案.txt
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [c#基础]DataTable的Select方法
  • [C++]多态
  • [CERC2017]Cumulative Code
  • [CQOI 2010]扑克牌