GPIO基本配置之按键输入操作(通过按键控制小灯的翻转)

KEY0 对用端口PE4,KEY1 对用端口PE3,这两个按键是一段接地,另一端接单片机。
KEYWKUP 对用端口PA0,这个按键是一段接高电平,另一端接片机。


key.h

#ifndef __KEY_H
#define __KEY_H
#include"stm32f10x.h"

#define KEY0_PIN GPIO_Pin_4
#define KEY0_PORT GPIOE
#define KEY1_PIN GPIO_Pin_3
#define KEY1_PORT GPIOE
#define KEYWKUP_PIN GPIO_Pin_0
#define KEYWKUP_PORT GPIOA

#define key0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) //读取按键0的值 并赋值给key0
#define key1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) //读取按键1的值 并赋值给key1
#define key_wkup GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) //读取按键2的值 并赋值给key_wkup

typedef enum
{ key0_value=1, key1_value=2,key_wkup_value=3 }key_value; //将3个按键返回值定义成int,用来给按键扫描不同按键返回值使用

void key_init(void); //按键GPIO初始化
u8 key_scan( u8 ); //按键扫描函数

#endif


key.c

#include"key.h"
#include"stm32f10x.h"
#include"delay.h"

void key_init(void)
{
GPIO_InitTypeDef GPIO_Initstructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE); //使能PA,PE端口时钟

GPIO_Initstructure.GPIO_Mode=GPIO_Mode_IPD; //下拉输入
GPIO_Initstructure.GPIO_Pin=KEYWKUP_PIN; //PA.0
GPIO_Init(KEYWKUP_PORT,&GPIO_Initstructure);

GPIO_Initstructure.GPIO_Mode=GPIO_Mode_IPU; //上拉输入
GPIO_Initstructure.GPIO_Pin=KEY0_PIN | KEY1_PIN; //PE.3 PE.4
GPIO_Init(KEY0_PORT,&GPIO_Initstructure);
}

//按键处理函数
//返回按键值
//0,没有任何按键按下
//1,KEY0按下
//2,KEY1按下
//3,KEY3按下 WK_UP
//注意此函数有响应优先级, key0>key1>wake_up

u8 key_scan(u8 mode) //mode:0,不支持连续按;1,支持连续按;
{
u8 key_pre=0; //定义一个按键值,供不同按键返回
static u8 key_up = 1; //按键松开标志(静态局部变量实际上就是一个特殊的全局变量)
if ( mode == 1 ) key_up = 1; //按键模式调整
if(key_up && (key0==0 || key1==0 || key_wkup==1) ) //如果按键按下
{
delay_ms(10);//去抖动
key_up=0;
if(key0==0) key_pre=key0_value;
else if(key1==0) key_pre=key1_value;
else if(key_wkup==1) key_pre=key_wkup_value;
}
else if(key0==1 && key1==1 && key_wkup==0) key_up=1;
return key_pre; // 返回按键键值
}


main.c

int main(void)
{
delay_init(); //初始化延时函数
led_init(); //初始化LED端口
key_init(); //初始化按键端口
  while(1)
  {
    switch(key_scan(0)) //模式0,不支持联按
    {
      case key0_value:
        GPIO_WriteBit(LED0_PORT,LED0_PIN,(BitAction)(1-GPIO_ReadOutputDataBit(LED0_PORT,LED0_PIN))); break; //按键0,led0翻转
      case key1_value:
        GPIO_WriteBit(LED1_PORT,LED1_PIN,(BitAction)(1-GPIO_ReadOutputDataBit(LED1_PORT,LED1_PIN))); break; //按键1,led1翻转
      case key_wkup_value:
         GPIO_WriteBit(LED0_PORT,LED0_PIN,(BitAction)(1-GPIO_ReadOutputDataBit(LED0_PORT,LED0_PIN)));//按键0,led0翻转
         GPIO_WriteBit(LED1_PORT,LED1_PIN,(BitAction)(1-GPIO_ReadOutputDataBit(LED1_PORT,LED1_PIN)));//按键1,led1翻转
           break;
    }
    delay_ms(50);
  }
}

