蓝桥杯嵌入式模块练习之点亮LED&KEY

LED原理

有单片机基础就很简单了,上原理图。
在这里插入图片描述
在这里插入图片描述
573锁存器使能端为PD2,当PC8-PC15为低电平,且573锁存时LED点亮。
初始化LED代码如下,先关闭所有LED。

void ledinit()
{
	GPIO_InitTypeDef GPIO_InitStructer;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);//PD2 PC8-PC15
	
	GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructer.GPIO_Pin=GPIO_Pin_2;
	GPIO_InitStructer.GPIO_Speed=GPIO_Speed_2MHz;
	GPIO_Init(GPIOD,&GPIO_InitStructer);
	
	GPIO_InitStructer.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
	GPIO_Init(GPIOC,&GPIO_InitStructer);
	
	GPIO_SetBits(GPIOC,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
	GPIO_SetBits(GPIOD,GPIO_Pin_2);
	GPIO_ResetBits(GPIOD,GPIO_Pin_2);
	
}

KEY原理

在这里插入图片描述
在这里插入图片描述
由原理图知按下按键相应端口为低电平。
初始化代码如下。

void keyinit()
{
	GPIO_InitTypeDef GPIO_InitStructer;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);//PA0/8 PB1/2
	
	GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStructer.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStructer.GPIO_Speed=GPIO_Speed_2MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructer);
	
	GPIO_InitStructer.GPIO_Pin=GPIO_Pin_8;
	GPIO_Init(GPIOA,&GPIO_InitStructer);
	
	GPIO_InitStructer.GPIO_Pin=GPIO_Pin_1;
	GPIO_Init(GPIOB,&GPIO_InitStructer);
	
	GPIO_InitStructer.GPIO_Pin=GPIO_Pin_2;
	GPIO_Init(GPIOB,&GPIO_InitStructer);
}

按键检测需要延迟函数。需要使用到STM32的滴答定时器,简单配置即可。
主函数里检测按键并点亮相应LED。
main.c部分代码如下

#include "stm32f10x.h"
#include <stdio.h>
uint32_t delaytime;   //在中断函数中需要用到

void ledinit(void);
void keyinit(void);
void delay(uint32_t ms);

int main(void)
{
	SysTick_Config(72000);     //在core_cm3.h文件中1694行
  ledinit();
	keyinit();
  while (1)
  {
		
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==RESET)
		{
			delay(5);
			if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==RESET)
			{
			   GPIO_ResetBits(GPIOC,GPIO_Pin_8);
				 GPIO_SetBits(GPIOD,GPIO_Pin_2);
				 GPIO_ResetBits(GPIOD,GPIO_Pin_2);
			}
			
		}
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==RESET)
		{
			delay(5);
			if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==RESET)
			{
			   GPIO_ResetBits(GPIOC,GPIO_Pin_9);
				 GPIO_SetBits(GPIOD,GPIO_Pin_2);
				 GPIO_ResetBits(GPIOD,GPIO_Pin_2);
			}
			
		}
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==RESET)
		{
			delay(5);
			if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==RESET)
			{
			   GPIO_ResetBits(GPIOC,GPIO_Pin_10);
				 GPIO_SetBits(GPIOD,GPIO_Pin_2);
				 GPIO_ResetBits(GPIOD,GPIO_Pin_2);
			}
			
		}
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)==RESET)
		{
			delay(5);
			if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)==RESET)
			{
			   GPIO_ResetBits(GPIOC,GPIO_Pin_11);
				 GPIO_SetBits(GPIOD,GPIO_Pin_2);
				 GPIO_ResetBits(GPIOD,GPIO_Pin_2);
			}
			
		}
  }
}
void delay(uint32_t ms)
{
	delaytime=ms;
	while(delaytime!=0);
}

中断文件中部分代码如下

#include "stm32f10x_it.h"
extern uint32_t delaytime;   //外部变量在主函数中
void SysTick_Handler(void)
{
	delaytime--;
}


还可以一次控制多个LED点灭。如下代码,图片一看就懂。

GPIO_Write(GPIOC,0x5fff);   点亮LED8,6
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);

在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值