1. 按键实验

查询原理图可知KEY对应的按键和引脚,当KEY按下时,引脚为低电平,否则为高电平

2. 代码

2.1 GPIO

为了方便GPIO的编写,建立GPIO的文件夹和对应的.h和.c文件。

bsp_gpio.h

/* 为了方便gpio的驱动编写,编写一个gpio驱动文件 */
#ifndef __BSP_GPIO
#define __BSP_GPIO
#include "imx6ul.h" /* 枚举类型和结构体定义 */
typedef enum _gpio_pin_direction
{
// 0U和1U是无符号整型的0和1
kGPIO_DigitalInput = 0U, /* 输入 */
kGPIO_DigitalOutput = 1U, /* 输出 */
} gpio_pin_direction_t; /* GPIO 配置结构体 */
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); #endif // !__BSP_GPIO

bsp_gpio.c

#include "bsp_gpio.h"
/*
* @description : GPIO 初始化。
* @param - base : 要初始化的 GPIO 组。
* @param - pin : 要初始化 GPIO 在组内的编号。
* @param - config : GPIO 配置结构体。
* @return : 无
*/
void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config)
{
// base是GPIO的类型,比如DR,GDIR等
// 我们一般操作用这两个比较多,比如配置输入输出
// pin是第几个脚
if(config->direction == kGPIO_DigitalInput) /* 输入 */
{
base->GDIR &= ~( 1 << pin);
}else {/* 输出 */
base->GDIR |= 1 << pin;
gpio_pinwrite(base, pin, config->outputLogic);/* 默认输出电平 */
}
}
/*
* @description : 读取指定 GPIO 的电平值 。
* @param – base : 要读取的 GPIO 组。
* @param - pin : 要读取的 GPIO 脚号。
* @return : 无
*/
int gpio_pinread(GPIO_Type *base, int pin)
{
return (((base->DR) >> pin) & 0x1);
}
/*
* @description : 指定 GPIO 输出高或者低电平 。
* @param – base : 要输出的的 GPIO 组。
* @param - pin : 要输出的 GPIO 脚号。
* @param – value : 要输出的电平,1 输出高电平, 0 输出低低电平
* @return : 无
*/
void gpio_pinwrite(GPIO_Type *base, int pin, int value)
{
if (value == 0U)
{
base->DR &= ~(1U << pin); /* 输出低电平 */
}else{
base->DR |= (1U << pin); /* 输出高电平 */
}
}

2.2 key文件的编写

key.h

#ifndef __BSP_KEY
#define __BSP_KEY
#include "imx6ul.h"
/* 定义按键值 */
enum keyvalue{
KEY_NONE = 0,
KEY0_VALUE, //默认是1
}; /* 函数声明 */
void key_init(void);
int key_getvalue(void);
#endif // !__BSP_KEY

key.c

#include "bsp_key.h"
#include "bsp_gpio.h"
#include "bsp_delay.h" void key_init()
{
gpio_pin_config_t key_config;
/* 初始化IO复用,为GPIO */
IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0);
/* 2、、配置 UART1_CTS_B 的 IO 属性
*bit 16:0 HYS 关闭
*bit [15:14]: 11 默认 22K 上拉
*bit [13]: 1 pull 功能
*bit [12]: 1 pull/keeper 使能
*bit [11]: 0 关闭开路输出
*bit [7:6]: 10 速度 100Mhz
*bit [5:3]: 000 关闭输出
*bit [0]: 0 低转换率
*/
IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0xF080); /* 初始化这个GPIO为输入 */
key_config.outputLogic = kGPIO_DigitalInput;
gpio_init(GPIO1, 18, &key_config);
} /*
* @description : 获取按键值
* @param : 无
* @return : 0 没有按键按下,其他值:对应的按键值
*/
int key_getvalue(void)
{
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) /* KEY0 未按下 */
{
ret = 0;
release = 1; /* 标记按键释放 */
}
return ret;
}

main.c

#include "imx6ul.h"
#include "bsp_led.h"
#include "bsp_clk.h"
#include "bsp_delay.h"
#include "bsp_beep.h"
#include "bsp_key.h"
#include "bsp_key.h"
/*
* @description : mian函数
* @param : 无
* @return : 无
*/
int main(void)
{
clk_enable(); /* 使能所有的时钟 */
led_init(); /* 初始化led */
beep_init(); /* 初始化beep */
key_init(); /* 初始化key */ int i = 0;
int keyvalue = 0;
unsigned char beep_state = OFF;
unsigned char led_state = OFF;
while(1) /* 死循环 */
{
// if(key_getvalue())
// {
// led_on(); /* 打开LED */
// beep_on();
// }
// i++;
// if(i == 50)
// {
// i = 0;
// led_off();
// beep_off();
// }
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;
}

最新文章

  1. linux下服务端实现公网数据转发
  2. selenium web driver 配合使用testng
  3. 1.SQLAlchemy文档-简介(中文版)
  4. Angularjs学习——(一)
  5. USACO Section 2.4: Overfencing
  6. GB2312 Unicode转换表实现跨平台utf8转码unicode
  7. spring中jdbc的配置
  8. 在Win32程序中显示Dos调试窗口,可暂停(AllocConsole,WriteConsole,FreeConsole函数,GetStdHandle函数取得输入句柄)
  9. 33.Spring整合Struts2.md
  10. 使用IntelliJ IDEA的小技巧快乐编程(2)
  11. Anaconda使用指南
  12. [Swift]LeetCode930. 和相同的二元子数组 | Binary Subarrays With Sum
  13. Django小技巧——使用package管理app
  14. MybatisMapper 映射框架(增删改查 原始模式)
  15. 百度搜索推出惊雷算法严厉打击刷点击作弊行为-SEO公司分享
  16. LeetCode Permutaions II
  17. import变量名,导入模块
  18. C++笔记016:const 基础
  19. 【bzoj1878】[SDOI2009]HH的项链
  20. The 14th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple - F 贪心+二分

热门文章

  1. CAD网页Web端显示开发为什么要以WebGIS的思路来开发?
  2. 微信小程序中路由跳转
  3. DOS命令和快捷键
  4. Object.create 和 Object.assign
  5. 【数据结构与算法Python版学习笔记】树——二叉查找树 Binary Search Tree
  6. .net,C#,Vb,F#,Asp,Asp.net区别以及作用和方向
  7. netty入门实现简单的echo程序
  8. MD支持程度测试
  9. undefined reference to `recvIpcMsg(int, ipc_msg*)&#39;——#ifdef __cplusplus extern &quot;C&quot; { #endif
  10. VIVADO 2017.4配置MIG IP注意事项