(二)stm32f103~~GPIO基本操作二(按键)的更多相关文章

  1. (一)stm32f103~~GPIO基本操作一(led灯)

    GPIO基本操作,如果更换IO口只需要更换端口设置即可 led.h文件 #ifndef __LED_H #ifndef __LED_H #define __LED_H #include "s ...

  2. 二、Redis基本操作——String(实战篇)

    小喵万万没想到,上一篇博客,居然已经被阅读600次了!!!让小喵感觉压力颇大.万一有写错的地方,岂不是会误导很多筒子们.所以,恳请大家,如果看到小喵的博客有什么不对的地方,请尽快指正!谢谢! 小喵的唠 ...

  3. Swift2.0 中的String(二):基本操作

    Swift中的字符串,第二篇,基本操作.其他的几篇传送门(GitHub打不开链接的同学请自行把地址github改成gitcafe,或者直接去归档里找:-P): Swift2.0 中的String(一) ...

  4. 【MongoDB详细使用教程】二、MongoDB基本操作

    目录 数据类型 数据库操作 集合操作 数据操作 增 查 改 修改整行 修改指定字段的值 删 数据类型 MongoDB常见类型 说明 Object ID 文档ID String 字符串,最常用,必须是有 ...

  5. Arduboy基本操作(二)

    Arduboy基本操作(二) 方向键控制物体移动 #include<Arduboy.h> Arduboy arduboy; int i,j; void setup() { arduboy. ...

  6. Lucene.Net 2.3.1开发介绍 —— 二、分词(二)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(二) 1.2.分词的过程 1.2.1.分词器工作的过程 内置的分词器效果都不好,那怎么办?只能自己写了!在写之前当然是要先看看内置的分词 ...

  7. c#简单实现二维数组和二维数组列表List&lt;&gt;的转置

    刚看到网上一篇文章里用sql实现了行列转置.sql server 2005/2008只用一个pivot函数就可以实现sql server 2000很多行的复杂实现.提到转置,立刻想起还在求学阶段曾经做 ...

  8. TI-RTOS 之 GPIO中断(按键)

    TI-RTOS 之 GPIO中断(按键) 前面已经用过LED, 定时器,这次来了解GPIO的中断是怎么用的,从CC1310+TI-RTOS的例程可以直接找到相应的例子程序,它的关键是在于要使能中断,也 ...

  9. 剑指offer二十六之二叉搜索树与双向链表

    一.题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二.思路 对二叉搜索树中序遍历的结果即为排序的结果,在中序遍历的过程中,建 ...

随机推荐

  1. 《Java》第六周学习总结

    本周我学习了第七章和第十章的内容 包括:内部类,匿名类,异常类,断言的使用 File类,文件字节输入输出流,缓冲流,数据流,对象流,scanner的使用扩展还有文件锁等内容令我印象深刻 问题: 在编译 ...

  2. PMP知识点(二)——三点估算的两种方法对活动持续时间估算的影响和如何取舍

    一.准备工作 活动持续时间的估算属于PMBOK中第六章项目时间管理中第五节6.6估算活动持续时间的内容. 三点估算是6.5和7.2(估算成本)中应用到的一种工具和技术.数据流向图参考如下: 其应用到的 ...

  3. 20155324《网络对抗》Exp07 网络欺诈防范

    20155324<网络对抗>Exp07 网络欺诈防范 实践内容 简单应用SET工具建立冒名网站 ettercap DNS spoof 结合应用两种技术,用DNS spoof引导特定访问到冒 ...

  4. Contest2163 - 2019-3-28 高一noip基础知识点 测试6 题解版

    传送门 @dsfz201814 改题 T1:全锕,过 T2:全锕,过 T3:@dsfz201814 先用竖着放置的木块将它变成高度差最大为1的数列 然后对于任意相邻相等的两块,可以将它看成任意 例如, ...

  5. HDU-1028 Ignatius and the Princess III(生成函数)

    题意 给出$n$,问用$1$到$n$的数字问能构成$n$的方案数 思路 生成函数基础题,$x^{n}$的系数即答案. 代码 #include <bits/stdc++.h> #define ...

  6. 深度学习与NLP简单应用

    在深度学习中,文本分类的主要原型:Text  label,坐边是输入端“X”,右边是输出端“Y”.行业baseline:用BoW(bag of words)表示sentences(如何将文本表达成一 ...

  7. 《模式分类(原书第二版)》pdf格式下载电子书免费下载

    <模式分类(原书第二版)>pdf格式下载电子书免费下载: https://u253469.ctfile.com/fs/253469-302448505 内容简介 <模式分类>( ...

  8. JAVA进阶22

    1.接口默认方法的使用 ①接口的默认方法可以通过接口实现类对象直接调用. ②接口的默认方法也可以被接口实现类进行覆盖重写 package cn.intcast.demo17; public inter ...

  9. python&JSONP(初级篇)

    JSONP产生背景 1.跨域的安全限制都是对浏览器端来说的,服务器端是不存在跨域安全限制的. 2.浏览器的同源策略限制从一个源加载的文档或脚本与来自另一个源的资源进行交互. 3.如果协议,端口和主机对 ...

  10. JAVA学习笔记(2)—— java初始化三个原则

    1. 初始化原则 (1)   静态对象(变量)优先于非静态对象(变量)初始化,其中静态对象(变量)初始化一次,非静态对象(变量)可能会初始化多次. (2)   父类优先于子类初始化 (3)   按照成 ...