zoukankan      html  css  js  c++  java
  • 按键

    机械弹性开关,当按键按下时,1和2,3和4导通

    低电平按下,高电平断开

    要消除抖动

    5ms~10ms

    硬件消除是RC

    软件消除是if语句delay_ms();

    按键按下,加下拉电阻,key_up,读到的是高电平,GPIO_Mode_IPD ,下拉,上升沿

    k1,k2,k3,加上拉电阻,下降沿

                                         

    key.c

    #include "key.h"
    #include "SysTick.h"

    void KEY_Init()
    {
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);

    GPIO_InitStructure.GPIO_Pin=KEY_UP_Pin;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD; //下拉电阻
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(KEY_UP_Port,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin=KEY_LEFT_Pin|KEY_DOWN_Pin|KEY_RIGHT_Pin;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //上拉电阻
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(KEY_Port,&GPIO_InitStructure);

    }
    //mode=0--单次扫描
    //mode=1--连续扫描
    u8 KEY_Scan(u8 mode)//按键扫描
    {
    static u8 key=1;//静态变量
    if(key==1&&(K_UP==1||K_LEFT==0||K_DOWN==0||K_RIGHT==0))//判断语句,有个按下,就为真
    {
    delay_ms(10);
    key=0;
    if(K_UP==1)//判断
    {
    return KEY_UP;
    }
    else if(K_LEFT==0)
    {
    return KEY_LEFT;
    }
    else if(K_DOWN==0)
    {
    return KEY_DOWN;
    }
    else
    {
    return KEY_RIGHT;
    }
    }
    else if(K_UP==0&&K_LEFT==1&&K_DOWN==1&&K_RIGHT==1)//如果没有按下,&&与运算,都
    {
    key=1;
    }
    if(mode==1)
    {
    key=1;
    }
    return 0;
    }

    key.h

    #ifndef _key_H
    #define _key_H

    #include "system.h"

    #define KEY_UP_Pin GPIO_Pin_0
    #define KEY_UP_Port GPIOA

    #define KEY_LEFT_Pin GPIO_Pin_2
    #define KEY_DOWN_Pin GPIO_Pin_3
    #define KEY_RIGHT_Pin GPIO_Pin_4
    #define KEY_Port GPIOE


    #define K_UP PAin(0)//输入的电平检测,位带
    #define K_LEFT PEin(2)
    #define K_DOWN PEin(3)
    #define K_RIGHT PEin(4)


    //#define K_UP ReadInputDataBit(KEY_UP_Port,KEY_UP_Pin)//库函数
    //#define K_LEFT ReadInputDataBit(KEY_Port,KEY_LEFT_Pin)
    //#define K_DOWN ReadInputDataBit(KEY_Port,KEY_DOWN_Pin)
    //#define K_RIGHT ReadInputDataBit(KEY_Port,KEY_RIGHT_Pin)

    #define KEY_UP 1
    #define KEY_LEFT 2
    #define KEY_DOWN 3
    #define KEY_RIGHT 4

    void KEY_Init(void);

    #endif

    main.c

    #include "system.h"
    #include "led.h"
    #include "SysTick.h"
    #include "key.h"


    int main()
    {
    u8 key,i=0;
    SysTick_Init(72);
    LED_Init();//初始化
    KEY_Init();

    while(1)
    {
    key=KEY_Scan(0);
    switch(key)
    {
    case KEY_UP:led2=0;break;//亮
    case KEY_LEFT:led2=1;break;//灭
    case KEY_DOWN:led3=1;break;//灭
    case KEY_RIGHT:led3=0;break;//亮

    }
    i++;
    if(i%20==0)
    {
    led1=!led1;
    }
    delay_ms(10);
    }
    }

    可通过按键对蜂鸣器进行操作

  • 相关阅读:
    磁盘阵列监控
    Docker-PS命令解析
    .NET编程周记第3期-2020年1月19日
    Microsoft Ignite The Tour Beijing 记录: Learn Connect Explore
    使用TryGetComponent取代GetComponent以避免Editor中的内存分配
    向.Net/Unity 程序员推荐一个十分因吹斯听的网站:sharplab.io
    Unity AR Foundation 和 CoreML: 实现手部的检测和追踪
    如何使用Android Studio在安卓平台对Unity开发的应用进行性能检查?
    Unity的Mesh压缩:为什么我的内存没有变化?
    Unity User Group深圳站——Timeline & Cinemachine分享
  • 原文地址:https://www.cnblogs.com/296389183yy/p/9337208.html
Copyright © 2011-2022 走看看