接下来就说一下这个学习板的按键资源,这个学习板上只有复位按键是机械按键,剩下的那四个是触摸按键,其实按照这个学习板的设计,用触摸按键的的成本更低,而且编程的步骤也更简单。先说一下按键的连接,按键是由一个触摸按键控制芯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);
- }
- }
- }
复制代码
|