一、硬件连接
根据官方提供的资料,可以看到如下的原理图
KEY_IN通过FPC连接线连接至KEY
通过不同大的分压,确定哪个按键按下
二、软件实现
平头哥官网给出的ADC例程
1、设置管脚、
void adcpin_init(void)
{
csi_pin_set_mux(GPIO_PIN_16, GPIO16_ADC_CH8);
}
2、ADC初始化
void adckey_Init()
{
adc.port = 8;
adc.config.sampling_cycle = 100;
hal_adc_init(&adc);
}
3、按键检测代码
#define KEY_NOTHING 19
uint16_t GetKey()
{
//持续检测按键次数
#define CHECKNUM 10
uint32_t value;
uint16_t kval=0;
uint16_t oldkey=KEY_NOTHING,i=0;
hal_adc_value_get(&adc, &value, HAL_WAIT_FOREVER);
kval = (value & 0xffff)>> 9;
if(kval<KEY_NOTHING){
if(oldkey!=kval){
oldkey=kval;
i=0;
}
else{//重复检测按键
i++;
if(i==CHECKNUM){
return kval;//返回有效按键
}
else if(i>CHECKNUM)i=CHECKNUM;
}
}
else oldkey=KEY_NOTHING;
return KEY_NOTHING;
}
4、按键判定代码
keyval = GetKey();
if( keyval < 19)
printf("Key Pressed: %d \r\n", keyval);
aos_msleep(5);
switch (keyval) {
case 0:
printf("K4 Pressed. \r\n");
break;
case 3:
printf("K3 Pressed. \r\n");
break;
case 8:
printf("K6 Pressed. \r\n");
break;
case 11:
case 12:
printf("K5 Pressed. \r\n");
break;
case 17:
printf("K7 Pressed. \r\n");
break;
}
三、运行后效果
按键检测过程中,由于运用ADC检测电压,会出现浮动情况,比较好的解决办法是多读数几次,取平均值。