通过电位器修改声音大小

通过电位器修改声音大小从原理上讲就是重新写一个按键类型,只不过按键类型是一个旋钮,旋钮就相当于一个滑动变阻器,通过旋转之后,芯片的读取到的电压值是在变化的,咱们再根据值的不同进行下一步的操作。
具体操作如下:
定义一个宏定义来管理是否打开旋转声音控制
#define POTENT_KEY 1
下一步就是创建一个读取旋转数据的IO口,key_init()中:

#if POTENT_KEY
    adc_ch |= BIT(ADCCH_PA7);
#endif

这样就创建了一个IO口,下一步就是创建一个变量去承接变化的值,get_adc_val()中:

#if POTENT_KEY
    adc_cb.potent_val = (u8)(adc_cb.sfr[ADCCH_PA7]>>2); 
 #endif  

其实上面就创建了一个IO口的按键,需要注意的是,两个创建的位置需要对应,去读取电位器变化的电压。接下来就是调用了,在bsp_key_scan()中;

#if POTENT_KEY
 	 sys_cb.potvol_lev = get_potent_val();//实时的检测是否需要变化,get_potent_val()需要自己定义
 	 if(bef_val != sys_cb.potvol_lev)//表示检测到的值发生了变化,但是不是每次变化都需要去修改声音
 	 {
 	 	step++;
 	 	if(step >= CNT_ElIMI)//变化次数达到了一定范围,就需要去修改声音大小了,检测速度是很快的,防止系统误检测
 	 	{
 	 		 if(sys_cb.potvol_lev > sys_cb.vol)
		 	 {
		 	 	sys_cb.vol = sys_cb.potvol_lev;
		 	 	 msg_enqueue(MSG_POTENT_VOL_UP);
		 	 }
		 	 else if(sys_cb.potvol_lev < sys_cb.vol)	
		 	 {
		 	 	 sys_cb.vol = sys_cb.potvol_lev;
		 	 	 msg_enqueue(MSG_POTENT_VOL_DOWN);
		 	 }
			bef_val= sys_cb.potvol_lev;
 	 	}
 	 }
 	 else
 	 {
		step = 0;
 	 }
#endif 

get_potent_val()函数的定义如下

#if POTENT_KEY
//AT(.com_text.port.key)
static u8 get_potent_val(void)
{
    if(adc_cb.potent_val/EVE_LEL >=  VOL_MAX)//adc_cb.potent_val/EVE_LEL其实就已经代表了转换后的声音大小
    {
    		return 0;
    }
    else 
       	return VOL_MAX- adc_cb.potent_val/EVE_LEL;    
}
#endif // USER_ADKEY

之后再去定义两个消息需要干嘛就好了,消息的定义只需要仿照自带声音修改的操作即可。如果还想写得高级一点也是可以继续下一步开发的,具体操作可以自行实现。还不清楚的小伙伴可以添加我的个人微信 lqy—1997 (中间是三个英文的杠)进行交流。

发布了31 篇原创文章 · 获赞 52 · 访问量 8852

猜你喜欢

转载自blog.csdn.net/yuanbaba_123/article/details/104818382
今日推荐