STM32单片机学习篇5

按键控制LED灯

0.关于.c文件与.h文件

0.1c文件的作用

.c文件是C语言源代码文件,包含程序的实际功能实现。

主要存放函数定义、全局变量定义、初始化代码等可执行内容。

编译时.c文件会被转换为目标文件(.obj),最终链接为可执行程序。

0.2.h文件的作用

.h文件是头文件,主要用于声明接口和共享信息。

包含函数原型、宏定义、类型定义(如结构体)、外部变量声明等内容。

头文件不包含实际代码实现,仅提供模块间的交互规范。

.h文件通过#include被其他文件引用,确保声明的一致性。良好的头文件设计能降低耦合度,例如通过#ifndef防止重复包含,头文件也是多文件项目管理的关键,便于团队协作和模块复用。

两者协作关系

.c文件通过包含对应的.h文件获取外部声明,避免手动重复编写。

例如main.c引用module.h后,可直接调用module.c中实现的函数。

编译时,每个.c文件独立编译为目标文件,再通过链接器合并。

头文件不参与单独编译,仅作为.c文件的辅助参考。

若.h文件修改,所有包含它的.c文件需重新编译以保证一致性。

1.Key.c按键

复制代码
#include "stm32f10x.h"                  // Device header
#include "Delay.h"

void Key_Init(void){
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 |GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
}
//调用这个函数,可以返回按键的键码
uint8_t Key_GetNum(void){
	//按键键码默认给0,如果没有按下,就返回0
	uint8_t KeyNum = 0;
	//读取PB1端口的值
	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) ==0 )
	{
		Delay_ms(200);
		while(GPIOB,GPIO_Pin_1 ==0);
		Delay_ms(200);
		//返回键值的键码为1
		KeyNum = 1;
	}
	
	//读取GPIO端口
	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) ==0 )
	{
		Delay_ms(200);
		while(GPIOB,GPIO_Pin_11 ==0);
		Delay_ms(200);
		//返回键值的键码为1
		KeyNum = 2;
	}
	return KeyNum;
}

2.Key.h按键

复制代码
#ifndef _Key_H
#define _Key_H


void Key_Init(void);
uint8_t Key_GetNum(void);
	
#endif

3.LED.c灯

复制代码
//封装LED的驱动程序
#include "stm32f10x.h"                  // Device header

//初始化LED的函数

void LED_Init(void)
{
	//
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//

	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);
	
}
void LED1_ON(void)
	{
	
	GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
void LED1_OFF(void)
	{
	GPIO_SetBits(GPIOA,GPIO_Pin_1);
	
}

//实现翻转功能
void LED1_Turn(void){
	
	if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1) == 0){
		
		GPIO_SetBits(GPIOA,GPIO_Pin_1);
	}
	else
		GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}

void LED2_ON(void)
	{
	
	GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
void LED2_OFF(void)
	{
	GPIO_SetBits(GPIOA,GPIO_Pin_2);
	
}
	
void LED2_Turn(void){
	
	if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2) == 0){
		
		GPIO_SetBits(GPIOA,GPIO_Pin_2);
	}
	else
		GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}

4.LED.h灯

复制代码
#ifndef _LED_H
#define _LED_H
//存放驱动程序可以对外提供的函数或变量声明
//文件必须以空行来结尾

void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED2_ON(void);
void LED2_OFF(void);
void LED1_Turn(void);
void LED2_Turn(void);
#endif

5.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)
	{
		//LED1_ON();
		//Delay_ms(200);
		//LED1_OFF();
		//Delay_ms(500);
		//LED2_ON();
		//Delay_ms(500);
		//LED2_OFF();
		//Delay_ms(500);
		
		//不断读取变量值,放在KeyNum里面
		KeyNum = Key_GetNum();
		if(KeyNum  == 1){
			//LED1_ON();
			LED1_Turn();
			Delay_ms(200);
		}
		if(KeyNum  == 2){
			//LED1_OFF();
			LED2_Turn();
			Delay_ms(200);
		}
		
		
	}
}
相关推荐
不能跑的代码不是好代码3 小时前
STM32:LED共阴/共阳连接与GPIO控制逻辑的关系,如何实现电平转换
stm32·单片机·嵌入式硬件
头疼的程序员4 小时前
计算机网络:自顶向下方法(第七版)第二章 学习分享(二)
学习·计算机网络
沉默-_-4 小时前
微信小程序页面配置详解
学习·微信小程序·apache·微信开发者工具
北京云帆互联科技4 小时前
云帆学习考试系统更新说明v8.8.0
学习·考试系统·高校考试系统
Quintus五等升4 小时前
深度学习③|分类任务—AlexNet
人工智能·经验分享·深度学习·神经网络·学习·机器学习·cnn
qq_25814297-npl5 小时前
HEX数据00,显示为ASC码,怎么是是\0
单片机
张心独酌5 小时前
学习Rust:实现RESTful 任务管理 API(Todo API)
学习·rust·restful
反向跟单策略5 小时前
如何正确看待期货反向跟单策略?
大数据·人工智能·学习·数据分析·区块链
不做无法实现的梦~5 小时前
使用ros2跑mid360的fastlio2建图
git·单片机·嵌入式硬件·gitcode