【ufun使用】之按键

其实按键的使用和点亮led灯是差不多的,只不过一个是输出,一个输入,GPIO的初始化上也差不多,配置的时候将GPIO_Mode设置为GPIO_Mode_IN_FLOATING浮空输入,这里插一下,在stm32中有4种输入方式他们分别是GPIO_Mode_AIN(模拟输入)GPIO_Mode_IN_FLOATING(浮空输入)GPIO_Mode_IPD(下拉输入)GPIO_Mode_IPU(上拉输入)。这些输入方式从名字就这个可以看出来模拟输入一般是用作adc采集的,浮空输入的意思是引脚的状态是有内部决定的,一般按键检测用的是这种输入方式,上拉下拉输入就相当于在引脚上装上了一个上拉或者下拉电阻。
接下来就说一下这个学习板的按键资源,这个学习板上只有复位按键是机械按键,剩下的那四个是触摸按键,其实按照这个学习板的设计,用触摸按键的的成本更低,而且编程的步骤也更简单。先说一下按键的连接,按键是由一个触摸按键控制芯TTP224N-BSB控制。具体看图

触摸按键设计
两块导体(极板)中间夹着一块绝缘体(介质)就能构成的电容。对触摸感应按键而言,PCB 板上的金属感应盘就是电容的一个极板,而周围铺铜或手指构成了另一个极板,PCB材料本身或者PCB板上覆盖的介质就是电容中间的绝缘体,因而构成一个电容器。无手指触摸和有手指触摸时电容构成如下图。当没有手指接触时,只有基准电容Cp ;当有手指接触时,“按键”通过手指就形成了电容Cf 。由于两个电容是并联的,所以手指接触“按键”前后,总电容的变化率为C% = ((Cp+Cf)-Cp)/Cp = Cf/Cp 。这个电容的变化引起芯片内部振荡频率或充放电时间的变化,使芯片内部能够检测到触摸发生,从而产生触发信号。电容的变化率越大,触摸就越易检测到。PCB的设计原则同样也是使触摸前后的电容变化率尽可能大:即减小PCB的基准电容,增大手指电容。

下面就是代码部分,很简单看注释就行。

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

void Led_GPIO_init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct; //定义一个gpio结构体
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能时钟(为了节省功耗,时钟默认关)
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //设置为上拉推挽输出
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1|GPIO_Pin_2; //定义0引脚
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //管脚速度
	GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化gpio
	GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); //先把这些端口置高
	GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET); //防止这些灯乱闪
	GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_SET);
}

void key_GPIO_int(void)
{
	GPIO_InitTypeDef key_GPIO_InitStruct; //定义一个gpio结构体
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能时钟(为了节省功耗,时钟默认关)
	
	key_GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置为浮空输入按键比较常用
	key_GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5| GPIO_Pin_4; //其中的两个在C端口的4号5号
	GPIO_Init(GPIOC, &key_GPIO_InitStruct); //初始化C端口的输入引脚
	
	GPIO_InitTypeDef key1_GPIO_InitStruct; //定义一个gpio结构体
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能时钟(为了节省功耗,时钟默认关)
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //由于B3,4占用了JTAG的调试接口,所以需要复用一下
	key_GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //同样设置为浮空输入
	key_GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3| GPIO_Pin_4; //定义0引脚
	GPIO_Init(GPIOB, &key1_GPIO_InitStruct); //初始化gpio
}

int main(void)
{
	Led_GPIO_init(); //初始化GPIO
	key_GPIO_int(); //按键初始化
	while(1)
	{
		if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4) == 1) //如果接收到的是1,和89c51差不多
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
		}
		else
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
		}
		
		if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5) == 1)
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET);
		}
		else
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);
		}
		
		if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3) == 1)
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_RESET);
		}
		else
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_SET);
		}
		
		if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4) == 1)
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
			GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET);
			GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_RESET);
		}
		else
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
			GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);
			GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_SET);
		}
	}
}


资源下载https://github.com/xiaoengineer/ufun_key.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值