08. 按键输入

news2024/11/22 15:43:20

08. 按键输入

  • 按键原理图
  • 代码编写
    • GPIO驱动代码
    • 按键驱动代码
    • 主函数
  • 加上清除BSS段,代码不运行

按键原理图

在这里插入图片描述
按键KEY0连接到了UART1_CTS上。默认情况下,KEY0为高,当按下KEY0后,UART1_CTS为低电平

代码编写

在bsp下创建一个key和一个gpio文件夹

  1. 设置UART1_CTS复用为GPIO1_IO88
  2. 设置UART1_CTS的电气属性
  3. 配置GPIO_IO08为输出模式
  4. 读取按键值,获取高低电平

GPIO驱动代码

bsp_gpio.h

#pragma once
#include "imx6ul.h"
typedef enum _gpio_pin_direction
{
	kGPIO_DigitalInpput = 0U,  // 输入
	kGPIO_DigitalOutput = 1U,  // 输出
} gpio_pin_direction_t;

typedef struct _gpio_pin_config
{
	gpio_pin_direction_t direction;	// GPIO方向,输入还是输出
	uint8_t outputLogic; 			// 如果是输出的话,默认输出电平
} gpio_pin_config_t;

void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config);
int gpio_pinread(GPIO_Type *base, int pin);
void gpio_pinwrite(GPIO_Type *base, int pin, int value);

bsp_gpio.c

#include "bsp_gpio.h"
void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config)
{
	if(config->direction == kGPIO_DigitalInput) // 输入
	{
		base->GDIR &= ~(1 << pin);
	}
	else 										// 输出
	{
		base->GDIR |= 1 << pin;
		gpio_pinwrite(base, pin, config->outputLogic); // 默认输出电平
	}	
}

int gpio_pinread(GPIO_Type *base, int pin)
{
	return (((base->DR) >> pin) & 0x1);
}

// 指定GPIO输出高低电平
void gpio_pinwrite(GPIO_Type *base, int pin, int value)
{
	if(value == 0U)
	{
		base->DR &= ~(1U<<pin); // 输出低电平
	}
	else
	{
		base->DR |= (1U<<pin);  // 输出高电平
	}
}

按键驱动代码

bsp_key.h

#include "imx6ul.h"
// 定义按键键值
enum keyvalue
{
	KEY_NONE = 0,
	KEY_VALUE,
};

void key_init();
int key_getvalue();

bsp_key.c

void key_init()
{
	gpio_pin_config_t key_config;
	IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0); // 复用为GPIO1_IO18
	IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0xf080);
	key_config.direction = kGPIO_DigitalInput;
	gpio_init(GPIO1, 18, &key_config);
}

int key_getvalue()
{
	int ret = 0;
	static unsigned char release = 1; // 按键松开
	
	if((release == 1)&&(gpio_pinread(GPIO1, 18)==0)) // key0按下
	{
		delay(10); 
		release = 0; // 标记按键按下
		if(gpio_pinread(GPIO1, 18)==0)
			ret = KEY0_VALUE;
	}
	else if(gpio_pinread(GPIO1, 18) == 1)
	{
		ret = 0;
		release = 1; // 标记按键释放
	}
	return ret;
}

主函数

#include "bsp_clk.h"
#include "bsp_delay.h"
#include "bsp_led.h"
#include "bsp_beep.h"
#include "bsp_key.h"

int main()
{
	int i = 0;
	int keyvalue = 0;
	unsigned char led_state = OFF;
	unsigned char beep_state = OFF;

	clk_enable();
	led_init();
	beep_init();
	key_init();

	while(1)
	{
		keyvalue = key_getvalue();
		if(keyvalue)
		{
			switch(keyvalue)
			{
				case KEY0_VALUE:
					beep_state = !beep_state;
					beep_switch(beep_state);
					break;
			}
		}
		i++;
		if(i==50)
		{
			i = 0;
			led_state = !led_state;
			led_switch(LED0, led_state);
		}
		delay(10);
	}
	return 0;
}

makefile文件
修改TARGET为key,INCDIRS和SRCDIRS中追加gpio和key的路径

加上清除BSS段,代码不运行

__bss_start=0x87800289。对于32位SOC来说,一般是以4字节访问的,因此会从0x87800288开始清除bss段,但是该地址不属于bss段,所以会出问题,也就需要我们进行内存对齐,即__bss_start=0x8780028c。就是在__bss_start之前进行. = ALIGN(4);然后再赋值

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

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

相关文章

减少磁盘读/写中延迟时间的方法(交替编号,错位命名)

目录 1.延迟时间的优化空间2.交替编号3.磁盘地址结构的设计1.若物理地址结构是&#xff08;盘面号&#xff0c;柱面号&#xff0c;扇区号&#xff09;2.若物理地址结构是&#xff08;柱面号&#xff0c;盘面号&#xff0c;扇区号) 4.错位命名 关于磁盘延迟时间的概念请看博主的…

AQS 关于锁与队列的关系

前面的文章中又介绍的在争用激烈的场景下&#xff0c;使用基于CAS自旋实现的轻量级锁有两个大的问题: (1)CAS恶性空自旋会浪费大量的CPU资源。 (2)在SMP架构的CPU上会导致“总线风暴”。 解决CAS恶性空白旋的有效方式之一是以空间换时间&#xff0c;较为常见的方案有两…

leetCode 229. 多数元素 II + k值摩尔投票法 + 进阶 + 优化空间

229. 多数元素 II - 力扣&#xff08;LeetCode&#xff09; 给定一个大小为 n 的整数数组&#xff0c;找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 进阶&#xff1a;尝试设计时间复杂度为 O(n)、空间复杂度为 O(1)的算法解决此问题。 &#xff08;1&#xff09;哈希表 class …

