这个小实验主要还是利用到GPIO:

下面这个bsp_led.h文件使用寄存器版本写的

#ifndef __LED_H
#define __LED_H
#include"stm32f10x.h"
//定义端口,时钟,引脚
#define red_PORT  GPIOB
#define red_PIN   GPIO_Pin_5
#define red_LCK   RCC_APB2Periph_GPIOB

#define green_PORT  GPIOB
#define green_PIN   GPIO_Pin_0
#define green_LCK   RCC_APB2Periph_GPIOB

#define blue_PORT  GPIOB
#define blue_PIN   GPIO_Pin_1
#define blue_LCK   RCC_APB2Periph_GPIOB

#define ON 0
#define OFF 1
            
#define    digitalHi(p,i)         {p->BSRR=i;}     //引脚输出高电平       
#define digitalLo(p,i)         {p->BRR=i;}     //引脚输出低电平
#define digitalToggle(p,i) {p->ODR ^=i;} //反转

#define red_TOGGLE         digitalToggle(red_PORT,red_PIN)
#define red_OFF           digitalHi(red_PORT,red_PIN)
#define red_ON               digitalLo(red_PORT,red_PIN)

#define green_TOGGLE         digitalToggle(green_PORT,green_PIN)
#define green_OFF           digitalHi(green_PORT,green_PIN)
#define green_ON               digitalLo(green_PORT,green_PIN)

#define blue_TOGGLE         digitalToggle(blue_PORT,blue_PIN)
#define blue_OFF           digitalHi(blue_PORT,blue_PIN)
#define blue_ON               digitalLo(blue_PORT,blue_PIN)

void LED_GPIO_Config(void);
                
#endif
                

下面是bsp_key.h文件:
#ifndef __KEY_H
#define __KEY_H
#include"stm32f10x.h"

#define key_1_PORT  GPIOA
#define key_1_PIN   GPIO_Pin_0
#define key_1_CLK   RCC_APB2Periph_GPIOA

#define key_2_PORT  GPIOC
#define key_2_PIN   GPIO_Pin_13
#define key_2_CLK   RCC_APB2Periph_GPIOC

#define KEY_ON      1
#define KEY_OFF     0

void Key_GPIO_Config(void);
uint8_t KEY_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);

#endif

下面是bsp_key.c文件:

#include"bsp_key.h"
void Key_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(key_1_CLK|key_2_CLK,ENABLE);
    GPIO_InitStructure.GPIO_Pin=key_1_PIN;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    GPIO_Init(key_1_PORT,&GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin=key_2_PIN;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    GPIO_Init(key_2_PORT,&GPIO_InitStructure);
}
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;     //才返回一个KEY_ON
    }
    else
        return KEY_OFF;
}

下面是main.c文件

#include"stm32f10x.h"
#include"bsp_led.h"
#include"bsp_key.h"
int main(void)
{
    LED_GPIO_Config();
    red_ON;
    Key_GPIO_Config();
    while(1)
    {
        if(KEY_Scan(key_1_PORT,key_1_PIN) == KEY_ON  )//
        {
            red_TOGGLE;
            //red(OFF);
        } 

        if( KEY_Scan(key_2_PORT,key_2_PIN) == KEY_ON  )
        {
            green_TOGGLE;
            //green(ON);
        }    
    }
}

以上就是一个简单的通过按键反转LED的亮灭的代码文件,如有不妥,望请指正。

posted on 2018-06-20 14:12  lzd626  阅读(6064)  评论(0编辑  收藏  举报