knob.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include "include.h"
  2. #if USER_KEY_KNOB_EN
  3. //16级旋钮
  4. AT(.com_rodata.port.key)
  5. const u8 tbl_knob_level_16[16 + 1] = {
  6. 0x02, 0x13, 0x24, 0x36, 0x47, 0x59, 0x6A, 0x7B,
  7. 0x8B, 0x9A, 0xA0, 0xB2, 0xC3, 0xD5, 0xE6, 0xF8,
  8. 0xFF,
  9. };
  10. void knob_init(void)
  11. {
  12. u16 adc_ch = 0;
  13. adc_ch |= BIT(ADCCH_PE5); //旋钮1
  14. adc_ch |= BIT(ADCCH_PE6); //旋钮2
  15. saradc_set_channel(adc_ch);
  16. }
  17. AT(.com_text.bsp.key)
  18. void knob_get_level(u16 adc_val, const u8 *knob_level, u8 *key_val)
  19. {
  20. u8 step = 0;
  21. if (s_abs((int)knob_level[*key_val] - (int)adc_val) > 4) { //取绝对值消抖
  22. while (adc_val > knob_level[step]) {
  23. step++;
  24. }
  25. *key_val = step;
  26. }
  27. }
  28. AT(.com_text.port.key)
  29. void knob_process(void)
  30. {
  31. u8 mic_vol_val = saradc_get_value8(ADCCH_PE5);
  32. u8 echo_level_val = saradc_get_value8(ADCCH_PE6);
  33. static u8 echo_level = USER_KEY_KNOB_LEVEL, mic_vol = USER_KEY_KNOB_LEVEL;
  34. knob_get_level(echo_level_val, tbl_knob_level_16, &echo_level);
  35. if (echo_level != sys_cb.echo_level) {
  36. sys_cb.echo_level = echo_level;
  37. msg_enqueue(EVT_ECHO_LEVEL);
  38. }
  39. knob_get_level(mic_vol_val, tbl_knob_level_16, &mic_vol);
  40. if (mic_vol != sys_cb.mic_vol) {
  41. sys_cb.mic_vol = mic_vol;
  42. msg_enqueue(EVT_MIC_VOL);
  43. }
  44. }
  45. #if USER_KEY_KNOB2_EN
  46. AT(.com_text.bsp.key)
  47. u16 knob_process2(u16 *key_val)
  48. {
  49. static u8 key_flag = 0;
  50. static u8 key_cnt_0 = 0, key_cnt_1 = 0;
  51. // my_printf(test_printf,*key_val);
  52. if (*key_val != KEY_VOL_DOWN_PREV && *key_val != KEY_VOL_UP_NEXT) { //过滤掉其他按键
  53. key_flag = 0;
  54. if (*key_val == NO_KEY) {
  55. return NO_KEY;
  56. }
  57. return 0xffff;
  58. }
  59. if (*key_val == KEY_VOL_DOWN_PREV) {
  60. if (key_cnt_0 > 1) { //消抖
  61. key_cnt_0 = 0;
  62. if (key_flag & BIT(1)) {
  63. key_flag = 0;
  64. return KEY_VOL_UP_NEXT | KEY_SHORT_UP; //顺时针
  65. } else {
  66. key_flag |= BIT(0);
  67. }
  68. } else {
  69. key_cnt_0++;
  70. }
  71. }
  72. if (*key_val == KEY_VOL_UP_NEXT) {
  73. if (key_cnt_1 > 1) { //消抖
  74. key_cnt_1 = 0;
  75. if (key_flag & BIT(0)) {
  76. key_flag = 0;
  77. return KEY_VOL_DOWN_PREV | KEY_SHORT_UP; //逆时针
  78. } else {
  79. key_flag |= BIT(1);
  80. }
  81. } else {
  82. key_cnt_1++;
  83. }
  84. }
  85. *key_val = NO_KEY;
  86. return NO_KEY;
  87. }
  88. #endif // USER_KEY_KNOB2_EN
  89. #endif // USER_KEY_KNOB_EN