野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8570|回复: 2

第13章 按键检测(课后作业)

[复制链接]
发表于 2017-8-18 22:35:06 | 显示全部楼层 |阅读模式
k1控制Led_G,k2控制Led_B

#ifndef __BSP_KEY_H
#define __BSP_KEY_H

#include "stm32f10x.h"

#define  KEY_ON      1
#define  KEY_OFF     0

#define KEY1_GPIO_PIN              GPIO_Pin_0
#define KEY1_GPIO_PORT             GPIOA
#define KEY1_GPIO_CLK              RCC_APB2Periph_GPIOA

#define KEY2_GPIO_PIN              GPIO_Pin_13
#define KEY2_GPIO_PORT             GPIOC
#define KEY2_GPIO_CLK              RCC_APB2Periph_GPIOC


void KEY1_GPIO_Config(void);

void KEY2_GPIO_Config(void);

uint8_t Key_Scan(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin);


#endif /* __BSP_KEY_H */


#include "bsp_key.h"
void Delay(uint32_t count)
{
  for(;count!=0;count--);
}

void KEY1_GPIO_Config(void)
{
        GPIO_InitTypeDef KEY1_GPIO_InitStruct;

                                RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK,ENABLE);
        KEY1_GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN;
        KEY1_GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

        GPIO_Init(KEY1_GPIO_PORT,&KEY1_GPIO_InitStruct);
}

void KEY2_GPIO_Config(void)
{
        GPIO_InitTypeDef KEY2_GPIO_InitStruct;

                                RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK,ENABLE);
        KEY2_GPIO_InitStruct.GPIO_Pin = KEY2_GPIO_PIN;
        KEY2_GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

        GPIO_Init(KEY2_GPIO_PORT,&KEY2_GPIO_InitStruct);
}

uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
  if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON)
  {
    Delay(20000);//软件消抖
    if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON)
    {//松手检测
      while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);
      return KEY_ON;
    }
    else return KEY_OFF;
  }
  else return KEY_OFF;
}


#include "stm32f10x.h"   // 相当于51单片机中的  #include <reg51.h>
#include "bsp_led.h"
#include "bsp_key.h"


int main(void)
{
        // 来到这里的时候,系统的时钟已经被配置成72M。
        LED_G_GPIO_Config();
        LED_B_GPIO_Config();
        KEY1_GPIO_Config();
        KEY2_GPIO_Config();
        LED_B(OFF);
        LED_G(OFF);
while(1)
        {
        if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN)  == ((uint8_t)KEY_ON))
          LED_G_TOGGLE;
        if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN)  == ((uint8_t)KEY_ON))
          LED_B_TOGGLE;
        }
                // if
}

#ifndef __BSP_LED_H
#define __BSP_LED_H

#include "stm32f10x.h"

#define LED_G_GPIO_PIN              GPIO_Pin_0
#define LED_G_GPIO_PORT             GPIOB
#define LED_G_GPIO_CLK              RCC_APB2Periph_GPIOB

#define LED_B_GPIO_PIN              GPIO_Pin_1
#define LED_B_GPIO_PORT             GPIOB
#define LED_B_GPIO_CLK              RCC_APB2Periph_GPIOB



#define    ON        1
#define    OFF       0

// \  C语言里面叫续行符,后面不能有任何的东西

#define   LED_G(a)   if(a) \
                               GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN); \
                     else  GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);

#define   LED_B(a)   if(a) \
                               GPIO_ResetBits(LED_B_GPIO_PORT, LED_G_GPIO_PIN); \
                     else  GPIO_SetBits(LED_B_GPIO_PORT, LED_B_GPIO_PIN);

// ^ 异或,C语言的一个二进制的运算符
// 与1异或改变,与0异或不变

#define LED_G_TOGGLE        {LED_G_GPIO_PORT->ODR ^= LED_G_GPIO_PIN;}

#define LED_B_TOGGLE        {LED_B_GPIO_PORT->ODR ^= LED_B_GPIO_PIN;}

void LED_G_GPIO_Config(void);
void LED_B_GPIO_Config(void);

#endif /* __BSP_LED_H */

// bsp :board support package 板级支持包
#include "bsp_led.h"

void LED_G_GPIO_Config(void)
{
        GPIO_InitTypeDef  GPIO_InitStruct;

        RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE);

        GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);       
}

void LED_B_GPIO_Config(void)
{
        GPIO_InitTypeDef  GPIO_InitStruct;

        RCC_APB2PeriphClockCmd(LED_B_GPIO_CLK, ENABLE);

        GPIO_InitStruct.GPIO_Pin = LED_B_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(LED_B_GPIO_PORT, &GPIO_InitStruct);       
}



前几天下雨断电,没想到笔记本主板电源芯片烧坏了,真的心痛
回复

使用道具 举报

 楼主| 发表于 2017-8-18 22:35:43 | 显示全部楼层
自己顶自己,留个脚印
回复 支持 反对

使用道具 举报

发表于 2017-8-19 09:23:08 | 显示全部楼层
下雨时笔记本不要接电源嘛,直接用电池
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-29 04:10 , Processed in 0.028579 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表