电容按键相对于普通按键寿命更长、更易操作,本实验利用nRF51822实现电容按键。
使用电容充电时间来检测有没有按下。
正常情况下,覆铜区域没有被触摸时与PCB间有一定的杂散电容,当手触摸到覆铜区域时,手与覆铜区域间将形成新的电容,导致充电时间变长。
原理图如下:
PCB:
按键扫描基本流程:
1、引脚设置为输出,并输出低电平,将杂散电容中的电压放干净。
2、引脚设置为浮空输入,开始计数并等待IO上升沿。
3、当引脚变为高电平时,停止计数,得到充电时间。
4、判断充电时间是否超过阈值。
首先初始化nRF引脚:
int16_t Touch_Key_A=0; int16_t Touch_Key_B=0; void touch_key_init(void) { nrf_gpio_range_cfg_output(15,16); nrf_gpio_pin_clear(15); nrf_gpio_pin_clear(16); } |
将引脚初始化为输出,并输出低电平。
计算电容充电时间:
void key_count(void) { uint8_t A_OK=0,B_OK=0; uint16_t Count=0; nrf_gpio_range_cfg_output(15,16); nrf_gpio_pin_clear(15); nrf_gpio_pin_clear(16);//首先设置为输出 并输出低电平 把杂散电容中的电放干净 delay_ms(5); nrf_gpio_range_cfg_input(15,16,GPIO_PIN_CNF_PULL_Disabled);//设置为浮空输入 while(1)//等待两个按键变为高电平,即产生上升沿 { if(nrf_gpio_pin_read(15)==1 && A_OK ==0) { Touch_Key_A=Count;//记录下Count的值,这就是充电花费的时间 A_OK=1; } if(nrf_gpio_pin_read(16)==1 && B_OK ==0) { Touch_Key_B=Count; B_OK =1; } if( A_OK && B_OK) { break; } Count++; } } |
获得到充电时间后,判断按键是否被按下:
uint8_t key_get(void) { int16_t Count_A=0,Count_B=0; uint8_t i; for(i=0;i<3;i++)//取3次做平均值,提高稳定性 { key_count(); Count_A+=Touch_Key_A; Count_B+=Touch_Key_B; } Count_A=Count_A/3; Count_B=Count_B/3; if(Count_A>80)//80为按下的阈值 在本PCB上,未按下时Count大约为10左右,按下在100-140左右 return 1; if(Count_B>80) return 2; return 0; } |
按键扫描函数:
uint8_t key_scan(uint8_t while_up) { uint8_t key_back; key_back=key_get(); if(key_back!=0) { if(key_back==key_get()) { if(while_up) while(key_get()); return key_back; } } return 0; } |
发表回复