栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

STM32按键控制LED

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

STM32按键控制LED

1.利用模块化编程对LED

#include "stm32f10x.h"
//首先是初始化LED,开始使LED为高电平(即使之全部熄灭),LED为推挽输出
    void LED_Init(void)
    {
        //打开RCC
	    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);
        //配置GPIO的三种模式
	    GPIO_InitTypeDef GPIO_InitStruct;
	    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
	    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
	    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	    GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
	    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
	    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	    GPIO_Init(GPIOD,&GPIO_InitStruct);

	    开始使LED为高电平(即使之全部熄灭)
	    GPIO_SetBits(GPIOA, GPIO_Pin_8);
	    GPIO_SetBits(GPIOD, GPIO_Pin_2);
	}
    
    

2.设置LED的几种状态(亮,灭,和利用按键反转电平)

//为LED8的亮状态
void LED8_GPIOA_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_8);
}

//为LED8的灭状态
void LED2_GPIOA_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_8);
}

//利用按键进行电平反转控制LED亮灭
void LED8_Turn(void)
{
	//读取外部电平的值
	if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_8)==0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_8);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_8);
	}
	
}

//为LED2的亮状态
void LED2_GPIOD_ON(void)
{
	GPIO_ResetBits(GPIOD, GPIO_Pin_2);
}

//为LED8的灭状态
void LED2_GPIOD_OFF(void)
{
	GPIO_SetBits(GPIOD, GPIO_Pin_2);
}

//利用按键进行电平反转控制LED亮灭
void LED2_Turn(void)
{
	//读取外部电平的值
	if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2)==0)
	{
		GPIO_SetBits(GPIOD, GPIO_Pin_2);
	}
	else
	{
		GPIO_ResetBits(GPIOD, GPIO_Pin_2);
	}
	
}

3.按键

(1)按键初始化

(2)如果按键按下做什么(这里是控制LED)

#include "stm32f10x.h"                  // Device header
#include "Delay.h"  

void Key_Init(void)
{
    //打开RCC
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);
    //配置GPIO三种模式
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//注意按键是输入给CPU信号的,所以是使用上拉输入或者是下拉输入,具体看电路情况
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_15;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);//KEY_1  keyNumber=1;
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIO_InitStruct);//KEY_0  keyNumber=3;
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);//WK_UP  keyNumber=2;
}

uint8_t GetKeynum(void)
{
    uint8_t keyNumber=0; 
    //如果这个输入的信号为0,则代表按下,为低电平
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15)==0)
	{
		Delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15)==0)
		{
			Delay_ms(20);
		}
		keyNumber=1;
	}

    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1)
	{
		Delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1)
		{
			Delay_ms(20);
		}
		keyNumber=2;
	}
	
	if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5)==0)
	{
		Delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5)==0)
		{
			Delay_ms(20);
		}
		keyNumber=3;
	}
	return keyNumber;
}

4,主函数

uint8_t Key;
int main(void)
{
	LED_Init();
	Key_Init();
	while(1)
	{
		Key=GetKeynum();
		if(Key==1) //KEY_1  keyNumber=1;
		{
			LED8_Turn();


		}
		if(Key==2)//WK_UP  keyNumber=2;
		{
			LED2_Turn();
		}
		if(Key==3)//KEY_0  keyNumber=3;
		{
			while(1)
			{
				LED8_GPIOA_ON();
				LED2_GPIOD_ON();
				Delay_ms(100);
				LED8_GPIOA_OFF();
				LED2_GPIOD_OFF();
				Delay_ms(100);
			}
		}
	}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/935457.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号