⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 speakercontrol.lst

📁 通过车载终端采集GPS数据
💻 LST
字号:
C51 COMPILER V7.09   SPEAKERCONTROL                                                        09/16/2008 09:24:22 PAGE 1   


C51 COMPILER V7.09, COMPILATION OF MODULE SPEAKERCONTROL
OBJECT MODULE PLACED IN .\output\speakercontrol.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE audio\speakercontrol.c LARGE BROWSE INCDIR(audio\;eeprom\;extendUART\;flash
                    -\;gps\;inter\;key\;mcu\;menu\;usb\;gprs\;main\;1wire\) DEBUG OBJECTEXTEND PRINT(.\output\speakercontrol.lst) OBJECT(.\ou
                    -tput\speakercontrol.obj)

line level    source

   1          #include "typedef.h"
   2          #include "speakercontrol.h"
   3          
   4          #define SPEAK_FIRST_ACC       2   /*第一次按键计次*/
   5          #define SPEAK_CONTINUE_ACC    10  /*连续按键间隔计次*/
   6          #define SPEAK_RELEASE_ACC     2   /*按键释放间隔次数*/
   7          
   8          static char speakCode;     /*保存按键码*/
   9          static Byte speakStatus;   /*当前声音控制状态*/
  10          static Byte speakState;
  11          static Byte speakAcc;
  12          static Uint8 speakKeep;
  13          extern Uchar volatile xdata D12_Y2;//原来的xCONTROLBYTE82;//键盘扫描后的输出地址,用到4-7
  14          extern Uchar volatile xdata D12_Y1;//原来的xCONTROLBYTE81K
  15          extern idata Uchar D16CS;//D12_Y1的寄存器,原来的xConByte81KValue
  16          
  17          
  18          void speak_init()
  19          {
  20   1              speakState = 0;
  21   1          speakAcc = 0;
  22   1          speakKeep = SPEAK_NULL;
  23   1              speakCode = CONTROL_NOSPEAKER;
  24   1              speakStatus = CONTROL_NOSPEAKER;
  25   1              set_speakmode(speakStatus);
  26   1      }
  27          
  28          /***************************************
  29          *用来具体控制喇叭的函数
  30          *mode:取值为CONTROL_BOARDINNER、CONTROL_BOARDOUTER、CONTROL_MICINNER、CONTROL_MICOUTER、CONTROL_NOSPEAKER
  31          ****************************************/
  32          void set_speakmode(Byte mode)
  33          {
  34   1              D16CS &= 0xf0;//0x0f;
  35   1              D16CS |= mode;//控制语音报站在车厢内
  36   1              D12_Y1 = D16CS;
  37   1      }
  38          
  39          /*******************************************************
  40          /*对MIC喇叭进行控制处理,需要在扫描完后调用
  41          *********************************************************/
  42          void speak_miccontrol()
  43          {
  44   1          if (CONTROL_NOSPEAKER == speakCode)
  45   1          {
  46   2              if ((speakStatus == CONTROL_MICOUTER) || (speakStatus == CONTROL_MICINNER))
  47   2              {
  48   3                  speakStatus = speakCode;
  49   3                      set_speakmode(speakStatus);
  50   3              }
  51   2          }
  52   1              else
  53   1              {
C51 COMPILER V7.09   SPEAKERCONTROL                                                        09/16/2008 09:24:22 PAGE 2   

  54   2              if (speakStatus != speakCode)
  55   2              {
  56   3                      speakStatus = speakCode;
  57   3                      set_speakmode(speakStatus);
  58   3              }
  59   2              }
  60   1      }
  61          
  62          /*********************************************
  63          *报站喇叭控制
  64          *mode:取值为CONTROL_BOARDINNER、CONTROL_BOARDOUTE、CONTROL_NOSPEAKER
  65          *********************************************/
  66          void speak_boardcontrol(Byte mode)
  67          {
  68   1          if ((speakStatus != CONTROL_MICOUTER) && (speakStatus != CONTROL_MICINNER))
  69   1          {
  70   2              speakStatus = mode;
  71   2              set_speakmode(mode);
  72   2          }
  73   1      }
  74          /************************************
  75          *
  76          话筒扫描处理流程:
  77          1)通过比较上一次的按键值来消除抖动。不相同就清除计次,相同就累加计次。
  78          2)累加到一定次数认为是按键稳定,发送蜂鸣声,判断按键类型。
  79          3)当按键持续一定时间后定时发送蜂鸣声和按键类型。
  80          4)按键释放要有一定的时间。即两次连续按键要有一定时间间隔。
  81          5)考虑本产品的实际情况,向上和向上按键允许连续,取消和确认只能是单次按键。
  82          
  83          当有效按键后要发送蜂鸣声。
  84          通过简单的状态机处理按键的抖动、单次按键、连续按键。
  85          keyState有以下几个状态:
  86          0:第一次按键状态,消除抖动状态。不相同就清除计次,相同就累加计次,到一定的次数认为是有效按键。
  87          1:连续按键状态。
  88          2:释放按键状态。
  89          *
  90          *************************************/
  91          void speak_process(void)
  92          {
  93   1      
  94   1              Uint8 tmpValue;//最终保存结果
  95   1      
  96   1      
  97   1              tmpValue = D12_Y2;
  98   1              tmpValue &= 0x06;//获取实际对话筒的控制
  99   1      
 100   1          /*通过计次来达到消除抖动的目的*/
 101   1          if( tmpValue == speakKeep )
 102   1          {
 103   2              speakAcc ++;
 104   2          }
 105   1          else
 106   1          {
 107   2              speakAcc = 0;
 108   2              speakKeep = tmpValue;
 109   2          }
 110   1      
 111   1          switch(speakState)
 112   1          {
 113   2              case 0: /*第一次按键状态*/
 114   2                  if( speakKeep == SPEAK_NULL )
 115   2                  {
C51 COMPILER V7.09   SPEAKERCONTROL                                                        09/16/2008 09:24:22 PAGE 3   

 116   3                      speakAcc = 0;
 117   3                      break;
 118   3                  }
 119   2      
 120   2                  if( speakAcc == SPEAK_FIRST_ACC )
 121   2                  {
 122   3                      speakState = 1;
 123   3      
 124   3                                      if (INNER_MIC == speakKeep)
 125   3                                      {
 126   4                                              speakCode = CONTROL_MICINNER;
 127   4                                      }
 128   3                                      else if (OUT_MIC == speakKeep)
 129   3                                      {
 130   4                                              speakCode = CONTROL_MICOUTER;
 131   4                                      }
 132   3                                      else
 133   3                                      {
 134   4                                              speakState = 0;
 135   4                          speakAcc = 0;
 136   4                                      }                       
 137   3                                      
 138   3                  }
 139   2      
 140   2                  break;
 141   2      
 142   2              case 1: /*连续按键状态*/
 143   2                  if( speakAcc == SPEAK_CONTINUE_ACC )
 144   2                  {
 145   3                      speakAcc = SPEAK_FIRST_ACC;    /*防止计数溢出*/
 146   3      
 147   3                  }
 148   2                  else if( speakAcc == 0 )
 149   2                  { /*按键有变化*/
 150   3                      speakState = 2;
 151   3                  }
 152   2      
 153   2                  break;
 154   2      
 155   2              case 2: /*释放按键状态*/
 156   2                  if( (speakAcc >= SPEAK_RELEASE_ACC) && (speakKeep==SPEAK_NULL) )
 157   2                  {
 158   3                      speakState = 0;
 159   3                      speakCode = CONTROL_NOSPEAKER;
 160   3                  }
 161   2      
 162   2                  break;
 163   2      
 164   2              default:
 165   2                  speakState = 0;
 166   2                  break;
 167   2          }
 168   1      
 169   1          return;
 170   1      
 171   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    256    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =      5    ----
C51 COMPILER V7.09   SPEAKERCONTROL                                                        09/16/2008 09:24:22 PAGE 4   

   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -