音视频及家电
本文是关于开发者 乘简 基于BL606P-DVK开发板实战开发的系列文章中的第五篇,主要介绍了CAN扩展模块收发测试!
01 硬件部分
BL606P的按键板上有5个按键,但只用到了1个GPIO16,其原理采用的是ADC采集的方法实现的,但不支持同时按住两个及以上键的功能!
代码如下:
main.c
#include#include #include #include #include "app_main.h" #include "bl606p_adckeys.h" int main(int argc, char *argv[]) { uint16_t t=0; board_yoc_init(); adckey_Init(); printf(" app start core clock %d........ ", soc_get_cur_cpu_freq()); while(1) { t=GetKey(); if(t!=KEY_NO){ LOGD("INFO", "/* %d */ ", t); } } codec_output_init(); codec_input_init(); codec_loop_init(); return 0; }
bl606p_adckeys.h
#ifndef _BL606P_ADCKEYS_H_ #define _BL606P_ADCKEYS_H_ #include#include #include #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(kKEYCS)i=KEYCS;//在按键松开之前,防止计数溢出 } } else bk=KEY_NO; return KEY_NO; }
下载的时候,需要把GPIO16的跳线帽插回去,程序下载完后,把路线帽插到右边,串口输出中才会出现正确的结果,但有时即使还原了跳线帽也无法下载程序,所以要按住BOOT键不放,再按一下RST键,再松开BOOT键才能正常下载程序。
编辑:黄飞
全部0条评论
快来发表一下你的评论吧 !