IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32F407学习笔记2(采用正点原子探索者) -> 正文阅读

[嵌入式]STM32F407学习笔记2(采用正点原子探索者)

借鉴正点原子教学代码和模板

蜂鸣器懒得做

按键输入:

步骤:

1.初始化IO时钟

2.初始化PE2,3,4,上拉,PA1.下拉,当KEY0,1,2按下时,PE2,3,4,与地相连,PA1与电源输入相连。

3.编写输入捕获函数void KEY_Scan(mode) // mode用于选择按键为点按还是长按。key_up用 于表示按键是否松开。

当mode=0时,key_up不恢复为1,只捕获一次按键

当mode=1时,每次采集前key_up恢复为1,一直捕获按键输入

key.h

#ifndef __KEY_H
#define __KEY_H

#include "stm32f4xx_gpio.h"
#include "stm32f4xx.h"

#define KEY0_PIN                  GPIO_Pin_4
#define KEY1_PIN                  GPIO_Pin_3
#define KEY2_PIN                  GPIO_Pin_2
#define WK_UP_PIN                 GPIO_Pin_2
#define KEY_GPIO                           GPIOE       
#define WK_UP_GPIO                       GPIOA 
#define KEY_GPIO_CLK                 RCC_AHB1Periph_GPIOE
#define WK_UP_GPIO_CLK               RCC_AHB1Periph_GPIOA

/*读取端口输入*/
#define KEY0                                            GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) //PE4
#define KEY1                                             GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) //PE3
#define KEY2                                             GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) //PE2
#define WK_UP                                         GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) //PA0

#define KEY0_PRES                                 1
#define KEY1_PRES                                 2
#define KEY2_PRES                                 3
#define WKUP_PRES                                 4

void KEY_Init(void);
u8 KEY_Scan(u8 mode);

#endif
key.c

#include "key.h"
#include "delay.h"
void KEY_Init(void)
{
    RCC_AHB1PeriphClockCmd(KEY_GPIO_CLK |KEY_GPIO_CLK ,ENABLE);
    RCC_AHB1PeriphClockCmd(WK_UP_GPIO_CLK ,ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructe;
    
    GPIO_InitStructe.GPIO_Pin = KEY0_PIN |KEY1_PIN |KEY2_PIN ;    //PE2,PE3,PE4
  GPIO_InitStructe.GPIO_Mode = GPIO_Mode_IN;                                    //输入模式
  GPIO_InitStructe.GPIO_Speed = GPIO_Speed_100MHz;                        //100MHz
  GPIO_InitStructe.GPIO_PuPd = GPIO_PuPd_UP;                                    //上拉
    GPIO_Init(KEY_GPIO,&GPIO_InitStructe);
    
    GPIO_InitStructe.GPIO_Pin = WK_UP_PIN  ;                                        //PA1
  GPIO_InitStructe.GPIO_Mode = GPIO_Mode_IN;                                    //输入模式
  GPIO_InitStructe.GPIO_Speed = GPIO_Speed_100MHz;                        //100MHz
  GPIO_InitStructe.GPIO_PuPd = GPIO_PuPd_DOWN;                                //下拉
    GPIO_Init(WK_UP_GPIO,&GPIO_InitStructe);
}

u8 KEY_Scan(u8 mode)
{
    static u8 key_up=1;
    if(mode)                                                                                        //选择模式,0,点按 1,长按
    {
        key_up=1;                                                                                    //按下标志
    }
    if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))        //若为点按,第二轮跳过
    {
        delay_ms(10);                                                                            //防抖
        key_up=0;                                                                                    //清除按下标志
        if (KEY0==0) return KEY0_PRES;
        if (KEY1==0) return KEY1_PRES;
        if (KEY2==0) return KEY2_PRES;
        if (WK_UP==1) return WKUP_PRES;
    }
    else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)                //按钮松开时复位
    {
        key_up=1;
    }
    return 0;
}
main.c

#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"


int main(void)
{
    delay_init(168);
    LED_Init();
    KEY_Init();
    PWM_Init(500,84);
    
    u8 key;
    u16 ledpwm=0;
    u8 chang_flag=1;
    LED0(OFF);
    LED1(OFF);
    
  while(1)
    {
        key=KEY_Scan(0);
        if(key)
        {
            switch(key)
            {
                case KEY0_PRES:
                    LED0(ON);
                    LED1(OFF);
                    break;
                case KEY1_PRES:
                    LED0(OFF);
                    LED1(ON);
                    break;
                case KEY2_PRES:
                    LED0(ON);
                    LED1(OFF);
                      delay_ms(500);
                    LED0(OFF);
                    LED1(ON);
                       delay_ms(500);
                case WKUP_PRES:
                    LED0(OFF);
                    LED1(OFF);
                    break;
            }
            key=0;
        }
        else delay_ms(10);
    }
}
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-02 11:32:57  更:2021-09-02 11:33:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:33:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码