单片机03--按键--寄存器版

GPIO 端口相关寄存器 STM32F40x 芯片

目标:

++++开关KEY1控制开灯。++++

分析:

KEY1---PA0--->输入---->浮空输入/下拉输入

KEY1不导通时,PA0输入为低电平,KEY1导通时,PA0输入为高电平。

实现:
按键初始化

①查找PA连接的时钟线,开启时钟。

②设置GPIO端口模式---->输入模式

③设置GPIO端口输入模式

复制代码
/*****************************************
函数功能:按键初始化
函数接口:KEY1--PA0--浮空/下拉输入
******************************************/
void KEY_Init(void)
{
	RCC->AHB1ENR |= 1<<0;	//按键PA0时钟使能
	
	GPIOA->MODER &= ~(3<<0*2);	//清零&&输入模式
	GPIOA->PUPDR &= ~(3<<0*2);	//清零&&浮空
	GPIOA->PUPDR |= 2<<0*2;	//下拉
}
按键消抖

①获取KEY1/PA0的状态

GPIOA->IDR只允许读,不允许写。获取PA0口的状态需要(GPIOA->IDR & 1<<0)。

②if两次读取GIPA->IDR的第0位,实现消抖。

③设静态变量flag作为标志位,防止已有按键按下时,其他按键按下仍能进行操作

复制代码
/*****************************************
函数功能:按键消抖
函数接口:KEY1--PA0--浮空/下拉输出
返回参数:返回0:没有按下,返回1:按键按下
******************************************/
uint8_t KEY_Scan(void)
	{	static uint8_t flag =0;	//0:按键未按下,1:按键已按下
	if((flag ==0) && (GPIOA->IDR & 1<<0))	//判断按键是否按下,IDR第0位为1时按下
	{
		flag = 1;
		delay(500);
		if(GPIOA->IDR & 1<<0)
		{
			return 1;
		}
	}
	else if((flag==1)&& !(GPIOA->IDR & 1<<0))	//松手检测
	{
		flag = 0;	//按键松手
	}
	return 0;
}
位带头文件

++++io_bit.h可以在社区获得。++++

将位带头文件包含到编辑的头文件中,通过宏定义,可实现更简单操作寄存器。

点亮LED的方法:

LED6 = 0; //PB3低电平点亮

GPIOB->ODR &= ~(1<<4); //PB4低电平点亮

GPIOB->ODR &= ~(1<<5); //PB5低电平点亮

两个按键检测&&按键位带使用举例:

复制代码
//双按键检测
uint8_t KEY_Scan2(void)
{
	static uint8_t flag = 0;
	if((flag == 0)&&(GPIOA->IDR & 1<<0 || GPIOA->IDR & 1<<1))
	{
		delay(1000);
		if(GPIOA->IDR & 1<<0)
		{
			return 1;
		}
		if(GPIOA->IDR & 1<<1)
		{
			return 2;
		}
	}
	else if((flag == 1) && (!(GPIOA->IDR & 1<<0) || !(GPIOA->IDR & 1<<1)))
	{
		flag = 0;
	}
	return 0;
}

//位带使用
uint8_t KEY_Scan3(void)
{
	static uint8_t flag = 0;
	if((flag == 0)&&(KEY1==1 || KEY2 == 1))
	{
		delay(1000);
		if(KEY1==1)
		{
			return 1;
		}
		if(KEY2==1)
		{
			return 2;
		}
	}
	else if((flag == 1) && (KEY1==0 || KEY2==0))
	{
		flag = 0;
	}
	return 0;
}
相关推荐
H_oRIZoN_9 分钟前
Linux入门DAY44 ARM 入门 Day02|ARM 汇编指令、模式切换、栈操作、汇编 C 混合编程
linux·单片机·嵌入式硬件·arm·linux应用编程
国科安芯2 小时前
卫星电源管理系统中宽温域低功耗MCU的选型与适应性分析
嵌入式硬件·mcu·抗干扰·抗辐射·宽温
老当益壮梁奶奶10 小时前
51单片机DS18B20温度传感器详解:单总线时序与C51驱动实现
笔记·stm32·单片机·嵌入式硬件·51单片机
Horn Still Sounds10 小时前
ARM嵌入式基础|内核、寄存器、架构、存储、汇编移位全面梳理
arm开发·单片机·嵌入式硬件·硬件架构
星栖与芯10 小时前
LiteOS-M 切换汇编逐行图解(2):指令·异常机制·全景表
stm32·单片机·嵌入式硬件·harmonyos·鸿蒙系统
从零开始的嵌入式之旅12 小时前
day44
arm开发·经验分享·笔记·嵌入式硬件
硬禾科技14 小时前
连接世界的工程哲学
嵌入式硬件·测试工具·自动化·硬件工程
深圳市青牛科技实业有限公司 小芋圆14 小时前
GC1808:高性能、低成本的立体声音频ADC芯片
人工智能·嵌入式硬件·无人机·太阳能逆变器
fhq_fn_jgd14 小时前
51单片机(串口通信)
单片机·嵌入式硬件
深圳市元恩微科技开发有限公司14 小时前
兆讯恒达(北京兆讯)MH2457 系列 国产屏驱 MCU
单片机