STM32F103RCT6键盘实验

2023-10-31 19:40
文章标签 键盘 实验 stm32f103rct6

本文主要是介绍STM32F103RCT6键盘实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原理:

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
由图可得:

  • KEY0的IO口为PC5,按下后低电平,所以配置为上拉输入
  • KEY1的IO口为PA15,按下后低电平,所以配置为上拉输入
  • WK_UP的IO口为PA0,按下后高电平,所以配置为下拉输入
原因:
由于按键在没有外界输入的情况下输入端是悬空的,它的电平是未知的
所以上拉电阻就是为了保证无信号输入时输入端的电平为高电平,
同样还有下拉电阻它是为了保证无信号输入时输入端的电平为低电平。

GPIO口配置完成后,剩下读取函数:

unsigned char KeyScan()
{static unsigned char key_up = 1;   //按键按下标记按钮if((key_up == 1)&&(KEY0 == 0||KEY1 == 0||KEY_UP == 1)){delay_ms(10);//消抖延时key_up = 0;//按下确实按下,标记为0if(KEY0 == 0) return KEY0_PRESS;else if(KEY1 == 0) return KEY1_PRESS;else if(KEY_UP == 1) return KEY_UP_PRESS;}else if(KEY0 == 1&&KEY1 == 1&&KEY_UP == 0) //按键抬起{key_up = 1;//按键抬起标记为1}		return 0;
}

注意点:

1.使能时钟函数是APB2!!!!

 void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

2.多多使用宏定义,很方便,很简洁,例如:

 #define KEY_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)   //直接读取KEY_UP#define LED1 PAout(8)    //直接操作LED1

主要代码:

main.c

******************************************************************************
* 文件名:按键实验
* 描  述: 按下KEY0,DS0变化,按下KEY1,DS1变化,按下WK_UP两个灯都变化
* 作  者:思索与猫
* 日  期: 19/4/4
* 备  注: 
*         
******************************************************************************
#include "stm32f10x.h"                  // Device header
#include<sys.h>
#include<led.h>
#include<key.h>
#include<delay.h>int main()
{unsigned char key_value = 0;delay_init();LED_init();KEY_Init();while(1){key_value = KeyScan();switch(key_value){case KEY0_PRESS:LED0 = !LED0;break;       case KEY1_PRESS:LED1 = !LED1;break;case KEY_UP_PRESS:LED0 = !LED0;LED1 = !LED1;break;default:delay_ms(10);}}				
}

key.h

#ifndef __KEY_H
#define __KEY_H
#include<sys.h>#define KEY0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)
#define KEY1 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)
#define KEY_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)#define KEY0_PRESS 1
#define KEY1_PRESS 2
#define KEY_UP_PRESS 3void KEY_Init(void);
unsigned char KeyScan(void);#endif 

key.c

#include "stm32f10x.h"                  // Device header
#include<key.h>
#include<delay.h>void KEY_Init()
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//KEY_UPGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;   //D就是DOWN,下拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_Init(GPIOA,&GPIO_InitStructure);//KEY_1GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   //U就是UP,上拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_Init(GPIOC,&GPIO_InitStructure);//KEY_0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   //U就是UP,上拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;GPIO_Init(GPIOA,&GPIO_InitStructure);
}unsigned char KeyScan()
{static unsigned char key_up = 1;if((key_up == 1)&&(KEY0 == 0||KEY1 == 0||KEY_UP == 1)){delay_ms(10);key_up = 0;if(KEY0 == 0) return KEY0_PRESS;else if(KEY1 == 0) return KEY1_PRESS;else if(KEY_UP == 1) return KEY_UP_PRESS;}else if(KEY0 == 1&&KEY1 == 1&&KEY_UP == 0){key_up = 1;}return 0;
}

led.h

#ifndef __LED_H
#define __LED_H
#include<sys.h>#define LED1 PAout(8)
#define LED0 PDout(2)void LED_init(void);#endif

led.c

#include<led.h>
#include "stm32f10x.h"                  // Device headervoid LED_init()
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);//ST_LINK使用SW,不使用JTAG,可以省出IO口//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_8);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD,&GPIO_InitStructure);GPIO_SetBits(GPIOD,GPIO_Pin_2);
}

这篇关于STM32F103RCT6键盘实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/317665

相关文章

键盘快捷键:提高工作效率与电脑操作的利器

键盘快捷键:提高工作效率与电脑操作的利器 在数字化时代,键盘快捷键成为了提高工作效率和优化电脑操作的重要工具。无论是日常办公、图像编辑、编程开发,还是游戏娱乐,掌握键盘快捷键都能带来极大的便利。本文将详细介绍键盘快捷键的概念、重要性、以及在不同应用场景中的具体应用。 什么是键盘快捷键? 键盘快捷键,也称为热键或快捷键,是指通过按下键盘上的一组键来完成特定命令或操作的方式。这些快捷键通常涉及同

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

如何快速练习键盘盲打

盲打是指在不看键盘的情况下进行打字,这样可以显著提高打字速度和效率。以下是一些练习盲打的方法: 熟悉键盘布局:首先,你需要熟悉键盘上的字母和符号的位置。可以通过键盘图或者键盘贴纸来帮助记忆。 使用在线打字练习工具:有许多在线的打字练习网站,如Typing.com、10FastFingers等,它们提供了不同难度的练习和测试。 练习基本键位:先从学习手指放在键盘上的“家位”开始,通常是左手的

推荐练习键盘盲打的网站

对于初学者来说,以下是一些推荐的在线打字练习网站: 打字侠:这是一个专业的在线打字练习平台,提供科学合理的课程设置和个性化学习计划,适合各个水平的用户。它还提供实时反馈和数据分析,帮助你提升打字速度和准确度。 dazidazi.com:这个网站提供了基础的打字练习,适合初学者从零开始学习打字。 Type.fun打字星球:提供了丰富的盲打课程和科学的打字课程设计,还有诗词歌赋、经典名著等多样

61.以太网数据回环实验(4)以太网数据收发器发送模块

(1)状态转移图: (2)IP数据包格式: (3)UDP数据包格式: (4)以太网发送模块代码: module udp_tx(input wire gmii_txc ,input wire reset_n ,input wire tx_start_en , //以太网开始发送信

LTspice模拟CCM和DCM模式的BUCK电路实验及参数计算

关于BUCK电路的原理可以参考硬件工程师炼成之路写的《 手撕Buck!Buck公式推导过程》.实验内容是将12V~5V的Buck电路仿真,要求纹波电压小于15mv. CCM和DCM的区别: CCM:在一个开关周期内,电感电流从不会到0. DCM:在开关周期内,电感电流总会到0. CCM模式Buck电路仿真: 在用LTspice模拟CCM电路时,MOS管驱动信号频率为100Khz,负载为10R(可自

HCIA--实验十:路由的递归特性

递归路由的理解 一、实验内容 1.需求/要求: 使用4台路由器,在AR1和AR4上分别配置一个LOOPBACK接口,根据路由的递归特性,写一系列的静态路由实现让1.1.1.1和4.4.4.4的双向通信。 二、实验过程 1.拓扑图: 2.步骤: (下列命令行可以直接复制在ensp) 1.如拓扑图所示,配置各路由器的基本信息: 各接口的ip地址及子网掩码,给AR1和AR4分别配置

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

Android 进入页面后默认不弹出系统键盘

在onCreate中加入一行代码getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);