BL606P的按键板上有5个按键,但只用到了1个GPIO16,其原理采用的是ADC采集的方法实现的,但不支持同时按住两个及以上键的功能!
代码如下:
main.c
#include <aos/aos.h>
#include <stdio.h>
#include <sys_clk.h>
#include <drv/pin.h>
#include "app_main.h"
#include "bl606p_adckeys.h"
int main(int argc, char *argv[])
{
uint16_t t=0;
board_yoc_init();
adckey_Init();
printf("\r\napp start core clock %d........\r\n", soc_get_cur_cpu_freq());
while(1)
{
t=GetKey();
if(t!=KEY_NO){
LOGD("INFO", "/* %d */\r\n", t);
}
}
codec_output_init();
codec_input_init();
codec_loop_init();
return 0;
}
bl606p_adckeys.h
#ifndef _BL606P_ADCKEYS_H_
#define _BL606P_ADCKEYS_H_
#include <aos/aos.h>
#include <drv/pin.h>
#include <aos/hal/adc.h>
#define K4 0
#define K3 1
#define K6 4
#define K5 6
#define K7 8
#define KEY_NO 10
void adckey_Init();
uint16_t GetKey();
#endif
bl606p_adckeys.c
#include "bl606p_adckeys.h"
adc_dev_t adc;
void adckey_Init()
{
csi_pin_set_mux(GPIO_PIN_16, GPIO16_ADC_CH8);
adc.port = 8;
adc.config.sampling_cycle = 100;
hal_adc_init(&adc);
}
uint16_t GetKey()
{
#define KEYCS 10//持续按多久算有效按键,这里如果改成5的话,则有个按键9也是有效按键了,改成10则无问题
uint32_t value;
uint16_t k=0;
static uint16_t bk=KEY_NO,i=0;
hal_adc_value_get(&adc, &value, HAL_WAIT_FOREVER);
k = (value & 0xffff)/1000;
if(k<KEY_NO){//有效按键
if(bk!=k){//不是重复按键
bk=k;
i=0;//计数器清零
}
else{//重复按键
i++;//计数器+1
if(i==KEYCS){//计数完成
return k;//返回有效按键
}
else if(i>KEYCS)i=KEYCS;//在按键松开之前,防止计数溢出
}
}
else bk=KEY_NO;
return KEY_NO;
}
下载的时候,需要把GPIO16的跳线帽插回去,程序下载完后,把路线帽插到右边,串口输出中才会出现正确的结果,但有时即使还原了跳线帽也无法下载程序,所以要按住BOOT键不放,再按一下RST键,再松开BOOT键才能正常下载程序。
演示程序
0853634cafbd56fdfaad9daecb875441
|