STM32按键控制led四种方法


杨桃32学习笔记,本文图片文字皆为转述

回顾按键电路

在这里插入图片描述
按键按下引脚为低。

按照之前文章方法在工程文件下加入Hardware中的key.c和key.h

在这里插入图片描述

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

打开固件库用户手册查询io读取相关的函数

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

第一种方式实现按键控制

修改main.c并编译烧录。
读按键接口KEY1=PB0的电平,由于设置输出为上拉高电平所以如果为高说明按键没有被按下接地则默认led灭。
在这里插入图片描述
烧录后,实现按下按键led1亮松开灭。

第二种方式实现按键控制led

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

#include "led.h"
#include "key.h"

int main (void){//主程序
	u8 a; //定义变量
	//初始化程序
	RCC_Configuration(); //时钟设置
	LED_Init();//LED初始化

	KEY_Init();//按键初始化
	//主循环
	while(1){
		//方法1:无锁存
//		if(GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平	由于设置输出为上拉高电平所以如果为高说明按键没有被按下接地则默认led灭
//			GPIO_ResetBits(LEDPORT,LED1); //LED灯都为低电平(0) 
//		}else{	
//        	GPIO_SetBits(LEDPORT,LED1); //LED灯都为高电平(1) 
//		}	
		//方法2:无锁存 
		GPIO_WriteBit(LEDPORT,LED1,(BitAction)(!GPIO_ReadInputDataBit(KEYPORT,KEY1))); 
		//按键为高电平说明没接地则没被按下 写入0 被按下写1	
	}
}

烧录后,实现按下按键led1亮松开灭。
什么是有锁存,就是按下点亮,松开不熄灭,再次按下就会熄灭。

第三种方式实现按键控制led(有锁存)

按键按下一次,led灯状态取反。

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

#include "led.h"
#include "key.h"

int main (void){//主程序
	//u8 a; //定义变量
	//初始化程序
	RCC_Configuration(); //时钟设置
	LED_Init();//LED初始化

	KEY_Init();//按键初始化
	//主循环
	while(1){
		//方法1:无锁存
//		if(GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平	由于设置输出为上拉高电平所以如果为高说明按键没有被按下接地则默认led灭
//			GPIO_ResetBits(LEDPORT,LED1); //LED灯都为低电平(0) 
//		}else{	
//        	GPIO_SetBits(LEDPORT,LED1); //LED灯都为高电平(1) 
//		}	
		//方法2:无锁存 
//		GPIO_WriteBit(LEDPORT,LED1,(BitAction)(!GPIO_ReadInputDataBit(KEYPORT,KEY1))); 
		//按键为高电平说明没接地则没被按下 写入0 被按下写1	
		//示例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)); //等待按键松开 
			}
		}
	}
}

烧录后,按下灯亮,松开不熄灭,再次按下就会熄灭。注意下面这条语句:
while(!GPIO_ReadInputDataBit(KEYPORT,KEY1)); //等待按键松开 避免按键一直按下led状态一直取反

第4种方式实现按键控制led(有锁存,在2个LED上显示二进制加法)

GPIO_Write(LEDPORT,a); //整组写入不是某个引脚
a=1是001->pa0=1,a=2是010->pa0=0 pa1=1,a=3是011->pa0=1 pa1=1,a=4是100->pa0=0 pa1=0。

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

#include "led.h"
#include "key.h"

int main (void){//主程序
	u8 a; //定义变量
	//初始化程序
	RCC_Configuration(); //时钟设置
	LED_Init();//LED初始化

	KEY_Init();//按键初始化
	//主循环
	while(1){
		//方法1:无锁存
//		if(GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平	由于设置输出为上拉高电平所以如果为高说明按键没有被按下接地则默认led灭
//			GPIO_ResetBits(LEDPORT,LED1); //LED灯都为低电平(0) 
//		}else{	
//        	GPIO_SetBits(LEDPORT,LED1); //LED灯都为高电平(1) 
//		}	
		//方法2:无锁存 
//		GPIO_WriteBit(LEDPORT,LED1,(BitAction)(!GPIO_ReadInputDataBit(KEYPORT,KEY1))); 
		//按键为高电平说明没接地则没被按下 写入0 被按下写1	
		//示例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)); //等待按键松开  避免按键一直按下led状态一直取反
		//示例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)); //等待按键松开 
			}
		}
	}
}

烧录后,成功实现。

  • 11
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值