目录
1.复制之前的复制之前的STM32学习笔记(七)-库函数实现led流水灯
GPIO_ReadInputDataBit()函数和GPIO_ReadInputData()函数
GPIO_ReadOutputDataBit()函数和GPIO_ReadOutputData()函数编辑
从这里开始,我用STM32F103C8T6这款单片机了
1.硬件电路连接
1.用两个按键分别控制两个led灯,led对应引脚为PA0和PA1,按键对应的引脚为PB1和PB11
2.新建工程
1.复制之前的复制之前的STM32学习笔记(七)-库函数实现led流水灯
2.新添加LED.c和LED.h文件,实现模块化编程
LED.h全部代码
#ifndef _LED_H
#define _LED_H
void LED_Init(void);
void LED1_OFF(void);
void LED1_ON(void);
void LED1_Turn(void);
void LED2_OFF(void);
void LED2_ON(void);
void LED2_Turn(void);
#endif
LED.c全部代码
#include "stm32f10x.h" // Device header
//初始化LED
void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1);
}
void LED1_ON(void)
{
GPIO_SetBits(GPIOB, GPIO_Pin_0);
}
void LED1_OFF(void)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_0);
}
//将led1电平反转
void LED1_Turn(void)
{
if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_0) == 0)
{
GPIO_SetBits(GPIOB, GPIO_Pin_0);
}
if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_0) == 1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_0);
}
}
void LED2_ON(void)
{
GPIO_SetBits(GPIOB, GPIO_Pin_1);
}
void LED2_OFF(void)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
}
void LED2_Turn(void)
{
if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_1) == 0)
{
GPIO_SetBits(GPIOB, GPIO_Pin_1);
}
if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_1) == 1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
}
}
3.新建KEY.h和KEY.c文件
1.读取GPIO端口值的函数
//读取输入数据寄存器的某一位
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
GPIO_ReadInputDataBit()函数和GPIO_ReadInputData()函数
GPIO_ReadInputDataBit()函数是读取这里输入数据寄存器的某一位
GPIO_ReadInputData()函数读取这整个输入数据寄存器
GPIO_ReadOutputDataBit()函数和GPIO_ReadOutputData()函数
GPIO_ReadOutputDataBit()函数是读取这里输出数据寄存器的某一位
GPIO_ReadOutputData()函数读取这整个输出数据寄存器
2.KEY.h全部代码
#ifndef _KEY_H
#define _KEY_H
void KEY_Init(void);
uint8_t Key_GETNUM(void);
#endif
3.KEY.c全部代码
#include "stm32f10x.h" // Device header
#include "Delay.h"
//初始化KEY
void KEY_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//读取按键值函数 可以返回按下按键的键码
uint8_t Key_GETNUM(void)
{
uint8_t KeyNum = 0;
//读取GPIO口的值
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1 == 0)) //按键是否按下
{
Delay_ms(20); //消抖
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1 == 0));
Delay_ms(20);
KeyNum = 1;
}
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11 == 0)) //按键是否按下
{
Delay_ms(20); //消抖
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11 == 0));
Delay_ms(20);
KeyNum = 2;
}
return KeyNum;
}
4.main.c文件全部代码
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "KEY.h"
uint8_t KeyNum; //全局变量
int main(void)
{
LED_Init();
KEY_Init();
while(1)
{
KeyNum = Key_GETNUM();
if(KeyNum == 1) //判断按键1是否按下
{
LED1_Turn();
}
if(KeyNum == 2) //判断按键2是否按下
{
LED2_Turn();
}
}
}