蓝桥杯_嵌入式:按键(库函数)


一、原理图:

提醒,如原理图可得判断按键是否按下可判断引脚输入是否为低电平

按键引脚图,如下所示:

二、部分代码:

  1.key.h:

#ifndef __KEY_H
#define __KEY_H

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"

#define NK1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)  //判断引脚输入
#define NK2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)
#define NK3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)
#define NK4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)

#define NK1_press 1
#define NK2_press 2
#define NK3_press 3
#define NK4_press 4

void key_Init(void);  // 初始化按键的引脚
u8 key_read(void);    //按键判断函数编写


#endif

2.key.c:

#include "key.h"
#include "stm32f10x.h"

void key_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE); //如原理图所示,使能PA、PB
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; // 引脚设计为浮空输入
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_8;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	
}


u8 key_read(void)  //不支持连按,需要松开按键。
{
	static u8 key_up=1;   
	if(key_up&&(NK1==0||NK2==0||NK3==0||NK4==0)) //判断按键是否按下
	{
	  key_up=0;             //以下的判断句为判断按下哪个按键
		if(NK1==0)  return NK1_press;            //按下B1
			else if(NK2==0) return NK2_press;    //按下B2
			else if(NK3==0) return NK3_press;    //按下B3
			else if(NK4==0) return NK4_press;	 //按下B4
	}
	else if(NK1==1&&NK2==1&&NK3==1&&NK4==1)  //不支持连续按的关键语句
		key_up=1;
	return 0;
}

3.main.c:

#include "stm32f10x.h"
#include "lcd.h"
#include "led.h"
#include "key.h"

u32 TimingDelay = 0;

void Delay_Ms(u32 nTime);

int main(void)
{
	u8 key_value;
	u8 i=0;
	SysTick_Config(SystemCoreClock/1000);
  STM3210B_LCD_Init();
	LCD_Clear(Green);
	LCD_SetBackColor(Black);//2
	LCD_SetTextColor(White);//3
	led_Init();
	key_Init();

	//led_control(0x01);

	while(1)
{
	key_value=key_read();  //读取按键
	if(key_value==1)   //按下一次B1,使LD0~LD8的逐渐点亮
	{
		  led_control(0x01<<i,1); //控制LED
			i++;
	}
	else if(key_value==2) //按下一次B2,使LD8~LD0的逐渐熄灭
	{
			i-=1;
		  led_control(0x01<<i,0);
	}
}

}

//
void Delay_Ms(u32 nTime)
{
	TimingDelay = nTime;
	while(TimingDelay != 0);	
}

4. led.c

#include "stm32f10x.h"
#include "led.h"

void led_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStruct.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_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIO_InitStruct);
	
	
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
	GPIO_Init(GPIOD,&GPIO_InitStruct);

}


void led_control(u16 led,u8 led_status)
{
	if(led_status==1)    //点亮LED
	{
	GPIO_ResetBits(GPIOC,led<<8);
	GPIO_SetBits(GPIOD,GPIO_Pin_2);
	GPIO_ResetBits(GPIOD,GPIO_Pin_2);
	}
	else                 //熄灭LED
	{
		GPIO_SetBits(GPIOC,led<<8);
	  GPIO_SetBits(GPIOD,GPIO_Pin_2);
	  GPIO_ResetBits(GPIOD,GPIO_Pin_2);
	}
}

5.led.h

#ifndef __LED_H
#define __LED_H

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"


void led_Init(void);
void led_control(u16 led,u8 led_status);

#endif

如需进一步了解如何配置和控制LED则可到蓝桥杯_嵌入式:点亮LED(库函数)_m0_53512119的博客-CSDN博客


总结

这里对蓝桥杯嵌入式的按键的主要代码做了部分描述,在按键学习过程中需要学习GPIO输入、移位操作等知识。

注意:LED与LCD的冲突是否解决

初学者一定要实际操作烧入代码检查目标实现程度

文章若出现什么问题,谢谢及时反馈。


点个赞在走吧!!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值