📄 xram.lst
字号:
310 1 // P3.2 - Unassigned, Open-Drain, Digital
311 1 // P3.3 - Unassigned, Open-Drain, Digital
312 1 // P3.4 - Unassigned, Open-Drain, Digital
313 1 // P3.5 - Unassigned, Open-Drain, Digital
314 1 // P3.6 - Unassigned, Open-Drain, Digital
315 1 // P3.7 - Unassigned, Open-Drain, Digital
316 1
317 1 P1MDIN = 0x00;
318 1 P3MDOUT = 0x02;
319 1 XBR0 = 0x07;
320 1 XBR1 = 0x14;
321 1 XBR2 = 0x44;
322 1
323 1
324 1 }
325
326 void Oscillator_Init()
327 {
328 1 int i = 0;
329 1 OSCXCN = 0x67;
330 1 for (i = 0; i < 3000; i++); // Wait 1ms for initialization
331 1 while ((OSCXCN & 0x80) == 0);
332 1 OSCICN = 0x08;
333 1 }
334
335 void Interrupts_Init()
336 {
337 1 //..................................
338 1 // 初始化中断
339 1 // EA IEGF0 ET2 ES0 ET1 EX1 ET0 EX0
340 1 //..................................
341 1 IE = 0;
342 1
343 1 ET0 = 1; // 打开定时器0中断
344 1
345 1
346 1 ES0 = 1; // 使能串口中断
347 1
348 1
349 1 }
350
351 //-------------------------------
352 // 功能: 初始化单片机内部资源
353 // 输入参数:无
354 // 输出参数:无
355 //-------------------------------
356 void Init_Device(void)
357 {
358 1 EMI_Init();
359 1 Timer_Init();
360 1
361 1 Port_IO_Init();
362 1
363 1 Oscillator_Init();
364 1
C51 COMPILER V3.96, SN-83203013 XRAM 09/15/07 22:18:10 PAGE 7
365 1 UART0_Init();
366 1
367 1 Interrupts_Init();
368 1 }
369
370 //------------------------------------------------
371 // 函数名称:InitVariable()
372 // 函数功能:初始化系统全局变量
373 //------------------------------------------------
374 void InitVariable()
375 {
376 1 g_cMainSignal = 0;
377 1
378 1 g_sTime.base = 0;
379 1 g_sTime.second= 0;
380 1 g_sTime.minute= 0;
381 1
382 1 g_cRecvPointer =0;
383 1 g_cRecvLength =0;
384 1
385 1
386 1 }
387
388 //-------------------------------------------------------------
389 // 函数名称:定时器0中断入口函数,完成计时功能,定时时间为25ms
390 // 输入参数: 无
391 // 输出参数: 无
392 //-------------------------------------------------------------
393
394 void timer0() interrupt 1
395 {
396 1 TH0=TMR0H;
397 1 TL0=TMR0L;
398 1
399 1 // 程序时基信号
400 1 if(++g_sTime.base>=TICKS_PER_SEC)
401 1 {// 1s到
402 2 g_sTime.base = 0;
403 2
404 2 g_cMainSignal|=SECD_SIGNAL; // 产生秒信号
405 2
406 2 if(++g_sTime.second>59)
407 2 {// 1分钟到
408 3 g_sTime.second = 0;
409 3
410 3 g_cMainSignal|=MINU_SIGNAL; // 产生分信号
411 3
412 3 if(++g_sTime.minute>59) g_sTime.minute=0;
413 3 }
414 2 }
415 1
416 1
417 1
418 1 }
419
420 //..................................................
421 // 串口0中断服务程序
422 //
423 //.................................................
424 void Uart0() interrupt 4
425 {
426 1 BYTE cRecvData;
C51 COMPILER V3.96, SN-83203013 XRAM 09/15/07 22:18:10 PAGE 8
427 1
428 1 if(RI0) // 如果收到数据
429 1 {
430 2 RI0=0; // 清除收到数据标志
431 2
432 2 cRecvData = SBUF0; // 读取数据
433 2 SBUF0 = cRecvData; // 回显
434 2
435 2 if(cRecvData=='\r')
436 2 {// 回车符作为结束标志
437 3 g_cRecvBuffer[g_cRecvPointer]=0; // 接收结束
438 3 g_cRecvPointer = 0;
439 3
440 3 g_cMainSignal|=UART0RECV_SIGNAL; // 接收完成信号
441 3
442 3 }
443 2 else if(cRecvData==0x08)
444 2 {// CTRL+H控制键,退格
445 3 if(g_cRecvPointer>0) g_cRecvPointer--;
446 3 }
447 2 else
448 2 {
449 3 if(g_cRecvPointer<RECVBUF_LEN)
450 3 {
451 4 if(isupper(cRecvData))
452 4 {// 大写字符转换为小写
453 5 cRecvData = _tolower(cRecvData);
454 5 }
455 4 g_cRecvBuffer[g_cRecvPointer++]=cRecvData;
456 4 }
457 3 else
458 3 {// 数据长度错误
459 4 g_cRecvPointer = 0;
460 4 }
461 3 }
462 2
463 2
464 2 }
465 1
466 1 if(TI0) // 如果数据发送结束
467 1 {
468 2 TI0=0;
469 2 }
470 1
471 1 }
472
473
474 //------------------------------------------------------------------
475 // 主函数开始
476 //-------------------------------------------------------------------
477 void main()
478 {
479 1 Init_Device(); // 初始化系统
480 1 InitVariable(); // 初始化变量
481 1
482 1 EA=0; // 禁止看门狗
483 1 WDTCN = 0xDE; // 实验中不使用看门狗
484 1 WDTCN = 0xAD;
485 1
486 1 EA = 1; // 打开中断
487 1
488 1 TR0 = 1; // 启动定时器0
C51 COMPILER V3.96, SN-83203013 XRAM 09/15/07 22:18:10 PAGE 9
489 1
490 1 SendString("C8051F02x core Module EC1,v1.0\r\n");
491 1 SendString("XRAM with 62WV1024 Test\r\n");
492 1
493 1 while(1)
494 1 {
495 2
496 2 if(g_cMainSignal&SECD_SIGNAL)
497 2 {// 秒信号
498 3 g_cMainSignal&=~SECD_SIGNAL;
499 3
500 3 P_LED2=!P_LED2;
501 3 }
502 2
503 2 if(g_cMainSignal&MINU_SIGNAL)
504 2 {// 分信号
505 3 g_cMainSignal&=~MINU_SIGNAL;
506 3 }
507 2
508 2 if(g_cMainSignal&UART0RECV_SIGNAL)
509 2 {// UART0接收完成信号
510 3 g_cMainSignal&=~UART0RECV_SIGNAL;
511 3
512 3 // 确保接收缓冲区内的字符串有结尾
513 3 g_cRecvBuffer[RECVBUF_LEN-1] = 0;
514 3 // 分析接收的命令
515 3 CommandProc(g_cRecvBuffer);
516 3
517 3 }
518 2
519 2 }
520 1
521 1 }
522
523 //......................................
524 // 功能:分析接收的命令
525 // 输入参数:
526 // pRecvString,char *:输入字符串
527 // 输出参数:无
528 // 命令格式说明:
529 // setled=灯序号,开关状态 \r
530 // 灯序号: 1,LED1;2,LED2
531 // 开关状态:ON,打开灯;OFF,关闭灯
532 // 命令字符不区分大小写
533 //.......................................
534 void CommandProc(char *pRecvString)
535 {
536 1 BYTE cRet=0;
537 1 int iPos,i,readlen;
538 1 BYTE cPage;
539 1 BYTE xdata *pRam;
540 1
541 1 if(strncmps("setled=",pRecvString,7)==0)
542 1 {// 设置LED状态命令
543 2
544 2 pRecvString+=7;
545 2
546 2 iPos=strpos(pRecvString,',');
547 2
548 2 if(iPos==-1)
549 2 {// 无效命令
550 3 cRet = 0;
C51 COMPILER V3.96, SN-83203013 XRAM 09/15/07 22:18:10 PAGE 10
551 3 }
552 2 else
553 2 {
554 3 if(strncmps(pRecvString,"2",1)==0)
555 3 {// 控制LED2
556 4 pRecvString+=2;
557 4
558 4 if(strncmps(pRecvString,"on",2)==0)
559 4 {// 打开LED
560 5 P_LED2 = 1;
561 5
562 5 cRet = 1;
563 5 }
564 4 else if(strncmps(pRecvString,"off",3)==0)
565 4 {// 关闭LED
566 5 P_LED2 = 0;
567 5
568 5 cRet = 1;
569 5 }
570 4 else
571 4 {
572 5 cRet = 0;
573 5 }
574 4 }
575 3 }
576 2
577 2 }
578 1 else if(strncmps(pRecvString,"testsram",8)==0)
579 1 {
580 2 // 测试62LV256
581 2 if(1==TestSRAM())
582 2 {
583 3 SendString("62LV256 Test OK!\r\n");
584 3
585 3 cRet = 1;
586 3 }
587 2 else cRet = 0;
588 2 }
589 1 else if(strncmps(pRecvString,"testtram",8)==0)
590 1 {// 测试62LV2567,测试的过程中TRAM中的数据会被修改
591 2 if(1==TestTRAM())
592 2 {
593 3 SendString("62LV1024 Tesk OK!\r\n");
594 3
595 3 cRet = 1;
596 3 }
597 2 else cRet = 0;
598 2
599 2 }
600 1 else if(strncmps(pRecvString,"writetram=",10)==0)
601 1 {// 向指定的TRAM存储区域写数据
602 2 pRecvString+=10;
603 2
604 2 iPos=strpos(pRecvString,',');
605 2
606 2 if(iPos==-1) cRet=0;
607 2 else
608 2 {// 查找扇区
609 3 pRecvString[iPos]=0;
610 3 cPage = atoi(pRecvString);
611 3
612 3 if(cPage>=RAM_PAGE)
C51 COMPILER V3.96, SN-83203013 XRAM 09/15/07 22:18:10 PAGE 11
613 3 {
614 4 cRet = 0;
615 4 }
616 3 else
617 3 {
618 4 if(pRecvString[iPos+1]!=0)
619 4 {
620 5 pRecvString+=iPos+1;
621 5
622 5 pRam = 0xC000; // TRAM页内地址
623 5
624 5 P4&=0xF0;
625 5 P4|=cPage; // 设置页
626 5
627 5 while((*pRecvString)!=0)
628 5 {// 写入TRAM中
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -