led灯 库函数实现代码

 led.h文件

#ifndef __LED_H__
#define __LED_H__

#define GPIOE ((gpio_t*)0x50006000)
#define GPIOF ((gpio_t*)0x50007000)

#define RCC_AHB4_ENSETR *(volatile unsigned int *)0x50000a28

//结构体封装
typedef struct
{
	volatile unsigned int MODER;
	volatile unsigned int OTYPER;
	volatile unsigned int OSPEEDR;
	volatile unsigned int PUPDR;
	volatile unsigned int IDR;
	volatile unsigned int ODR;
}gpio_t;

//封装模式寄存器
typedef enum
{
	INPUT,
	OUTPUT,
	ALT,
	ANALOG
}gpio_moder_t;

//封装输出类型寄存器
typedef enum
{
	PUSH_PULL,
	OPEN_DRAIN
}gpio_otyper_t;

//封装输出速率寄存器
typedef enum
{
	LOW,
	MEDIUM,
	HIGH,
	VHIGH
}gpio_ospeedr_t;

//封装是否上下拉电阻寄存器
typedef enum
{
	NSET,
	PULL_UP,
	PULL_DOWN,
	RESERVED
}gpio_pupdr_t;

//封装输出高低电平寄存器
typedef enum
{
	GPIO_RESET_T,
	GPIO_SET_T
}gpio_status_t;

//结构体初始化寄存器
typedef struct
{
	//封装模式寄存器
	gpio_moder_t moder;
	//封装输出类型寄存器
	gpio_otyper_t otyper;
	//封装输出速率寄存器
	gpio_ospeedr_t ospeedr;
	//封装是否上下拉电阻寄存器
	gpio_pupdr_t pupdr;
}gpio_init_t;

//引脚封装
#define GPIO_PIN_0 0
#define GPIO_PIN_8 8
#define GPIO_PIN_10 10

//初始化函数
void hal_gpio_init(gpio_t* gpiox, gpio_init_t* init, unsigned int pin);

//操作GPIO接口写函数
void hal_gpio_write(gpio_t* gpiox, gpio_status_t status, unsigned int pin);

#endif

fun.c文件

#include "led.h"
//初始化函数
void hal_gpio_init(gpio_t* gpiox, gpio_init_t* init, unsigned int pin)
{
	if(gpiox == GPIOE)
		RCC_AHB4_ENSETR |= (0x1 << 4);
	else if(gpiox == GPIOF)
		RCC_AHB4_ENSETR |= (0x1 << 5);

	gpiox->MODER &= (~(0x3 << (2*pin)));
	gpiox->MODER |= (init->moder << (2*pin));

	gpiox->OTYPER &= (~(0x1 << pin));
	gpiox->OTYPER |= (init->otyper << pin);

	gpiox->OSPEEDR &= (~(0x3 << (2*pin)));
	gpiox->OSPEEDR |= (init->ospeedr << (2*pin));

	gpiox->PUPDR &= (~(0x3 << (2*pin)));
	gpiox->PUPDR |= (init->pupdr << (2*pin));

	return;
}

//操作GPIO接口写函数
void hal_gpio_write(gpio_t* gpiox, gpio_status_t status, unsigned int pin)
{
	gpiox->ODR &= (~(0x1 << pin));
	gpiox->ODR |= (status << pin);
	return;
}

mian.c文件

#include "led.h"

extern void printf(const char *fmt, ...);

void delay_ms(int ms)

{

	int i,j;

	for(i = 0; i < ms;i++)

		for (j = 0; j < 1800; j++);

}
int main()

{

	//led1

	//定义初始化信息结构体

	gpio_init_t led1;

	//填充初始化参数

	led1.moder = OUTPUT;

	led1.otyper = PUSH_PULL;

	led1.ospeedr = LOW;

	led1.pupdr = NSET;

	//调用初始化函数

	hal_gpio_init(GPIOE, &led1, GPIO_PIN_10);


	//led2

	//定义初始化信息结构体

	gpio_init_t led2;

	//填充初始化参数

	led2.moder = OUTPUT;

	led2.otyper = PUSH_PULL;

	led2.ospeedr = MEDIUM;

	led2.pupdr = NSET;

	//调用初始化函数

	hal_gpio_init(GPIOF, &led2, GPIO_PIN_10);


	//led3

	//定义初始化信息结构体

	gpio_init_t led3;

	//填充初始化参数

	led3.moder = OUTPUT;

	led3.otyper = PUSH_PULL;

	led3.ospeedr = HIGH;

	led3.pupdr = NSET;

	//调用初始化函数

	hal_gpio_init(GPIOE, &led3, GPIO_PIN_8);

	while(1)

	{

		hal_gpio_write(GPIOE, GPIO_SET_T, GPIO_PIN_10);

		delay_ms(1000);

		hal_gpio_write(GPIOE, GPIO_RESET_T, GPIO_PIN_10);


		hal_gpio_write(GPIOF, GPIO_SET_T, GPIO_PIN_10);

		delay_ms(1000);

		hal_gpio_write(GPIOF, GPIO_RESET_T, GPIO_PIN_10);


		hal_gpio_write(GPIOE, GPIO_SET_T, GPIO_PIN_8);

		delay_ms(1000);

		hal_gpio_write(GPIOE, GPIO_RESET_T, GPIO_PIN_8);

	}

	return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是用STM32F103C8T6控制按键开关一个LED函数代码: ```c #include "stm32f10x.h" #define LED_PIN GPIO_Pin_13 #define LED_PORT GPIOC #define KEY_PIN GPIO_Pin_0 #define KEY_PORT GPIOA void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = LED_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LED_PORT, &GPIO_InitStructure); GPIO_SetBits(LED_PORT, LED_PIN); } void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = KEY_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(KEY_PORT, &GPIO_InitStructure); } uint8_t KEY_Read(void) { if(GPIO_ReadInputDataBit(KEY_PORT, KEY_PIN) == 0) { return 1; } else { return 0; } } void LED_Control(uint8_t state) { if(state == 1) { GPIO_ResetBits(LED_PORT, LED_PIN); } else { GPIO_SetBits(LED_PORT, LED_PIN); } } void LED_Toggle(void) { GPIO_WriteBit(LED_PORT, LED_PIN, (BitAction)(1 - GPIO_ReadOutputDataBit(LED_PORT, LED_PIN))); } int main(void) { LED_Init(); KEY_Init(); while(1) { if(KEY_Read()) { LED_Toggle(); while(KEY_Read()); } } } ``` 在代码中,我们使用了STM32F103C8T6的GPIO模块控制了一个LED和一个按键,实现了按下按键时LED的开关。具体实现过程如下: 1. 在LED_Init函数中初始化了LED的GPIO口,并将其设置为输出模式,并将LED初始化为熄灭状态。 2. 在KEY_Init函数中初始化了按键的GPIO口,并将其设置为带上拉的输入模式。 3. 在KEY_Read函数实现了按键的读取功能,当按键按下时,返回1,否则返回0。 4. 在LED_Control函数实现LED的开关功能,当传入参数为1时,LED亮,传入参数为0时,LED灭。 5. 在LED_Toggle函数实现LED的翻转功能,即从亮到灭或从灭到亮。 6. 在main函数中先初始化LED和按键,然后通过while循环不断读取按键状态,当按键按下时,翻转LED的状态,并在按键释放前一直等待。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值