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

}

}

相关推荐
国科安芯3 分钟前
抗辐照MCU在卫星载荷电机控制器中的实践探索
网络·嵌入式硬件·硬件工程·智能硬件·空间计算
双古1 小时前
步进电机调试记录(先让我的步进电机转起来)
单片机·嵌入式硬件
lixzest1 小时前
STM32开发中,线程启动异常问题排查简述
stm32·嵌入式硬件
程序员JerrySUN2 小时前
全面理解 Linux 内核性能问题:分类、实战与调优策略
java·linux·运维·服务器·单片机
学习噢学个屁2 小时前
基于STM32语音识别柔光台灯
c语言·stm32·单片机·嵌入式硬件·语音识别
欢乐熊嵌入式编程4 小时前
欢乐熊大话蓝牙知识14:用 STM32 或 EFR32 实现 BLE 通信模块:从0到蓝牙,你也能搞!
stm32·单片机·嵌入式硬件
傍晚冰川5 小时前
FreeRTOS任务调度过程vTaskStartScheduler()&任务设计和划分
开发语言·笔记·stm32·单片机·嵌入式硬件·学习
SY师弟7 小时前
51单片机基础部分——矩阵按键检测
嵌入式硬件·矩阵·51单片机
Lester_11018 小时前
嵌入式学习笔记 - freeRTOS xTaskResumeAll( )函数解析
笔记·stm32·单片机·学习·freertos
阿超爱嵌入式9 小时前
STM32学习之I2C(理论篇)
stm32·嵌入式硬件·学习