蓝桥杯单片机 独立按键与矩阵按键

article/2025/1/17 6:11:57

文章目录

  • 前言
  • 一、蓝桥杯按键原理图
  • 二、独立按键与矩阵按键处理思路
    • 1.独立按键
    • 2.矩阵按键
  • 代码实现
  • 总结


前言

按键设计一般分为两种:独立按键和矩阵键盘。按键数量较少的用前者,按键数量较多的用后者。虽然两种设计都是操作按键,但是其键盘扫描方式和程序的设计思路是截然不同的。独立按键简单很多,矩阵键盘虽然复杂,只要掌握了本质思路,也没有什么困难之处。


一、蓝桥杯按键原理图


二、独立按键与矩阵按键处理思路


1.独立按键

   首先将J5的跳线帽2~3相连,独立按键有两个引脚,其中一个通过上拉电阻接到单片机的I/O端口,另外一端接地。也就是说,平时按键没有动作的时候,输出的是高电平,如果有按下动作发生,则输出的是低电平。那么,我们在程序设计的时候,只要扫描跟按键引脚相连的I/O端口,如果发现有低电平产生,则判定该按键处于按下状态。有些时候,电路或者外围有电磁干扰,也会使单片机的I/O端口产生低电平,这种干扰信号会让单片机误认为是按键动作。所以,在扫描按键的时候应该做去抖动处理,把干扰信号过滤掉,从而获得准确的按键状态信号。


2.矩阵按键

    首先将J5的跳线帽1~2相连,与独立按键不同的是,矩阵按键的两个引脚都分别连接的单片机的I/O端口,一个作为行信号,另外一个作为列信号。

 在上面的矩阵键盘中,要识别出S9按键的按下状态,应该怎么做呢?
    对与矩阵键盘,我们只能逐行扫描,然后读取列的状态信号。如果如果S9按键有按下动作的话,那么S9按键行输出低电平,S9按键列信号也应该为低电平,而该行上其他没有按下动作的按键的列信号则为高电平。因此,我们可以得到矩阵键盘的基本扫描步骤:
    <1> 第一列输出低电平,第二三四列输出高电平,逐个读取判断行信号,如果都为高电平则第一行上没有按键按下。
    <2> 第二列输出低电平,第一三四列输出高电平,逐个读取判断行信号。如果都为高电平则第二行上没有按键按下。
    <3> 第三列输出低电平,第一二四列输出高电平,发现S9行信号为低电平,那么可以判断得第三行的S9列的按键有按下动作。
    <4> 第四列输出低电平,第一二三列输出高电平,逐个读取判断行信号。如果都为高电平则第四行上没有按键按下。
    如此循环往复,扫描的按键的状态。



三、代码实现

key.h

#ifndef __KEY_H
#define __KEY_H
#include "STC15F2K60S2.H" unsigned char Key_Read(void);
unsigned char Key_Read_BTN(void);
#endif

key.c

// 运行程序时,将J5调整为KBD模式(1-2脚短接)
#include "key.h"unsigned char Key_Read(void)
{unsigned int  Key_New;unsigned char Key_Val;P44 = 0; P42 = 1; P35 = 1; P34 = 1;	// 第1列Key_New = P3;P44 = 1; P42 = 0;										// 第2列Key_New = (Key_New<<4) | (P3&0x0f);P42 = 1; P35 = 0;										// 第3列Key_New = (Key_New<<4) | (P3&0x0f);P35 = 1; P34 = 0;										// 第4列Key_New = (Key_New<<4) | (P3&0x0f);switch(~Key_New) {case 0x8000: Key_Val = 4; break;	// S4case 0x4000: Key_Val = 5; break;	// S5case 0x2000: Key_Val = 6; break;	// S6case 0x1000: Key_Val = 7; break;	// S7case 0x0800: Key_Val = 8; break;	// S8case 0x0400: Key_Val = 9; break;	// S9case 0x0200: Key_Val = 10; break;	// S10case 0x0100: Key_Val = 11; break;	// S11case 0x0080: Key_Val = 12; break;	// S12case 0x0040: Key_Val = 13; break;	// S13case 0x0020: Key_Val = 14; break;	// S14case 0x0010: Key_Val = 15; break;	// S15case 0x0008: Key_Val = 16; break;	// S16case 0x0004: Key_Val = 17; break;	// S17case 0x0002: Key_Val = 18; break;	// S18case 0x0001: Key_Val = 19; break;	// S19default: Key_Val = 0;}return Key_Val;
}unsigned char Key_Read_BTN(void)
{unsigned char Key_Val;if(P30 == 0)Key_Val = 7;else if(P31 == 0)Key_Val = 6;else if(P32 == 0)Key_Val = 5;else if(P33 == 0)Key_Val = 4;else Key_Val = 0;return Key_Val;
}

 seg.h

#ifndef __SEG_H
#define __SEG_H
#include "STC15F2K60S2.H"void Seg_Tran(unsigned char *pucSeg_Buf, unsigned char *pucSeg_Code);
void Seg_Disp(unsigned char *pucSeg_Code, unsigned char ucSeg_Pos);
#endif

seg.c 

#include "seg.h"
// 显示转换
void Seg_Tran(unsigned char *pucSeg_Buf, unsigned char *pucSeg_Code)
{   unsigned char i, j=0, temp;for(i=0; i<8; i++, j++){switch(pucSeg_Buf[j]) { // 低电平点亮段,段码[MSB...LSB]对应码顺序为[dp g f e d c b a]case '0': temp = 0xc0; break;case '1': temp = 0xf9; break;case '2': temp = 0xa4; break;case '3': temp = 0xb0; break;case '4': temp = 0x99; break;case '5': temp = 0x92; break;case '6': temp = 0x82; break;case '7': temp = 0xf8; break;case '8': temp = 0x80; break;case '9': temp = 0x90; break;case 'A': temp = 0x88; break;case 'B': temp = 0x83; break;case 'C': temp = 0xc6; break;case 'D': temp = 0xA1; break;case 'E': temp = 0x86; break;case 'F': temp = 0x8E; break;case 'H': temp = 0x89; break;case 'L': temp = 0xC7; break;case 'N': temp = 0xC8; break;case 'P': temp = 0x8c; break;case 'U': temp = 0xC1; break;case '-': temp = 0xbf; break;case ' ': temp = 0xff; break;default: temp = 0xff;}	if(pucSeg_Buf[j+1] == '.'){temp = temp&0x7f;j++;}pucSeg_Code[i] = temp;}
}
// 数码管显示
void Seg_Disp(unsigned char *pucSeg_Code, unsigned char ucSeg_Pos)
{P0 = 0xff; 						// 消隐P2 = P2 & 0x1F | 0xE0;			// P27~P25清零,再定位Y7CP2 &= 0x1F;						// P27~P25清零P0 = 1<<ucSeg_Pos; 				// 位选P2 = P2 & 0x1F | 0xC0;			// P27~P25清零,再定位Y6CP2 &= 0x1F;						// P27~P25清零P0 = pucSeg_Code[ucSeg_Pos]; 		// 段码P2 = P2 & 0x1F | 0xE0;			// P27~P25清零,再定位Y7CP2 &= 0x1F;						// P27~P25清零
}

main.c

#include "tim.h"
#include "key.h"
#include "seg.h"
#define TEST_I 60
unsigned char ucSec, ucLed;
unsigned char ucKey_Dly, ucKey_Old;
unsigned char pucSeg_Buf[8], pucSeg_Code[8], ucSeg_Pos;
unsigned long ulms, ulKey_Time;void Key_Proc(void);
void SEG_Proc(unsigned char ucSeg_Val);void main(void)
{Cls_Peripheral();Timer1Init();while(1){Key_Proc();Seg_Tran(pucSeg_Buf, pucSeg_Code);}
}void Time_1(void) interrupt 3
{unsigned char buf[] = {TEST_I+'0', TEST_I+1+'0', TEST_I+2+'0', TEST_I+3+'0', TEST_I+4+'0', TEST_I+5+'0', TEST_I+6+'0', TEST_I+7+'0'};ulms++;if(++ucKey_Dly == 10)ucKey_Dly = 0;if(!(ulms % 1000)){ucSec++;ucLed ^= 1;Led_Disp(ucLed);}Seg_Disp(buf, ucSeg_Pos);	if(++ucSeg_Pos == 8) ucSeg_Pos = 0;
}void Key_Proc(void)
{unsigned char ucKey_Val, ucKey_Down, ucKey_Up;if(ucKey_Dly) return;ucKey_Dly = 1;ucKey_Val = Key_Read();ucKey_Down = ucKey_Val & (ucKey_Old ^ ucKey_Val);ucKey_Up = ~ucKey_Val & (ucKey_Old ^ ucKey_Val);ucKey_Old = ucKey_Val;if(ucKey_Down){ulKey_Time = ulms;SEG_Proc(ucKey_Down);}if(ucKey_Up)SEG_Proc(ucKey_Up);if(ucKey_Old && (ulms - ulKey_Time > 1000)){ulKey_Time = ulms;SEG_Proc(ucKey_Old);}
}void SEG_Proc(unsigned char ucSeg_Val)
{unsigned char i;for(i=0; i<7; i++)pucSeg_Buf[i] = pucSeg_Buf[i+1];	if(ucSeg_Val < 14)pucSeg_Buf[i] = ucSeg_Val-4+'0';elsepucSeg_Buf[i] = ucSeg_Val-14+'A';
}

总结

实现了用数码管显示按键键值


http://chatgpt.dhexx.cn/article/d4r3JToT.shtml

相关文章

单片机STM32入门——(3)矩阵按键

单片机STM32入门——&#xff08;3&#xff09;矩阵按键 1.理论分析1.1键盘扫描方式1.2行扫描逻辑1.3列扫描逻辑 2.程序编写2.1按键扫描程序2.1.1按键初始化2.1.2按键扫描程序头文件2.1.3行扫描函数2.1.3列扫描函数 2.2主程序 1.理论分析 1.1键盘扫描方式 我们所用到的键盘为…

51单片机之按键(独立按键矩阵按键)

难的东西学不会是因为简单的知识没学好 基础不牢&#xff0c;地动山摇 按键 1.1基础温习 &#xff08;1&#xff09;按键的物理结构 &#xff08;2&#xff09;单片机引脚有两种状态&#xff08;I/O&#xff09;输入【读】或者输出【写】 &#xff08;3&#xff09;上拉电阻…

51学习-矩阵按键篇

使用并行接口方式连接键盘&#xff0c;对独立式键盘而言&#xff0c;8根I/O口线可以接 **8** 个按键&#xff0c;而对矩阵式键盘而言&#xff0c;8根I/O口线最多可以接 **64** 个按键。 项目(工程)的时候&#xff0c;我们经常要用到比较多的按键&#xff0c;而且IO资源紧张&am…

4x4矩阵按键应用详解

一.简介 4x4矩阵按键是单片机外部设备中所使用的排布类似于矩阵的按键组。显然矩阵按键的使用要比独立按键要复杂一些&#xff0c;编程也要复杂一些&#xff0c;但可以单片机IO资源。4x4矩阵按键即分为4组列线&#xff0c;4组行线&#xff0c;并将行线所接的单片机的I/O口作为…

独立按键和矩阵按键c语言,第八章 独立按键和矩阵按键

我们和单片机之间进行信息交互,主要包含两大类,输入设备和输出设备。前边讲的LED小灯、数码管、点阵都是输出设备,这节课我们学习一下最常用的输入设备——按键。在本节课的学习过程中我们还会穿插介绍一点硬件设计的基础知识。 8.1单片机最小系统电路解析 8.1.1电源 我们在…

单片机 矩阵式按键

单片机 矩阵式按键 一、简述 在单片机应用系统中&#xff0c;通过按键实现数据输入及功能控制是非常普遍的&#xff0c;通常在所需按键数量不多时&#xff0c;系统常采用独立式按键。需要按键数量比较多&#xff0c;为了减少I/O口的占用&#xff0c;通常将按键排列成矩阵。测…

矩阵按键原理和BUG

当我们的电路有很多按键时&#xff0c;一般会采用矩阵方式与单片机相连来减少对单片机IO的浪费&#xff0c;如下图方式。 这个电路的原理: 1、比如检测S13是否按下&#xff0c;单片机把Line4设为输出&#xff0c;并输出低电平&#xff0c;而Line3、Line2、Line1设为开路输入&…

关于矩阵按键

前段时间老师讲了矩阵按键&#xff0c;就把程序的理解写下来 看图片&#xff0c;只有主函数和串口。串口在此用来发送我们的按键值&#xff0c;波特率9600&#xff0c;频率11.0592。 我们用的是4*4矩阵按键 我们的矩阵按键连在了单片机的P0口&#xff08;stc15f2k60s2&#xf…

独立按键和矩阵按键c语言,单片机独立按键与矩阵按键原理图

当前位置:电工之家 > 电工知识 > 单片机 > 正文 单片机独立按键与矩阵按键原理图 时间:2017-02-22 12:40 来源:电工之家 单片机独立按键与矩阵按键原理图 独立按键 通常的按键分为独立式按键和矩阵式按键两种,独立式按键比较简单,并且与独立的输入线相连接,如图13…

【按键扫描】矩阵按键之多按键扫描

前言 上一章我们介绍了经典矩阵键盘的实现方法&#xff0c;但是示例程序中仅实现了单按键检测功能。虽说单按键已经基本可以覆盖矩阵键盘的常见需求&#xff0c;但在一些特殊应用场合&#xff0c;我们仍然需要多按键识别操作&#xff0c;或者一些类似电脑组合按键的功能支持。…

STM32矩阵按键

矩阵按键原理 本实验使用STM32F103单片机&#xff0c;主题代码通用的。 如果每个按键占用一个GPIO引脚&#xff0c;对于使用多个按键来说就是一种资源的浪费&#xff0c;因此当我们在设计时&#xff0c;可以考虑矩阵这种方式。本实验使用4*4也就是16个按键。 矩阵按键相对于独立…

【按键扫描】独立按键与矩阵按键

按键介绍 我们通常提到按键&#xff0c;一般是指按键开关&#xff0c;也称为轻触开关。轻触开关是最常用的几种电子元器件之一&#xff0c;被各种电子产品广泛使用。 轻触开关与普通开关类似&#xff0c;但又略有不同。普通开关有闭合与断开两种状态&#xff0c;切换后状态会…

矩阵按键实验

矩阵按键简介 以 4*4 矩阵键盘为例。 16 个按键被排成 4 行 4 列&#xff0c;第一行将每个按键的一端连接在一起构成行线&#xff0c;第一列将每个按键的另一端连接在一起构成列线&#xff0c;这样便一共有 4 行 4 列共 8 根线&#xff0c;如图所示&#xff1a; 将这 8 根线连接…

51单片机学习记录(五)矩阵按键

文章目录 1、矩阵按键的控制原理2、矩阵按键实现1、行列式法实现矩阵按键2、线翻转法实现矩阵按键3、按键实战 1、矩阵按键的控制原理 独立按键与单片机连接时&#xff0c; 每一个按键都需要单片机的一个 I/O 口&#xff0c; 若某单片机系统需较多按键&#xff0c; 如果用独立…

51单片机矩阵键盘扫描及使用方法

一、矩阵键盘简介 矩阵键盘&#xff0c;也称矩阵按键&#xff0c;是为了节约单片机IO口占用所引入的一种外设。 &#xff08;图片截取至普中A2开发板原理图&#xff09; &#xff08;图片截取至普中A2开发板实物图&#xff09; 我们知道&#xff0c;一个独立按键需要1个IO口。但…

单片机编辑库四之矩阵按键

单片机编辑库一之延时与led灯 单片机编辑库二之按键 单片机编辑库三之蜂鸣器 单片机编辑库四之矩阵按键 之前为大家介绍了独立按键的原理和使用方法&#xff0c;这一章给大家带来一个升级体验——矩阵按键&#xff0c;话不多说&#xff0c;直接开始今天的内容。 一、矩阵按键…

51单片机——矩阵按键实验,小白讲解,相互学习

矩阵按键介绍&#xff1a; 独立按键与单片机连接时&#xff0c;每一个按键都需要单片机的一个I/O 口&#xff0c;若某单片机系统需较多按键&#xff0c;如果用独立按键便会占用过多的I/O 口资源.单片机系统中I/O 口资源往往比较宝贵&#xff0c;当用到多个按键时为了减少I/O 口…

STM32----矩阵按键

一、实物图 二、开发流程 分析&#xff1a;对于矩阵按键&#xff0c;我们一般采用行列扫描反转的方法进行开发&#xff0c;分别把每一个引脚连接一个GPIO口并设置一半成通用推挽输出模式&#xff0c;一半为上拉输入模式&#xff0c;行列扫描反转进行判断按击的按键来判断行列从…

(五)矩阵按键

本章我们主要是写矩阵键盘的内容&#xff0c;矩阵键盘的原理和独立按键的按键原理基本是类似的&#xff0c;只是关于整个的原理还是要有些介绍&#xff0c;本章我们通过矩阵按键的某个按键按下&#xff0c;然后在数码管上输出对应的按键值。 1.关于按键 可以看前面按键的内容…

【STM32 基础实验矩阵按键】

文章目录 一、元器件矩阵键盘说明二、基于stm32f10c8t6 基础实验矩阵按键&#xff08;1&#xff09;实验功能实现说明&#xff08;2&#xff09;矩阵键盘原理&#xff08;3&#xff09;代码部分&#xff08;4&#xff09;效果展示 三、总结与扩展附上参考文献链接与视频链接出处…