洋桃开发板笔记(二) 最基本的GPIO接口控制(输入)

按键点亮LED灯,本质是对GPIO口的控制

杜洋工作室 www.DoYoung.net

洋桃电子 www.DoYoung.net/YT

  • 在此声明一下所有代码均为 杜洋工作室 的不允许复制,转发等,本人只是在此程序上进行理解和注释。

在此程序上进行理解和注释。
接着上一个笔记,上一个是对LED灯的点亮,接下来是按键使LED灯亮灭
上次笔记地址为:https://blog.csdn.net/qq_40546576/article/details/97816579

单片机要对按键状态获取,是否需要外接电源吗?还是直接连接(PLC中叫干连接)到GPIO接口上?STM32内部已经内置上拉电阻和下拉电阻,还有一中就是浮空输入,模拟输入。这4个主要是输入时选择GPIO的工作方式。

上拉电阻

可以直接接按钮的一端,按钮另一端直接接地即可

下拉电阻

可以直接接按钮的一端,按钮另一端需要外接一个电源,此时需要考虑该IO口的耐压值。有些IO口并不能承受5v的电压,STM32默认为3.3V电压

浮空输入

用处就是提高输入速度,但是需要用“线与”现象来正确的使用该工作方式。在此不解释“线与”,可以百度,或Google一下,自行解决。

模拟输入

该模式就是可以直接把需要采取的模拟量直接接入STM32的IO口,内置了ADC转换器。

我们把IO口选择工作方式种类:
GPIO_Mode_AIN 模拟输入
GPIO_Mode_IN_FLOATING 浮空输入
GPIO_Mode_IPD 下拉输入
GPIO_Mode_IPU 上拉输入

本次对LED的初始化程序不展示了,如果需要可以访问上一个笔记:https://blog.csdn.net/qq_40546576/article/details/97816579

首先我们需要自己创建按键的头文件key.h,名字可以随便齐,但是有意义才懂此文件。

#ifndef __KEY_H
#define __KEY_H	 
#include "sys.h"

//#define KEY1 PAin(0)// PA0
//#define KEY2 PAin(1)// PA1

#define KEYPORT	GPIOA	//定义IO接口组
#define KEY1	GPIO_Pin_0	//定义IO接口
#define KEY2	GPIO_Pin_1	//定义IO接口


void KEY_Init(void);//声明按键初始化

		 				    
#endif

定义了需要用的函数和成员,接下来需要编写相应的key.c程序。

#include "key.h"

void KEY_Init(void)//微动开关的接口初始化
{ 
	GPIO_InitTypeDef  GPIO_InitStructure; //定义GPIO的初始化枚举结构	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);       
    GPIO_InitStructure.GPIO_Pin = KEY1 | KEY2; //选择端口号(0~15或all)                        
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //选择IO接口工作方式 //上拉电阻       
//    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度,屏蔽掉了,输入时不需要速度配置(2/10/50MHz)    
	GPIO_Init(KEYPORT,&GPIO_InitStructure);//此时才把io的配置进行初始化!!!		
}

此时主要对主函数进行编写

#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "led.h"

#include "key.h" 

int main (void){//主程序
	//初始化程序
	RCC_Configuration(); //时钟设置
	LED_Init();//LED初始化

	KEY_Init();//按键初始化

	//主循环
	while(1){

		//示例1:无锁存
		if(GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
			GPIO_ResetBits(LEDPORT,LED1); //LED灯都为低电平(0) 
		}else{	
        	GPIO_SetBits(LEDPORT,LED1); //LED灯都为高电平(1) 
		}
		if(GPIO_ReadInputDataBit(KEYPORT,KEY2)){ //读按键接口的电平
			GPIO_ResetBits(LEDPORT,LED2); //LED灯都为低电平(0) 
		}else{	
        	GPIO_SetBits(LEDPORT,LED2); //LED灯都为高电平(1) 
		}
		//示例2:无锁存
//		GPIO_WriteBit(LEDPORT,LED1,(BitAction)(!GPIO_ReadInputDataBit(KEYPORT,KEY1))); 

		//示例3:有锁存
//		if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
//			delay_ms(20); //延时去抖动
//			if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
//				GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED1))); //LED取反
//				while(!GPIO_ReadInputDataBit(KEYPORT,KEY1)); //等待按键松开 
//			}
//		}

		//示例4:有锁存
//		if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
//			delay_ms(20); //延时20ms去抖动
//			if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
//				//在2个LED上显示二进制加法
//				a++; //变量加1
//				if(a>3){ //当变量大于3时清0
//					a=0; 
//				}
//				GPIO_Write(LEDPORT,a); //直接数值操作将变量值写入LED(LED在GPIOB组的PB0和PB1上)
//				while(!GPIO_ReadInputDataBit(KEYPORT,KEY1)); //等待按键松开 
//			}
//		}

	}
}

参考来源:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mannixcsdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值