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

一、按键原理图


当把跳线帽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…

debian12.9编译freeswitch1.10.12【默认安装】

服务器操作系统 cat /etc/os-release PRETTY_NAME"Debian GNU/Linux 12 (bookworm)" NAME"Debian GNU/Linux" VERSION_ID"12" VERSION"12 (bookworm)" VERSION_CODENAMEbookworm IDdebian HOME_URL"https://www.debian.org/&quo…

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

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

【算法】分治

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

MongoDB 数据库备份和恢复全攻略

在当今数据驱动的时代&#xff0c;数据库的稳定运行和数据安全至关重要。MongoDB 作为一款流行的 NoSQL 数据库&#xff0c;以其灵活的文档模型和高扩展性备受青睐。然而&#xff0c;无论数据库多么强大&#xff0c;数据丢失的风险始终存在&#xff0c;因此掌握 MongoDB 的备份…

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

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

LabVIEW橡胶动态特性测试系统

本文介绍了一个利用LabVIEW软件和NI高速数据采集设备构建的橡胶动态特性测试系统。该系统实现了橡胶材料动态性能的精确测量&#xff0c;并通过虚拟仪器技术&#xff0c;提高了测试数据的处理效率和准确性。系统支持实时数据处理和多种信号的动态分析&#xff0c;适用于工业和科…

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

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

IOS 安全机制拦截 window.open

摘要 在ios环境&#xff0c;在某些情况下执行window.open不生效 一、window.open window.open(url, target, windowFeatures) 1. url&#xff1a;「可选参数」&#xff0c;表示你要加载的资源URL或路径&#xff0c;如果不传&#xff0c;则打开一个url地址为about:blank的空…

Java stream流的避坑指南

在使用Java Stream API时&#xff0c;虽然它提供了强大的功能来简化集合操作&#xff0c;但也存在一些常见的“坑”需要注意。以下是详细的避坑指南&#xff1a; 1. Stream的不可重用性 问题&#xff1a;Stream一旦被消费&#xff08;如调用forEach、collect等终端操作&#…

对于RocksDB和LSM Tree的一些理解

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

偏差(Bias)和方差(Variance)

在机器学习中&#xff0c;偏差&#xff08;Bias&#xff09;和方差&#xff08;Variance&#xff09;是模型预测误差的两个主要组成部分&#xff0c;它们描述了模型在训练和预测过程中可能出现的两种不同类型的错误。 偏差&#xff08;Bias&#xff09; 偏差指的是模型在训练…

枚举与模拟 练习

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

99.17 金融难点通俗解释:归母净利润

目录 0. 承前1. 简述2. 比喻&#xff1a;小明家的小卖部2.1 第一步&#xff1a;计算收到的所有钱2.2 第二步&#xff1a;减去各种支出2.3 第三步&#xff1a;计算能带回家的钱 3. 生活中的例子3.1 好的经营情况3.2 一般的经营情况3.3 不好的经营情况 4. 小朋友要注意4.1 为什么…

[LeetCode] 字符串 I — 344#反转字符串 | 541#反转字符串II | 54K替换数字

字符串 基础知识344# 反转字符串541# 反转字符串II54K 替换数字 基础知识 字符串的结尾&#xff1a;空终止字符00 char* name "hello"; // 字符串不可拓展&#xff08;由于是一个固定分配的内存块&#xff09;&#xff0c;有些地方必须加const char name2[5] {h,…

【深度学习|迁移学习】渐进式学习策略 (Progressive Learning Strategy)详述(一)

【深度学习|迁移学习】渐进式学习策略 (Progressive Learning Strategy)详述&#xff08;一&#xff09; 【深度学习|迁移学习】渐进式学习策略 (Progressive Learning Strategy)详述&#xff08;一&#xff09; 文章目录 【深度学习|迁移学习】渐进式学习策略 (Progressive L…

NIO 和 Netty 在 Spring Boot 中的集成与使用

Netty到底是个啥&#xff0c;有啥子作用 1. Netty 的本质&#xff1a;对 NIO 的封装 NIO 的原生问题&#xff1a; Java 的 NIO 提供了非阻塞 I/O 和多路复用机制&#xff0c;但其使用较为复杂&#xff08;如 Selector、Channel、Buffer 的配置和管理&#xff09;。开发者需要自…

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, …