📄 ps.lst
字号:
194 3 if(ref&dout[p]) //输出一位控制数据 ?是否满足4us
195 3 DO1=1;
196 3 else
197 3 DO1=0;
198 3 for(i=0;i<3;i++) //大概2us的延迟,
199 3 _nop_();
200 3 CLK1=1;
201 3 if(DI1)
202 3 din[p]=ref|din[p]; //输入一位控制数据 ?是否满足4us
203 3 for(i=0;i<2;i++) //大概2us的延迟,
204 3 _nop_();
205 3 }
206 2 DO1=1;
207 2 if(p<4)
208 2 {
209 3
210 3 // delay(1);
211 3 // do
212 3 // {
213 3 // while(ACK2) //检测ACK信号是否响应。 有响应则向下 执行。
214 3 // {
215 3 _nop_();
216 3 // ACK=1;
217 3 // timeout=10000;
218 3 // break;
219 3 // }
220 3 delay(2);
221 3 // }
222 3 // while(timeout--);
223 3 }
224 2 // else
225 2 // {}
226 2
227 2 }
228 1 SEN1=1;
229 1 // delay(2);
230 1 // keysignout(); // 键码值通过串口输出。
231 1 KEY_gue[0]=(din[3]|0x0F);
232 1 KEY_gue[0]<<=8;
233 1 KEY_gue[0]+=(din[4]|0x0F);
234 1 for(i=0;i<5;i++)
235 1 din[i]=0x00;
236 1 // for(i=0;i<255;i++)
237 1 // delay(255);
238 1
239 1 }
240 void Isp_Init() //初始化串口,
241 {
C51 COMPILER V8.05a PS 06/20/2007 10:34:01 PAGE 5
242 1 SSTAT=0xFA;
243 1 BRGCON=0x00;
244 1 AUXR1=0x40;
245 1 SCON=0x50;
246 1 BRGR1=0x90;
247 1 BRGR0=0x00;
248 1 BRGCON=0x03;
249 1 }
250
251 void t0() interrupt 1 using 2 //使用定时器0中断服务程序 ,
252 {
253 1 /* if(Buf_emp==0)
254 1 TxD=0;
255 1 else
256 1 TxD=1; */
257 1 if(Saf_F) //安全间隔时间定时,
258 1 {
259 2 Saf_F=0;
260 2 IR_OUT=1;
261 2 TH0=39;
262 2 TL0=200;
263 2 TR0=1;
264 2 }
265 1 else
266 1 {
267 2 if(Buf_emp==0)
268 2 {
269 3 TH0=255; //定时45us
270 3 TL0=6;
271 3 if(Bit_F==0)
272 3 {
273 4 Bit_F=1;
274 4 ref=0x00000001;
275 4 }
276 3 if(*p_b&ref) //输出一位红外数据,
277 3 IR_OUT=0;
278 3 else
279 3 IR_OUT=1;
280 3 TR0=1;
281 3 ref<<=1;
282 3 if(ref>0x00080000) //判断一个红外码字是否发完,
283 3 {
284 4 Bit_F=0;
285 4 Buf_ful=0;
286 4 if(p_b==&irbuf[31])
287 4 p_b=&irbuf[0];
288 4 else
289 4 p_b++;
290 4 if(p_b==p_t)
291 4 Buf_emp=1;
292 4 Saf_F=1; //置保护时间标志,
293 4
294 4 }
295 3 }
296 2 else
297 2 {
298 3 TH0=255; //这个时间能否再减小?
299 3 TL0=6;
300 3 TR0=1;
301 3 IR_OUT=!PWM;
302 3 }
303 2 }
C51 COMPILER V8.05a PS 06/20/2007 10:34:01 PAGE 6
304 1 }
305
306 void Trans() //手柄键码值转换为红外输出码值,
307 {
308 1 uchar i;
309 1 uint ref; //一次扫描手柄后出现变化的键,
310 1 // if(KEY[0]==KEY[1])
311 1 // return;
312 1 // else
313 1 if(Buf_ful==0)
314 1 {
315 2
316 2 for(i=0,ref=0x8000;i<16;i++,ref>>=1)
317 2 {
318 3 if(chan_key&ref)
319 3 {
320 4 if(stat_key&ref) //为真检测到释放键
321 4 {
322 5 if(Host_F) //释放键为主手柄的释放键
323 5 ir_key=hos_tabup[i];
324 5 else //释放键为副手柄的释放键
325 5 ir_key=gue_tabup[i]; //释放键进入红外寄存器
326 5 *p_t=ir_key&0x00FF;
327 5 *p_t<<=12;
328 5 *p_t+=(((ir_key&0xFF00)>>6)|0x0802);
329 5
330 5 /* if(p_t==&irbuf[31])
331 5 p_t=&irbuf[0];
332 5 else
333 5 p_t++;
334 5 Buf_emp=0; //红外输出缓冲区有数据,
335 5 if(p_t==p_b)
336 5 {
337 5 Buf_ful=1; //红外输出缓冲区满,
338 5 while(1) //测试缓冲区是否会满,
339 5 {
340 5 DO1=1;
341 5 delay(5);
342 5 DO1=0;
343 5 delay(5);
344 5 }
345 5 return;
346 5 }
347 5
348 5 *p_t=0x0005AA8A; //结束键进缓冲区, */
349 5 }
350 4 else //检测到按下键,
351 4 {
352 5 if(Host_F) //按下键为主手柄的按下键,
353 5 ir_key=hos_tabdn[i];
354 5 else //按下键为副手柄的按下键,
355 5 ir_key=gue_tabdn[i];
356 5 *p_t=ir_key&0x00FF;
357 5 *p_t<<=12;
358 5 *p_t+=(((ir_key&0xFF00)>>6)|0x0802); //标准红外码转换为添加过引导码的发送红外码,
359 5 }
360 4 if(p_t==&irbuf[31])
361 4 p_t=&irbuf[0];
362 4 else
363 4 p_t++;
364 4 Buf_emp=0; //红外输出缓冲区有数据,
365 4 if(p_t==p_b)
C51 COMPILER V8.05a PS 06/20/2007 10:34:01 PAGE 7
366 4 {
367 5 Buf_ful=1; //红外输出缓冲区满,
368 5 // while(1) //测试缓冲区是否会满,
369 5 // {
370 5 TxD=0;
371 5 // }
372 5 return;
373 5 }
374 4
375 4 }
376 3
377 3 }
378 2 }
379 1
380 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1062 ----
CONSTANT SIZE = 133 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 29 3
IDATA SIZE = 128 ----
BIT SIZE = 5 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -