按键端口管脚,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);
}
}
}
//以上按键为按一下亮,按一下灭,复位开机后同一默认灯为灭