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