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

ops/2025/1/31 14:50:28/

一、按键原理图


当把跳线帽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.ppmy.cn/ops/154505.html

相关文章

力扣动态规划-15【算法学习day.109】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;建议灵神的题单和代码随想录&#xff09;和记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关…

分享|通过Self-Instruct框架将语言模型与自生成指令对齐

结论 在大型 “指令调整” 语言模型依赖的人类编写指令数据存在数量、多样性和创造性局限&#xff0c; 从而阻碍模型通用性的背景下&#xff0c; Self - Instruct 框架&#xff0c; 通过 自动生成 并 筛选指令数据 微调预训练语言模型&#xff0c; 有效提升了其指令遵循能…

vue3和vue2的区别有哪些差异点

Vue3 vs Vue2 主要差异对比指南 官网 1. 核心架构差异 1.1 响应式系统 Vue2&#xff1a;使用 Object.defineProperty 实现响应式 // Vue2 响应式实现 Object.defineProperty(obj, key, {get() {// 依赖收集return value},set(newValue) {// 触发更新value newValue} })Vue3…

视频网站服务器为什么需要使用负载均衡?

随着视频网站等娱乐活动的逐渐增加&#xff0c;进行使用的用户数量也在不断上升&#xff0c;大量的用户会给视频网站行业带来一定的访问压力&#xff0c;需要处理大量的媒体资料&#xff0c;比如上传视频图片和数据保存发布等内容&#xff0c;会消耗大量的带宽资源&#xff0c;…

【C++】STL容器使用与实现详解:vector

文章目录 Ⅰ. vector的介绍和使用一、vector的介绍二、vector的使用 &#xff08;只列出比较重要的&#xff0c;其他的需要时查文档&#xff09;1. vector的定义2. vector iterator&#xff08;迭代器&#xff09;的使用3. vector 容量问题4. vector 增删查改5. 正确释放 vecto…

C语言初阶牛客网刷题—— HJ34 图片整理【难度:中等】

1. 题目描述 牛客网在线OJ链接 Lily上课时使用字母数字图片教小朋友们学习英语单词&#xff0c;每次都需要把这些图片按照大小&#xff08;ASCII码值从小到大&#xff09;排列收好。请大家给Lily帮忙&#xff0c;通过C语言解决。 输入描述&#xff1a;Lily使用的图片包括 “A…

MacOS 如何解决无法打开 ‘xxx’,因为 Apple 无法检查其是否包含恶意软件

背景 在安装软件时&#xff0c;遇到“无法打开 ‘xxx’&#xff0c;因为 Apple 无法检查其是否包含恶意软件” 的提示&#xff0c;许多用户可能会感到困惑&#xff0c;不知道该如何处理。遇到这个问题时&#xff0c;按以下步骤操作即可解决。 首先&#xff0c;这个警告提示的出…

项目集成GateWay

文章目录 1.环境搭建1.创建sunrays-common-cloud-gateway-starter模块2.目录结构3.自动配置1.GateWayAutoConfiguration.java2.spring.factories 3.pom.xml4.注意&#xff1a;GateWay不能跟Web一起引入&#xff01; 1.环境搭建 1.创建sunrays-common-cloud-gateway-starter模块…