“RG-SMP 安全管理平台” 优化

全局添加ICO图标 管理强制重定向https <!-- \SMP\jboss\server\default\deploy\smp.war\common common_js.jsp --> <link rel"shortcut icon" href"data:image/x-icon;base64,AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAAAAAAA…

通俗易懂的GPT原理简介

GPT是自然语言处理领域中最受欢迎的模型之一。GPT全称为Generative Pre-trained Transformer&#xff0c;是一种基于Transformer模型的预训练语言模型。在接下来的文章中&#xff0c;我们将详细介绍GPT的原理。 一、前置知识 在了解GPT原理之前&#xff0c;需要了解以下一些基…

【2023年冬季】华为OD统一考试(B卷)题库清单(已收录345题),又快又全的 B 卷题库大整理

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、滑动窗口5、二叉树6、并查集7、栈 三、算法1、基础算法① 贪心算法② 二分查找③ 分治递归…

【Linux】-进程控制(深度理解写时拷贝、exit函数、return的含义以及makefile编译多个程序)-进程创建、进程终止、进程等待、进程程序替换

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

基于SSM的品牌手机销售信息系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

dash--项目的前端展示简单基础

1.前置工作 创建虚拟环境&#xff1a; sudo apt-get install python3-venv # 安装 python3 -m venv venv # 在本目录下创建venv虚拟环境&#xff08;也是一个文件夹。如果用不到这个虚拟环境以后就rm -rf venv&#xff09; source venv/bin/activate # 激活虚拟环境临时使用清华…

精通Nginx(01)-产品概览

Nginx是当今使用最广泛的 Web 服务器之一。2021年W3Techs 宣布&#xff0c; Nginx市场份额超越 Apache HTTP Server 成为全球最常用的 Web 服务器&#xff0c;最新Web Server排名如图所示&#xff08;实际超过4亿站点实用Nginx&#xff09;。 Nginx由Igor Sysoev在2001年创建&…

一年一度表白代码(动态表白)

效果图 # coding:utf-8 import sys import os import random import pygame from pygame.locals import *WIDTH, HEIGHT = 640, 480 BACKGROUND =

目标检测算法改进系列之添加EIOU,SIOU,AlphaIOU,FocalEIOU等

YOLOv8添加EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU等 yolov8中box_iou其默认用的是CIoU&#xff0c;其中代码还带有GIoU&#xff0c;DIoU&#xff0c;文件路径&#xff1a;ultralytics/yolo/utils/metrics.py&#xff0c;函数名为&#xff1a;bbox_iou 原始代码 def bbox_i…

Qt:关闭对话框,动画实现窗体逐渐缩小到消失

关键技术&#xff1a; 1、使用QPropertyAnimation对象&#xff0c;实现动画效果&#xff0c;逐渐缩小窗体尺寸&#xff0c;以及透明度&#xff1b; 2、在对话框缩小时&#xff0c;要将界面中的控件都隐藏起来&#xff0c;并且将对话框布局的Margin修改成0 代码如下&#xff…

机器学习 | 决策树算法

一、决策树算法概述 1、树模型 决策树&#xff1a;从根节点开始一步步走到叶子节点(决策)。所有的数据最终都会落到叶子节点&#xff0c;既可以做分类也可以做回归。 在分类问题中&#xff0c;表示基于特征对实例进行分类的过程&#xff0c;可以认为是if-then的集合&#xff0…

软件测试项目职责与分工、测试流程

一、项目职责与分工 1、产品经理 ------> 负责设计产品的原型图和PRD。 2、项目经理 ------>负责并保证高质量的产品按时完成和发布的专职管理人员。 3、开发人员 ------> 负责完成公司新产品开发计划&#xff1b;开发人员主要分为 前端开发、后端开发、IOS开发和安…

Linux rm命令:删除文件或目录

当 Linux 系统使用很长时间之后&#xff0c;可能会有一些已经没用的文件&#xff08;即垃圾&#xff09;&#xff0c;这些文件不但会消耗宝贵的硬盘资源&#xff0c;还是降低系统的运行效率&#xff0c;因此需要及时地清理。 rm 是强大的删除命令&#xff0c;它可以永久性地删除…

搞定蓝牙-第六篇(HID

搞定蓝牙-第六篇&#xff08;HID&#xff09; ble与HIDHOGPGAPP与HID ESP32程序分析 ble与HID HOGP 我们发现&#xff0c;电脑连接了蓝牙键盘就可以直接使用了&#xff0c;不需要配置任何东西&#xff0c;那么&#xff0c;这两者是怎么通讯的呢。我们使用的电脑windows系统内…

这个故事有点长 - 舟山

这个故事有点长 - 舟山 &#x1f449;故事的开始 这是一个很长的故事&#xff0c;到底有多长呢&#xff1f;大概也就有六七年那么长吧。刚来上海时就一直想去看海&#xff0c;后来终于如愿以偿了&#xff0c;具体记不清了&#xff0c;只记得当时坐了地铁&#xff0c;又坐了几个…

TensorRT量化实战课YOLOv7量化:YOLOv7-PTQ量化(一)

目录 前言1. YOLOv7-PTQ量化流程2. 准备工作3. 插入QDQ节点3.1 自动插入QDQ节点3.2 手动插入QDQ节点 前言 手写 AI 推出的全新 TensorRT 模型量化实战课程&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 该实战课程主要基于手写 AI 的 Latte 老师所出的 Tens…

一年一度表白代码(自定义表白)

代码有什么不懂可以私信我 动态画下面的效果图,自定义名字和表白词 源代码 import turtle import time# 画心形圆弧 def hart_arc():for i in range(200):turtle.right(1