C51:独立按键(状态机法)

独立按键BTN 独立按键位于整个矩阵键盘的最左侧,4、5、6、7.左下角,跳帽选择2、3,选择的是独立按键,起作用。按下对应按键之后,分别和地相连,置0.两个管脚同时和串口服务,用于串口通信以及给单片机下载程序用。通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的抖动,如图所示。 阅读详情

基础知识:

按键电路图:

消抖处理: 

 

 

    程序示意图:

     

     

    注意事项:

    • 一个好的按键程序一定要实现消抖
    • 能够判断按键状态,按下和弹起
    • 程序不能阻塞程序,不用delay消抖,而是使用定时器

    独立按键状态机法(详细解释在注释里):

    
    #define KEY_NO 0 //无按键状态,用于判断是否按下
    #define KEY_DOWN 1 //有按键按下状态,判断是否抖动
    #define KEY_UP 2 //等待松手状态,判断是否弹起
    unsigned char vBTN_Read(void)
    {
     static unsigned char key_state=0;//定义key_state为静态变量,用于保存每次按键的状态
     unsigned char key_io=0,key_val=0; //key_io:读取的IO状态;key_val:返回的键值
     key_io=P3&0x0f; //对P3读回来的高四位清零,屏蔽不关心的状态
     switch(key_state) 
    	{ 	
    		case KEY_NO: //无按键状态,用于判断是否按下    								
    			if(key_io!=0x0f) key_state = KEY_DOWN; 
    		break; 
    
    		case KEY_DOWN:    				
    			if(key_io!=0x0f)//有按键按下状态,判断是否为抖动
    			{ 
    				if(key_io==0x0e) key_val = 7;  	//S7
    				if(key_io==0x0d) key_val = 6;  	//S6
    				if(key_io==0x0b) key_val = 5;  	//S5
    				if(key_io==0x07) key_val = 4;  	//S4
    				key_state = KEY_UP;  
    			} 
    			else 
    				key_state = KEY_NO;  
    		break;  
    		
    		case KEY_UP: //等待松手状态,判断是否弹起
    			if(key_io==0x0f) key_state = KEY_NO; 
    		break; 
    	} 
    	return key_val; //返回键值
    } 

    注意:要把vBTN_Read函数放在定时器中断里面,每隔10ms执行一次,循环判断

    程序案例:(每隔10ms读取一次键值,并把读到的键值赋值给key_val,可以利用读到的键值进行各种操作)

    unsigned char cnt_key;
    void vBTN_Process(void)
    {
     unsigned char key_val;
     if(cnt_key>=10)
    {
     cnt_key=0;
     key_val=vBTN_Read();
     }
    }
     void vTimer2_ISR(void)  interrupt 12
    {
      cnt_key++;
    }

    状态机法比较好理解,但是程序过于冗杂,不便于记忆。下一篇将给大家介绍三行按键法,顾名思义,就是只需要写三行程序,解放双手,简单又便于记忆。

    51单片机按键消抖 文章目录一、独立键盘1.状态机消抖2.三行代码消抖二、矩阵键盘1.状态机消抖 一、独立键盘 1.状态机消抖 define key_state_0 0//判断按键是否按下 #define key_state_1 1//判断按键是否抖动 #define key_state_2 2//判断按键是否弹起 #define key_input P3 #define key_mask 0x0f void key... 阅读详情

    相关推荐

    STC89C52音乐播放器全套开发资料:Proteus仿真+AD原理图+Keil可编译C源码

    基于STC89C52单片机的音乐播放器完整开发包,支持4首内置曲目循环播放,通过独立按键切换歌曲、控制播放/暂停,LCD1602实时显示曲名。内含Proteus仿真工程(.DSN/.DBK/.PWI),可直接加载运行;Altium Designer格式原理图(.SCHDOC),清晰标注各模块连接关系;Keil C51工程文件(.uvproj/.uvopt/.uvgui),含完整可编译C源码(.c)、编译输出.hex和.m51文件、列表文件.lst及Objects、Listings等标准输出目录。所有代码模块

    m5n6o7的博客 223

    [51单片机]什么是按键抖动,如何用程序防抖

    在进行硬件设计时,添加到PCB板中的机械开关触点断开、闭合时,由于机械触点的弹性作用,按键开关在闭合或松开时并不会马上稳定地接通或断开。因而在闭合或断开的瞬间均伴随有一连串的抖动,这样的抖动叫按键抖动。一般采取在程序中加入延时函数的方法来消抖,程序如下:

    llkllllkjhgf的博客 6240

    基于51单片机的4按键独立控制LED开关系统设计与实现

    本系统基于51单片机构建四路独立式按键控制LED的嵌入式应用,实现“按键输入→信号处理→LED输出”的基本闭环控制。硬件上划分为输入模块(4个独立按键)核心控制单元(STC89C52RC)和输出执行模块(4个LED指示灯)三大组成部分。每个按键对应一个LED,通过GPIO口进行电平读取与驱动输出,形成一对一联动关系。系统工作流程清晰:当用户按下某一按键时,单片机检测到P3端口电平变化,经逻辑判断后在P1端口翻转对应LED状态。

    weixin_33773084的博客 1489

    C51之按键定时器消抖版,和简易简易加法计算器

    下面是简易计算机注释写的很清楚。

    m0_63084911的博客 1594

    按键长按短按.zip_51单片机_按键长按_短按_短按 长按_长按短按

    识别按键是长按还是短按,运用在项目中能省下好多IO口

    刷题单向链表

    实现一个数据结构,维护一张表(最初只有一个元素 11)。接下来 qq 行,每行表示一次操作,操作具体间题目描述。a[i] 里面放的是下一个元素,为0代表链表结束。如单链表1->4 -> 2->3->0用数组表示是。对于每个操作 2,输出一个数字,用换行隔开。第一行一个整数 qq 表示操作次数。

    power的专栏 1714

    51单片机教程:按键的定时器消抖(有延时的程序不是好程序)

    按键消抖原理 一、首先来回顾一下按键延时消抖 按键由于是机械结构,按下的时候难免产生抖动,一般抖动会在按下的时候与松开的时候产生,抖动时间大概是10ms 于是针对按键抖动就有了延时消抖的一种简单的解决方法: 二、按键消抖代码 方法一: 按下按键损耗的时间取决于按下按键到松开的时间,至少10ms,按下按键后CPU不再执行其他指令,直到按键松开,应用能力弱 void main(void) { while(1) { if(key==0) //读P1.0引脚,如果引脚为低电平,则进入if {

    mbs706的博客 5万+

    【电商风控】电商风控标注是什么

    本篇文章给大家谈谈。

    866

    基于C51实现按键控制

    本实验基于STC89C52RC单片机,根据电路原理图编程通过独立按键控制led灯、通过矩阵按键控制开发板数码管模块。由于51系列单片机结构大同小异,读者可根据此博客举一反三,实现所需完成的功能。...

    妙乌的博客 5819

    蜻蜓fm爬虫python

    本文介绍了一个用于下载蜻蜓FM音频书籍的Python脚本实现。该脚本主要功能包括:1)通过账号密码登录获取认证信息;2)从目标书籍主页提取版本信息;3)获取书籍节目总数和分页信息;4)生成节目下载链接(使用HMAC-MD5加密算法生成请求签名);5)下载音频文件并保存。脚本采用多种反爬措施:设置User-Agent模拟浏览器行为、使用动态时间戳、HMAC-MD5签名验证等,有效规避简单的反爬机制。整个流程包括登录认证、获取书籍信息、生成下载链接和保存音频文件四个步骤,实现自动化批量下载功能。

    野猫炫的博客 912

    在Windows 11上用VirtualBox搞定WRF-Hydro 5.2.0:一个水文模型小白的Ubuntu 22.04虚拟机避坑实录

    本文详细记录了在Windows 11上使用VirtualBox和Ubuntu 22.04虚拟机成功编译安装WRF-Hydro 5.2.0水文模型的全过程。从虚拟环境配置、依赖库安装到环境变量设置,作者分享了针对Linux新手的实用避坑技巧和关键命令,帮助科研人员高效完成水文模型的环境搭建。

    weixin_30733003的博客 354

    51单片机的按键状态机

    通过按键扫描的方法 发现长按显示效果难以实现,在此引入状态机程序。在此可以较容易实现按键三种状态的检测。如上图问题这时可以引入状态机。

    weixin_74392502的博客 1303

    HybridCLR热更新打包报错全解析:从原理到实战解决方案

    热更新技术是现代游戏和应用开发中实现动态内容交付与Bug修复的核心机制,它允许开发者在无需重新发布完整应用的情况下更新代码逻辑。其原理通常涉及在运行时加载并执行新的代码模块,这要求框架在底层实现安全的代码隔离、内存管理与元数据桥接。在Unity生态中,HybridCLR作为基于IL2CPP的高性能热更新解决方案,通过补充元数据和AOT泛型引用技术,实现了对C#代码的原生级热更支持,显著提升了开发迭代效率与线上问题修复能力。然而,在实际的工程实践中,尤其是在面向Android、iOS等多平台打包构建时,开发者

    weixin_29017445的博客 309

    C51:独立按键(三行按键法)

    上一篇博客介绍了状态机法,但是程序代码量巨大,不便于记忆,接下来给大家介绍三行按键法,不仅方便记忆,还可以在考场上领先别人一大步。以下是三行按键法的读取函数,这个函数理解起来比较复杂,大家也没有必要硬要理解,能把代码背下来就好了。注意:vBTN_ThreeLine_Process()函数需要放到while(1)循环里执行。解释:把cnt_key放在定时器中,每过1ms加一,每10ms读取一次键值。定义一个count变量,根据按下的键值可以对count的值进行加减操作。

    Libra_pro的博客 352

    【Unity实战篇】 接入百度翻译,实现文本自动翻译功能

    日常在做项目的过程中,游戏本地化几乎已经成为必不可少的一步。 本篇文章将演示怎样在Unity中接入百度翻译,实现文本自动翻译的功能。

    努力前行,总会成为自己心中的那道光 9059

    CREO图文教程:三维设计案例之矿泉水瓶实例图文教程之详细攻略

    草绘,先绘制中心线,绘制底部宽度;对称标注:点击左端点,中心线,左端点,中键即可标注;给定高度;样条曲线绘制外形(双击样条曲线,点击下栏的控制模式(第一个按钮),再拉动控制样条曲线上的各个点)打勾即可得到三维实体。......

    走向CTO之路 1932

    51单片机独立按键消抖实战:5分钟搞定LED灯状态切换(附完整代码)

    本文详细介绍了51单片机独立按键消抖的实战方法,通过软件延时方案有效解决LED灯状态切换时的抖动问题。文章包含完整的代码实现和优化技巧,帮助开发者快速掌握按键消抖技术,提升嵌入式系统的稳定性与可靠性。

    hadoop5ranger的博客 755

    成功解决raise Py4JError py4j.protocol.Py4JError: py4j.protocol.Py4JError: Could not find py4j jar at 

    成功解决raise Py4JError("Could not find py4j jar at {0}".format(jarpath)) py4j.protocol.Py4JError: Could not find py4j jar at 目录 解决问题 解决思路 解决方法 1、第一步安装jdk 2、第二步安装或升级py4j 解决问题 raise Py4JError("Could not find py4j jar at {0...

    头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 4627

    【51单片机实验笔记】开关篇(一) 独立按键

    独立按键

    悬铃木下的青春的博客 7814

    Statistics and Machine Learning Toolbox

    Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

    SIMATIC S7-1200, S7-1500 PID 控制[手册]

    SIMATIC S7-1200, S7-1500 PID 控制[手册]

    从机械抖动到数字稳定:C51状态机如何重塑按键交互体验

    本文深入探讨C51单片机如何通过状态机实现按键数字消抖,解决传统机械抖动问题。状态机模型提供非阻塞处理,支持长短按等高级功能,显著提升响应速度和系统稳定性,为嵌入式开发提供优化方案。

    loss4bartender的博客 771

    怀旧版电脑GBC模拟器

    再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

    自学笔记—C51独立按键控制LED

    8051单片机的每个I/O口(如P0、P1、P2、P3)都是。当你写P2_0 = 0时,表示:P2.0 引脚被,即输出0V。当你写P2_0 = 1时,表示:P2.0 引脚为高电平(通常为VCC,约5V)。也就是说,写操作决定了引脚输出什么电平。而读操作(例如)时,程序从 P3.1 引脚(0或1)。

    2501_92662358的博客 632

    ET2012新版免狗免安装绿色软件

    ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

    独立按键状态机c语言,单片机独立按键状态机源码

    /*例程:按键实验例程作者:电子设计工坊*/#include "reg52.h"/*独立按键状态机*///#define key_input P3//#define key_state_00//判断是否按下//#define key_state_11 //判断是否为抖动//#define key_state_22 //判断是否弹起////char read_key(void)//{...

    weixin_29821223的博客 537

    从零构建:C51按键状态机的设计哲学与工程实践

    本文详细介绍了C51按键状态机的设计哲学与工程实践,涵盖状态机基础、架构设计、消抖机制和核心实现。通过状态枚举、事件定义和紧凑数据结构,构建高效的按键处理系统,支持长短按识别、多按键协同和低功耗优化,提升嵌入式系统可靠性和实时响应能力。

    wind6的博客 830

    51单片机独立按键的5种高级玩法:二进制计数、LED移位、状态切换(Keil工程分享)

    本文详细介绍了51单片机独立按键的5种高级应用技巧,包括二进制计数、LED移位、状态切换等实用功能,并提供可直接复用的Keil工程代码。通过优化硬件设计和软件实现,开发者可以充分利用独立按键的潜力,提升嵌入式系统的交互能力。

    ruby5的博客 779

    C51实现-简单的按键状态机(一)

    代码必然是无法直接使用的,需要根据实际情况进行修改。逐步分析引起按键状态变化的条件、状态变化的过程、状态变化引发的事件,并将状态图与按键状态机函数对照着阅读,能够更快的理解!

    nswdwy279的博客 2152

    51单片机(三)独立按键消抖与状态机实战

    本文详细介绍了51单片机中独立按键的消抖问题及状态机解决方案。通过分析机械按键的物理抖动现象,提出状态机消抖原理,并给出C语言实现代码。文章还展示了如何用状态机实现按键控制LED模式切换,包括流水灯、呼吸灯等效果,并扩展了双击与长按检测功能。最后对比了硬件消抖方案,为实际项目提供了实用建议。

    weixin_33980459的博客 554
    上一篇: C51:数码管的动态显示
    下一篇: C51:独立按键(三行按键法)
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    个

    红包个数最小为10个

    元

    红包金额最低5元

    当前余额3.43元 前往充值 >
    需支付:10.00元
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    爱写代码的倒霉蛋

    你的鼓励是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付元
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值