STM32F103C8T6程序之按键检测判断--3

在这里插入图片描述
按键端口管脚,led灯用之前文章的三个IO口

程序如下,

key.c文件
#include “stm32f10x.h”
#include “key.c”
void key_config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //打开外设GPIOA时钟
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; //因为管脚下拉了电阻,所以管脚模式可以选择悬空/上拉/下拉
GPIO_Init( GPIOA, & GPIO_InitStruct);
}

void led_config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //打开外设GPIOA时钟
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; //LED输出模式配置推挽
GPIO_Init( GPIOA, & GPIO_InitStruct);
}

uint8_t Key_scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
if(GPIO_ReadInputDataBit( GPIOx, GPIO_Pin)==KEY_ON)
{
while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON); //做多一次检测按键是否按下
return KEY_ON;
}
else
return KEY_OFF;
}

key.h文件

#ifndef __KEY_H
#define __KEY_H

#include “stm32f10x.h”
#define KEY_ON 1
#define KEY_OFF 0

//操作位,需要定义位
// 把“位带地址+位序号”转换成别名地址的宏
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0x00FFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C //输出ODR
#define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808 //输入IDR
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入

void key_config(void);
void led_config(void);
uint8_t Key_scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

#endif /**/

main.c文件

#include “stm32f10x.h”
#include “key.h”

int main(void)
{
key_config();
led_config();
PAout(1)=1; //默认上电,灯灭
while(1)
{
if(Key_scan(GPIOA, GPIO_Pin_0)==KEY_ON)
{
PAout(1)=~PAout(1);
}
}

}

//以上按键为按一下亮,按一下灭,复位开机后同一默认灯为灭

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值