📄 speakercontrol.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 + -