通過電位器修改聲音大小

通過電位器修改聲音大小從原理上講就是重新寫一個按鍵類型,只不過按鍵類型是一個旋鈕,旋鈕就相當於一個滑動變阻器,通過旋轉之後,芯片的讀取到的電壓值是在變化的,咱們再根據值的不同進行下一步的操作。
具體操作如下:
定義一個宏定義來管理是否打開旋轉聲音控制
#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 (中間是三個英文的槓)進行交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章