📄 at45main.lst
字号:
277 1 // P1.0 - Skipped, Open-Drain, Analog
278 1 // P1.1 - Skipped, Open-Drain, Analog
279 1 // P1.2 - Skipped, Open-Drain, Analog
280 1 // P1.3 - Skipped, Open-Drain, Analog
281 1 // P1.4 - Skipped, Open-Drain, Analog
282 1 // P1.5 - Skipped, Open-Drain, Analog
283 1 // P1.6 - Skipped, Open-Drain, Analog
284 1 // P1.7 - Skipped, Open-Drain, Analog
285 1
286 1 // P2.0 - TX1 (UART1), Open-Drain, Digital
287 1 // P2.1 - RX1 (UART1), Open-Drain, Digital
288 1 // P2.2 - INT0 (Tmr0), Open-Drain, Digital
289 1 // P2.3 - INT1 (Tmr1), Open-Drain, Digital
290 1 // P2.4 - Unassigned, Open-Drain, Digital
291 1 // P2.5 - Unassigned, Open-Drain, Digital
292 1 // P2.6 - Unassigned, Open-Drain, Digital
293 1 // P2.7 - Unassigned, Open-Drain, Digital
294 1
295 1 // P3.0 - Unassigned, Open-Drain, Digital
296 1 // P3.1 - Unassigned, Push-Pull, Digital
297 1 // P3.2 - Unassigned, Open-Drain, Digital
298 1 // P3.3 - Unassigned, Open-Drain, Digital
299 1 // P3.4 - Unassigned, Open-Drain, Digital
300 1 // P3.5 - Unassigned, Open-Drain, Digital
301 1 // P3.6 - Unassigned, Open-Drain, Digital
302 1 // P3.7 - Unassigned, Open-Drain, Digital
303 1
C51 COMPILER V8.02 AT45MAIN 08/18/2007 20:06:55 PAGE 6
304 1 P1MDIN = 0x00;
305 1 P0MDOUT = 0x14;
306 1 P3MDOUT = 0x02;
307 1 P74OUT = 0xFF;
308 1
309 1 XBR0 = 0x07;
310 1 XBR1 = 0x14;
311 1 XBR2 = 0x44;
312 1
313 1 }
314
315
316 void Oscillator_Init()
317 {
318 1 int i = 0;
319 1 OSCXCN = 0x67;
320 1 for (i = 0; i < 3000; i++); // Wait 1ms for initialization
321 1 while ((OSCXCN & 0x80) == 0);
322 1 OSCICN = 0x08;
323 1 }
324
325 void Interrupts_Init()
326 {
327 1 //..................................
328 1 // 初始化中断
329 1 // EA IEGF0 ET2 ES0 ET1 EX1 ET0 EX0
330 1 //..................................
331 1 IE = 0;
332 1
333 1 ET0 = 1; // 打开定时器0中断
334 1
335 1
336 1 ES0 = 1; // 使能串口中断
337 1
338 1
339 1 }
340
341 //-------------------------------
342 // 功能: 初始化单片机内部资源
343 // 输入参数:无
344 // 输出参数:无
345 //-------------------------------
346 void Init_Device(void)
347 {
348 1 Timer_Init();
349 1
350 1 EMI_Init();
351 1
352 1 Port_IO_Init();
353 1
354 1 Oscillator_Init();
355 1
356 1 UART0_Init();
357 1 InitSMBus();
358 1 SPI_Init();
359 1
360 1 Interrupts_Init();
361 1 }
362
363 //------------------------------------------------
364 // 函数名称:InitVariable()
365 // 函数功能:初始化系统全局变量
C51 COMPILER V8.02 AT45MAIN 08/18/2007 20:06:55 PAGE 7
366 //------------------------------------------------
367 void InitVariable()
368 {
369 1 g_cMainSignal = 0;
370 1
371 1 g_sTime.base = 0;
372 1 g_sTime.second= 0;
373 1 g_sTime.minute= 0;
374 1
375 1 g_cRecvPointer =0;
376 1 g_cRecvLength =0;
377 1
378 1
379 1 }
380
381 //-------------------------------------------------------------
382 // 函数名称:定时器0中断入口函数,完成计时功能,定时时间为25ms
383 // 输入参数: 无
384 // 输出参数: 无
385 //-------------------------------------------------------------
386
387 void timer0() interrupt 1
388 {
389 1 TH0=TMR0H;
390 1 TL0=TMR0L;
391 1
392 1 // 程序时基信号
393 1 if(++g_sTime.base>=TICKS_PER_SEC)
394 1 {// 1s到
395 2 g_sTime.base = 0;
396 2
397 2 g_cMainSignal|=SECD_SIGNAL; // 产生秒信号
398 2
399 2 if(++g_sTime.second>59)
400 2 {// 1分钟到
401 3 g_sTime.second = 0;
402 3
403 3 g_cMainSignal|=MINU_SIGNAL; // 产生分信号
404 3
405 3 if(++g_sTime.minute>59) g_sTime.minute=0;
406 3 }
407 2 }
408 1
409 1
410 1
411 1 }
412
413 //..................................................
414 // 串口0中断服务程序
415 //
416 //.................................................
417 void Uart0() interrupt 4
418 {
419 1 BYTE cRecvData;
420 1
421 1 if(RI0) // 如果收到数据
422 1 {
423 2 RI0=0; // 清除收到数据标志
424 2
425 2 cRecvData = SBUF0; // 读取数据
426 2 SBUF0 = cRecvData; // 回显
427 2
C51 COMPILER V8.02 AT45MAIN 08/18/2007 20:06:55 PAGE 8
428 2 if(cRecvData=='\r')
429 2 {// 回车符作为结束标志
430 3 g_cRecvBuffer[g_cRecvPointer]=0; // 接收结束
431 3 g_cRecvPointer = 0;
432 3
433 3 g_cMainSignal|=UART0RECV_SIGNAL; // 接收完成信号
434 3
435 3 }
436 2 else if(cRecvData==0x08)
437 2 {// CTRL+H控制键,退格
438 3 if(g_cRecvPointer>0) g_cRecvPointer--;
439 3 }
440 2 else
441 2 {
442 3 if(g_cRecvPointer<RECVBUF_LEN)
443 3 {
444 4 /*
445 4 // 检查是否有数据需要转换为小写
446 4 if(isupper(cRecvData))
447 4 {// 大写字符转换为小写
448 4 cRecvData = _tolower(cRecvData);
449 4 }
450 4 */
451 4 g_cRecvBuffer[g_cRecvPointer++]=cRecvData;
452 4
453 4
454 4 }
455 3 else
456 3 {// 数据长度错误
457 4 g_cRecvPointer = 0;
458 4 }
459 3 }
460 2
461 2
462 2 }
463 1
464 1 if(TI0) // 如果数据发送结束
465 1 {
466 2 TI0=0;
467 2 }
468 1
469 1 }
470
471
472 //------------------------------------------------------------------
473 // 主函数开始
474 //-------------------------------------------------------------------
475 void main()
476 {
477 1 BYTE nDeviceID;
478 1
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
487 1 EA = 1; // 打开中断控制位
488 1
489 1 TR0 = 1; // 启动定时器0
C51 COMPILER V8.02 AT45MAIN 08/18/2007 20:06:55 PAGE 9
490 1
491 1 SendString("C8051F02x core Module EC1,v1.0\r\n");
492 1 SendString("Serial Flash Test\r\n");
493 1
494 1 //////////////////////////////////////////////////
495 1 // 检查Flash
496 1 /////////////////////////////////////////////////
497 1 SendString("Flash ID:");
498 1 SendString(GetFlashType());
499 1 SendString("\r\n");
500 1 ////////////////////////////////////////////////
501 1
502 1
503 1 while(1)
504 1 {
505 2
506 2 if(g_cMainSignal&SECD_SIGNAL)
507 2 {// 秒信号
508 3 g_cMainSignal&=~SECD_SIGNAL;
509 3
510 3 P_LED2 = !P_LED2;
511 3 }
512 2
513 2 if(g_cMainSignal&MINU_SIGNAL)
514 2 {// 分信号
515 3 g_cMainSignal&=~MINU_SIGNAL;
516 3
517 3 }
518 2
519 2 if(g_cMainSignal&UART0RECV_SIGNAL)
520 2 {// UART0接收完成信号
521 3 g_cMainSignal&=~UART0RECV_SIGNAL;
522 3
523 3 // 确保接收缓冲区内的字符串有结尾
524 3 g_cRecvBuffer[RECVBUF_LEN-1] = 0;
525 3 // 分析接收的命令
526 3 CommandProc(g_cRecvBuffer);
527 3
528 3 }
529 2
530 2 }
531 1
532 1 }
*** WARNING C280 IN LINE 477 OF AT45MAIN.C: 'nDeviceID': unreferenced local variable
533
534 //------------------------------------------------------------------
535 // 功能:分析接收的串口命令
536 // 输入参数:pRecvString,char *:输入字符串
537 // 输出参数:无
538 //..................................................................
539
540 void CommandProc(char *pRecvString)
541 {
542 1 BYTE cRet=0;
543 1 int iPos,iPage,i;
544 1
545 1 // 使用strncmps进行不区分大小写的比较
546 1 if(strncmps("setled=",pRecvString,7)==0)
547 1 {// 设置LED状态命令
548 2
549 2 pRecvString+=7;
550 2
C51 COMPILER V8.02 AT45MAIN 08/18/2007 20:06:55 PAGE 10
551 2 iPos=strpos(pRecvString,',');
552 2
553 2 if(iPos==-1)
554 2 {// 无效命令
555 3 cRet = 0;
556 3 }
557 2 else
558 2 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -