单片机基础模块学习——按键

一、按键原理图


当把跳线帽J5放在右侧,属于独立按键模式(BTN模式),放在左侧为矩阵键盘模式(KBD模式)

整体结构是一端接地,一端接控制引脚


之前提到的都是使用了GPIO-准双向口的输出功能,按键模块用到的是输入功能


实际每一个按键的原理图如下,vcc电阻都在芯片内部,当按键断开时,流过电阻的电流称为灌电流,大概几十毫安,因此此时引脚为高电平。按下时与地接通为低电平

二、独立按键模块代码

#include "key.h"unsigned char Key_Read_BTN(void)
{if(P33==0)return 4;else if(P32 ==0)return 5;else if(P31 ==0)return 6;else if(P30 ==0)return 7;elsereturn 0;
}

三、矩阵键盘

矩阵键盘用到8个引脚,下方的四个作为输出引脚用,右侧四个用做输入引脚用,矩阵键盘的原理利用扫描法


下面的四个引脚都输出高电平的话,那么无论是否按下,根据上面的原理图可知,右边都会监测到低电平 


如果P44设置为低电平,当按下S5时,由于S9,S13,S17均断开,所以P32连接到S5为低电平


 四、独立按键与矩阵键盘对比

  • 独立按键:

                优点:操作简便

                缺点:占用I/O资源多

  • 矩阵键盘:

                优点:节省I/O资源

                缺点:操作较为复杂

五、矩阵键盘模块代码

这里将Key_New设置为unsigned int型,因为有16个按键,需要16位数据来存储

#include "key.h"unsigned char Key_Read_BTN(void)
{if(P33==0)return 4;else if(P32 ==0)return 5;else if(P31 ==0)return 6;else if(P30 ==0)return 7;elsereturn 0;
}
unsigned char Key_Read_KBD(void)
{unsigned int Key_New;//16_bitunsigned char Key_Val;P44=0;P42=1;P35=1;P34=1;Key_New=(P3&0x0f); //xxxx xxxx xxxx s4 s5 s6 s7P44=1;P42=0;P35=1;P34=1;Key_New=(Key_New<<4)|(P3&0x0f); //xxxx xxxx s4 s5 s6 s7 s8 s9 s10 s11 P44=1;P42=1;P35=0;P34=1;Key_New=(Key_New<<4)|(P3&0x0f); //xxxx s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16P44=1;P42=1;P35=1;P34=0;Key_New=(Key_New<<4)|(P3&0x0f); //s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20//s4//0111 1111 1111 1111b =0xFFFF//1000 0000 0000 0000b =0x8000switch(~Key_New){case 0x8000:Key_Val =4;break;case 0x4000:Key_Val =5;break;case 0x2000:Key_Val =6;break;case 0x1000:Key_Val =7;break;case 0x0800:Key_Val =8;break;case 0x0400:Key_Val =9;break;case 0x0200:Key_Val =10;break;case 0x0100:Key_Val =11;break;case 0x0080:Key_Val =12;break;case 0x0040:Key_Val =13;break;case 0x0020:Key_Val =14;break;case 0x0010:Key_Val =15;break;case 0x0008:Key_Val =16;break;case 0x0004:Key_Val =17;break;case 0x0002:Key_Val =18;break;case 0x0001:Key_Val =19;break;default:Key_Val=0;}return Key_Val;
}

六、主函数代码 

#include "STC15F2K60S2.H"
#include "seg.h"
#include "tim.h"
#include "led.h"
#include "init.h"
#include "key.h"//Seg
unsigned char pucSeg_Buf[9],pucSeg_Code[9],pucSeg_Pos=0;//字符数组以/0结尾,所以要有9位//Key
unsigned char ucKey_Val =0;//Timer
unsigned long ulms =0;
unsigned int uiSeg_Dly=0;
unsigned int uiKey_Dly=0;void Seg_Proc(void);
void Key_Proc(void);void main(void)
{Cls_Peripheral();Timer0Init();EA=1;while(1){Seg_Proc();Key_Proc();}}void Seg_Proc(void)
{if(uiSeg_Dly<200)return;uiSeg_Dly =0;sprintf(pucSeg_Buf,"%02d      ",(int)ucKey_Val);//奖读取到的按键数制进行输出 加7个空格键熄灭后面的数码管Seg_Tran(pucSeg_Buf,pucSeg_Code);
}
void Key_Proc(void)
{if(uiKey_Dly<20)//20毫秒的间隔进行读取,避免漏掉读取return;uiKey_Dly =0;ucKey_Val =Key_Read_KBD();
}
void Time_0(void) interrupt 1
{ulms++;uiSeg_Dly++;uiKey_Dly++;if(ulms % 2==0){pucSeg_Pos=(pucSeg_Pos+1)%8;//实现pucSeg_Pos从0-7循环的操作Seg_Disp(pucSeg_Code,pucSeg_Pos);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/69161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第25篇 基于ARM A9处理器用C语言实现中断<一>

Q&#xff1a;怎样理解基于ARM A9处理器用C语言实现中断的过程呢&#xff1f; A&#xff1a;同样以一段使用C语言实现中断的主程序为例介绍&#xff0c;和汇编语言实现中断一样这段代码也使用了定时器中断和按键中断。执行该主程序会在DE1-SoC的红色LED上显示流水灯&#xf…

Baklib如何提升企业的内容管理效率与协作能力

内容概要 在现代企业中&#xff0c;内容管理的有效性直接影响到工作效率、团队协作和创新能力。随着信息量的不断增加&#xff0c;企业亟需一个系统化的平台来高效处理和管理这些内容。Baklib作为一款先进的内容管理平台&#xff0c;通过其丰富的功能和灵活的应用场景&#xf…

【2024年终总结】深圳工作生活评测

距离上次写年终总结已经过了一年半了&#xff0c;这一年半中哪怕经历了很多的事情&#xff0c;但是感觉又没发生什么。想写一些骚话&#xff0c;却总觉得自己无法完全表达&#xff0c;便也就这样&#xff0c;静静地记录下这一段时光。 现在是2025年&#xff0c;春节前的时光&am…

【算法】分治

分治 1.逆序对2.求第 k 小的数3.最大子段和4.地毯填补问题 分治&#xff0c;字面上的解释是「分而治之」&#xff0c;就是把一个复杂的问题分成两个或更多的相同的子问题&#xff0c;直到最后子问题可以简单的直接求解&#xff0c;原问题的解即子问题的解的合并。 1.逆序对 P…

Vue2官网教程查漏补缺学习笔记 - 3Vue实例4模板语法5计算属性监听器

3 Vue实例 3.1 创建一个 Vue 实例 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的&#xff1a; var vm new Vue({// 选项 })虽然没有完全遵循 MVVM 模型&#xff0c;但是 Vue 的设计也受到了它的启发。因此在文档中经常会使用 vm (ViewModel 的缩写) 这个变…

(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验六----流域综合处理(超超超详细!!!)

流域综合处理 流域综合治理是根据流域自然和社会经济状况及区域国民经济发展的要求,以流域水流失治理为中心,以提高生态经济效益和社会经济持续发展为目标,以基本农田优化结构和高效利用及植被建设为重点,建立具有水土保持兼高效生态经济功能的半山区流域综合治理模式。数字高程…

对于RocksDB和LSM Tree的一些理解

LSM Tree的读写过程 HBase、LevelDB&#xff0c;rocksDB&#xff08;是一个引擎&#xff09;底层的数据结构是LSM Tree适合写多读少的场景&#xff0c;都是追加写入内存中的MemTable&#xff0c;写入一条删除&#xff08;或修改&#xff09;标记&#xff0c;而不用去访问实际的…

枚举与模拟 练习

练习题基于《C/C程序设计竞赛真题实战特训教程&#xff08;图解版&#xff09;》 目录 1.1 卡片 题目描述 代码实现 题解笔记 总评 注意点 重点解释 1.2 回文日期 题目描述 输入描述 输出描述 代码实现 题解笔记 总评 注意点 重点解释 1.1 卡片 题目描述 小蓝…

Linux第103步_了解I2C总线框架

了解Linux中的I2C总线框架为后面做I2C实验做准备&#xff0c;学驱动&#xff0c;就是学习框架&#xff0c;了解是必须的。 1、了解Linux下的I2C子系统中的相关数据结构 struct i2c_adapter { struct module *owner; unsigned int class; /* classes to allow probing for …

AAAI2024论文合集解读|Physics-Informed Representation and Learning Control and Risk

论文标题 Physics-Informed Representation and Learning: Control and Risk Quantification 物理信息表征与学习&#xff1a;控制与风险量化 论文链接 Physics-Informed Representation and Learning: Control and Risk Quantification论文下载 论文作者 Zhuoyuan Wang, …

【JavaEE进阶】Spring留言板实现

目录 &#x1f38d;预期结果 &#x1f340;前端代码 &#x1f384;约定前后端交互接口 &#x1f6a9;需求分析 &#x1f6a9;接口定义 &#x1f333;实现服务器端代码 &#x1f6a9;lombok介绍 &#x1f6a9;代码实现 &#x1f334;运行测试 &#x1f384;前端代码实…

HackTheBox靶机:Sightless;NodeJS模板注入漏洞,盲XSS跨站脚本攻击漏洞实战

HackTheBox靶机&#xff1a;Sightless 渗透过程1. 信息收集常规探测深入分析 2. 漏洞利用&#xff08;CVE-2022-0944&#xff09;3. 从Docker中提权4. 信息收集&#xff08;michael用户&#xff09;5. 漏洞利用 Froxlor6. 解密Keepass文件 漏洞分析SQLPad CVE-2022-0944 靶机介…

Ansible入门学习之基础元素介绍

一、Ansible目录结构介绍 1.通过rpm -ql ansible获取ansible所有文件存放的目录 有配置文件目录 /etc/ansible/ 执行文件目录 /usr/bin/ 其中 /etc/ansible/ 该文件目录的主要功能是 inventory主机信息配置&#xff0c;ansible工具功能配置。 ansible自身的配置文件…

Antd React Form使用Radio嵌套多个Select和Input的处理

使用Antd React Form使用Radio会遇到嵌套多个Select和Input的处理&#xff0c;需要多层嵌套和处理默认事件和冒泡&#xff0c;具体实现过程直接上代码。 实现效果布局如下图 代码 <Formname"basic"form{form}labelWrap{...formItemLayoutSpan(5, 19)}onFinish{on…

11 蚂蚁链技术特性

概览 蚂蚁链通过引入P2P网络、共识算法、虚拟机、智能合约、密码学、数据存储等技术特性&#xff0c;构建一个稳定、高效、安全的图灵完备智能合约执行环境&#xff0c;提供账户的基本操作以及面向智能合约的功能调用。 区块结构 一个区块包含区块头和区块体&#xff0c;区块…

【C++高并发服务器WebServer】-5:内存映射与进程通信

本文目录 一、内存映射与进程通信二、匿名映射与进程通信 一、内存映射与进程通信 内存映射Memory-mapped I/O指的是将磁盘文件的数据映射到内存&#xff0c;用户通过修改内存就能够修改磁盘文件&#xff0c;如下图所示&#xff08;进程地址空间指的是虚拟地址空间&#xff09…

使用vscode + Roo Code (prev. Roo Cline)+DeepSeek-R1使用一句话需求做了个实验

摘要 使用vscode、Roo Code和deepseek-reasoner进行了一个实验&#xff0c;尝试使用一句话需求来生成小红书封面图片。工具根据需求提供了详细的架构方案&#xff0c;包括技术栈选择、核心模块划分、目录结构建议等。然后&#xff0c;工具自动化地完成了开发和测试&#xff0c;…

C语言初阶牛客网刷题—— JZ11 旋转数组的最小数字【难度:简单】

1. 题目描述 牛客网在线OJ链接 有一个长度为 n 的非降序数组&#xff0c;比如 [1,2,3,4,5] &#xff0c;将它进行旋转&#xff0c;即把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;变成一个旋转数组&#xff0c;比如变成了 [3,4,5,1,2] &#xff0c;或者 [4,5,1,2,3…

如何解压7z文件?8种方法(Win/Mac/手机/网页端)

7z 文件是一种高效的压缩文件格式&#xff0c;由 7 - Zip 软件开发者所采用。它运用独特的压缩算法&#xff0c;能显著缩小文件体积&#xff0c;便于存储与传输各类数据&#xff0c;像软件安装包、大型资料集等。但要使用其中内容&#xff0c;就必须解压&#xff0c;因为处于压…

豆包MarsCode 蛇年编程大作战 | 高效开发“蛇年运势预测系统”

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 豆包MarsCode 蛇年编程大作战 | &#x1f40d; 蛇年运势预测 在线体验地址&#xff1a;蛇年…