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);
		}
		
		
	}
}
相关推荐
hhcgchpspk3 分钟前
Windows API线程学习
c语言·windows·学习·多线程·windows api
~kiss~7 分钟前
CrossFlowDG 跨域泛化学习二
学习
m0_377108149 分钟前
stm32--I2C
stm32·单片机·嵌入式硬件
发光小北12 分钟前
单通道串口服务器如何应用?
运维·服务器·单片机
车载测试牛马笔记15 分钟前
CAN一致性-物理层--高压通信范围测试
单片机·嵌入式硬件
.千余15 分钟前
【Linux】Socket编程UDP
linux·运维·服务器·开发语言·网络协议·学习·udp
Shadow(⊙o⊙)18 分钟前
qt信号和槽链接的接入与断开
开发语言·前端·c++·qt·学习
想你依然心痛20 分钟前
HarmonyOS 6 悬浮导航 + 沉浸光感:打造鸿蒙智能体驱动的沉浸式编程学习伴侣
学习·华为·ar·harmonyos·智能体
Harm灬小海25 分钟前
【云计算学习之路】企业常用服务搭建:构建Apache WEB服务器
运维·服务器·学习·云计算·apache
www.stcai.com28 分钟前
《单片机原理与应用》,详细介绍。基于 STC, Ai8051U, 8位/32位 双核 全支持 AiCube 图形化配置外设,自动生成程序框架
单片机·嵌入式硬件