📄 386.lst
字号:
251 }
252
253 */
254
255 void MT8880_StatusRegister_READ()
256 {
257 1
258 1 MT8880_CP2=0;
259 1 MT8880_RW=1; //读状态寄存器
260 1 MT8880_RS0=1;
261 1 MT8880_CS=0;
262 1 MT8880_D0=1;
263 1 MT8880_D1=1;
264 1 MT8880_D2=1;
265 1 MT8880_D3=1;
266 1 MT8880_CP2=1;
267 1
268 1 }
269
270 void MT8880_DataRegister_READ()
271 {
272 1 MT8880_CP2=0;
273 1 MT8880_RW=1; //读接收数据寄存器
274 1 MT8880_RS0=0;
275 1 MT8880_CS=0; //给时钟信号
276 1 MT8880_D0=1;
277 1 MT8880_D1=1;
278 1 MT8880_D2=1;
279 1 MT8880_D3=1;
280 1 MT8880_CP2=1; //读状态寄存器值到D0-D3口
281 1
282 1 }
283
284 void MT8880_ControlRegister_Initialize()
285 {
286 1 MT8880_CP2=0;
287 1
288 1 MT8880_RS0=1; //du 1
289 1 MT8880_RW=1;
290 1 MT8880_CS=0;
291 1 MT8880_D0=1;
292 1 MT8880_D1=1;
293 1 MT8880_D2=1;
294 1 MT8880_D3=1;
295 1 MT8880_CP2=1;
296 1 MT8880_CP2=0;
297 1 MT8880_CS=1;
298 1
299 1 MT8880_RS0=1; //xie 1
300 1 MT8880_RW=0;
301 1 MT8880_CS=0;
302 1 MT8880_D0=0;
C51 COMPILER V6.10 386 03/14/2006 10:33:03 PAGE 6
303 1 MT8880_D1=0;
304 1 MT8880_D2=0;
305 1 MT8880_D3=0;
306 1 MT8880_CP2=1;
307 1 MT8880_CP2=0;
308 1 MT8880_CS=1;
309 1
310 1 MT8880_RS0=1; //xie2
311 1 MT8880_RW=0;
312 1 MT8880_CS=0;
313 1 MT8880_D0=0;
314 1 MT8880_D1=0;
315 1 MT8880_D2=0;
316 1 MT8880_D3=0;
317 1 MT8880_CP2=1;
318 1 MT8880_CP2=0;
319 1 MT8880_CS=1;
320 1
321 1 MT8880_RS0=1; //xie3
322 1 MT8880_RW=0;
323 1 MT8880_CS=0;
324 1 MT8880_D0=0;
325 1 MT8880_D1=0;
326 1 MT8880_D2=0;
327 1 MT8880_D3=1;
328 1 MT8880_CP2=1;
329 1 MT8880_CP2=0;
330 1 MT8880_CS=1;
331 1
332 1
333 1 MT8880_RS0=1; //xie4
334 1 MT8880_RW=0;
335 1 MT8880_CS=0;
336 1 MT8880_D0=0;
337 1 MT8880_D1=0;
338 1 MT8880_D2=0;
339 1 MT8880_D3=0;
340 1 MT8880_CP2=1;
341 1 MT8880_CP2=0;
342 1 MT8880_CS=1;
343 1
344 1 MT8880_RS0=1; //du 2
345 1 MT8880_RW=1;
346 1 MT8880_CS=0;
347 1 MT8880_D0=1;
348 1 MT8880_D1=1;
349 1 MT8880_D2=1;
350 1 MT8880_D3=1;
351 1 MT8880_CP2=1;
352 1 MT8880_CP2=0;
353 1 MT8880_CS=1;
354 1
355 1 MT8880_D0=1; //总线复位
356 1 MT8880_D1=1;
357 1 MT8880_D2=1;
358 1 MT8880_D3=1;
359 1
360 1 }
361
362
363 void MT8880_ControlRegister_Write()
364 {
C51 COMPILER V6.10 386 03/14/2006 10:33:03 PAGE 7
365 1 MT8880_CS=1;
366 1
367 1 MT8880_RW=0; //写控制寄存器
368 1 MT8880_RS0=1;
369 1 MT8880_D0=1; //使能tone输出
370 1 MT8880_D1=0; //选用双音多频方式,不用CP方式
371 1 MT8880_D2=0; //此脚在实际电路中未接,不管
372 1 MT8880_D3=1; //本次操作CRA,下一个写操作选择CRB
373 1 MT8880_CS=0;
374 1 MT8880_CP2=1;//给时钟信号,写D0-D3口值到控制寄存器
375 1 MT8880_CP2=0;
376 1 MT8880_CS=1;
377 1
378 1 MT8880_RW=0; //写控制寄存器
379 1 MT8880_RS0=1;
380 1 MT8880_D0=0;
381 1 MT8880_D1=0;
382 1 MT8880_D2=0;
383 1 MT8880_D3=0;
384 1 MT8880_CS=0;
385 1 MT8880_CP2=1; //给时钟信号,写D0-D3口值到控制寄存器
386 1 MT8880_CP2=0;
387 1 MT8880_CS=1;
388 1
389 1 MT8880_D0=1; //总线复位
390 1 MT8880_D1=1;
391 1 MT8880_D2=1;
392 1 MT8880_D3=1;
393 1 }
394
395 void MT8880_WriteOne(unsigned char SendData) //使用入口参数,即要发送的数
396 {
397 1 MT8880_CS=1;
398 1 MT8880_CP2=0;
399 1 MT8880_RW=0; //写传输数据寄存器
400 1 MT8880_RS0=0;
401 1
402 1 switch(SendData)
403 1 {
404 2 case 10: MT8880_D0=0; MT8880_D1=1; MT8880_D2=0; MT8880_D3=1;break;
405 2 case 1: MT8880_D0=1; MT8880_D1=0; MT8880_D2=0; MT8880_D3=0;break;
406 2 case 2: MT8880_D0=0; MT8880_D1=1; MT8880_D2=0; MT8880_D3=0;break;
407 2 case 3: MT8880_D0=1; MT8880_D1=1; MT8880_D2=0; MT8880_D3=0;break;
408 2 case 4: MT8880_D0=0; MT8880_D1=0; MT8880_D2=1; MT8880_D3=0;break;
409 2 case 5: MT8880_D0=1; MT8880_D1=0; MT8880_D2=1; MT8880_D3=0;break;
410 2 case 6: MT8880_D0=0; MT8880_D1=1; MT8880_D2=1; MT8880_D3=0;break;
411 2 case 7: MT8880_D0=1; MT8880_D1=1; MT8880_D2=1; MT8880_D3=0;break;
412 2 case 8: MT8880_D0=0; MT8880_D1=0; MT8880_D2=0; MT8880_D3=1;break;
413 2 case 9: MT8880_D0=1; MT8880_D1=0; MT8880_D2=0; MT8880_D3=1;break;
414 2 case 11: MT8880_D0=1; MT8880_D1=1; MT8880_D2=0; MT8880_D3=1;break; // *
415 2 case 12: MT8880_D0=0; MT8880_D1=0; MT8880_D2=1; MT8880_D3=1;break; // #
416 2 }
417 1 MT8880_CS=0; //给时钟信号,写D0-D3口值到控制寄存器
418 1 MT8880_CP2=1;
419 1
420 1 MT8880_CP2=0;
421 1 MT8880_CS=1;
422 1
423 1 MT8880_D0=1; //写操作完后一定要总线复位
424 1 MT8880_D1=1;
425 1 MT8880_D2=1;
426 1 MT8880_D3=1;
C51 COMPILER V6.10 386 03/14/2006 10:33:03 PAGE 8
427 1
428 1 }
429
430
431 void START24C02(void) /////启动24c02
432 {
433 1 scl=0;sda=1; //用“读”来开始准备启动24C02的工作,把数据线置高,为启动的“下跳”准备
434 1 scl=1;sda=0; //启动
435 1 scl=0; //为“写”周期做准备,即准备控制线上跳。
436 1 }
437
438 void STOP24C02(void) /////停止24C02
439 {
440 1 sda=0;scl=1;
441 1 sda=1;scl=0;
442 1 }
443
444 bit Check24C02() //应答位检查
445 {
446 1 bit Check=0;
447 1 sda=1;scl=1;
448 1 Check=sda; //接收应答信号
449 1 scl=0;
450 1 return(Check);
451 1 }
452
453 void MACK(void) //发送应答
454 {
455 1 sda=0;scl=1;scl=0;sda=1;
456 1 }
457
458 void MNACK(void) //发送非应答
459 {
460 1 sda=1;scl=1;scl=0;sda=0;
461 1 }
462
463 void WriteOneByte(unsigned char dd) ///写一个字节,已经完善,不再修改-----------------------------
464 {
465 1 ACC=dd;
466 1 sda=aa7;scl=1;scl=0; // 数据在scl=0时才能改变
467 1 sda=aa6;scl=1;scl=0;
468 1 sda=aa5;scl=1;scl=0;
469 1 sda=aa4;scl=1;scl=0;
470 1 sda=aa3;scl=1;scl=0;
471 1 sda=aa2;scl=1;scl=0;
472 1 sda=aa1;scl=1;scl=0;
473 1 sda=aa0;_nop_();scl=1;scl=0;
474 1 sda=0; //令总线处于备用状态
475 1 }
476
477 unsigned char ReadOneByte(void) /////读一个字节-------------------------------
478 {
479 1 sda=1;
480 1 scl=1;aa7=sda;scl=0;sda=1;
481 1 scl=1;aa6=sda;scl=0;sda=1;
482 1 scl=1;aa5=sda;scl=0;sda=1;
483 1 scl=1;aa4=sda;scl=0;sda=1;
484 1 scl=1;aa3=sda;scl=0;sda=1;
485 1 scl=1;aa2=sda;scl=0;sda=1;
486 1 scl=1;aa1=sda;scl=0;sda=1;
487 1 scl=1;aa0=sda;scl=0;
488 1 return(ACC);
C51 COMPILER V6.10 386 03/14/2006 10:33:03 PAGE 9
489 1 }
490 //---------------------------------------写整个数组到24c02----------------------------------//
491
492 void Write24C02_Array(Number NUMBERW)
493 /////入口参数为待传送数组
494 {
495 1 unsigned char NUMSERIAL;
496 1 unsigned char NUMBYT=NUMBERW[1]+1; //取组成员个数
497 1 unsigned char i;
498 1 bit Check_bit;
499 1 NUMSERIAL=NUMBERW[0]; //取组的序号
500 1
501 1 switch(NUMSERIAL) //设定数组存放起始位置
502 1 {
503 2 case 1: NUMSERIAL=102; break; //数组1的起始位置=0 长24位
504 2 case 2: NUMSERIAL=124;break; //数组2的起始位置=21 长13位
505 2 case 3: NUMSERIAL=144;break; //数组3的起始位置=34 长13位
506 2 case 4: NUMSERIAL=164;break; //数组4的起始位置=47 长13位
507 2 case 5: NUMSERIAL=184;break; //数组5的起始位置=60 长13位
508 2 case 6: NUMSERIAL=204;break; //数组6的起始位置=73 长13位
509 2 case 7: NUMSERIAL=224;break; //数组7的起始位置=86 长5 位
510 2 case 8: NUMSERIAL=230;break; //数组8的起始位置=90 长2位
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -