📄 lcdc_040.lst
字号:
446 1 SFRPAGE=temppage;
447 1 }
448
449
450
451 void spi_init()
452 {
453 1 SFRPAGE = SPI0_PAGE;
454 1 SPI0CFG = 0x40;
455 1 SPI0CN = 0x01;
456 1 SPI0CKR = 0x6D;
457 1
458 1
459 1 }
460
461
462
463 void delay1us(void)
464 {
465 1 uchar xdata i;
466 1 for(i=10;i>0;i--);
467 1 }
468
469 void writelcd(uchar spi_data) //向LV595写数据以SPI方式
470 {
471 1 uint xdata i,j,k;
472 1 for(i=0;i<9;i++);
473 1 LcdCs=0;
474 1 delay1us();
475 1 SPI_BUSY=1;
476 1 SFRPAGE = SPI0_PAGE;
477 1 SPI0DAT=spi_data;
478 1 for(j=0;j<500;j++)
479 1 {
480 2 if(!SPI_BUSY)break;
481 2 }
482 1 delay1us();
483 1
484 1 LcdCs=1;
485 1 delay1us();
486 1 delay1us();
487 1 delay1us();
488 1 delay1us();
489 1 delay1us();
C51 COMPILER V7.08 LCDC_040 04/24/2008 15:54:41 PAGE 9
490 1 delay1us();
491 1 for(k=0;k<5000;k++);
492 1
493 1 /* **************************************************************************
494 1 // 以下这段代码,是用IO口模拟SPI传输的程序
495 1 LcdCs=0;
496 1 for(i=0;i<8;i++)
497 1 { SPICLK=0;
498 1 if(spi_data&0x80)
499 1 spi_mosi=1;
500 1 else
501 1 spi_mosi=0;
502 1 spi_data<<=1;
503 1 SPICLK=1;
504 1 for(j=0;j<10;j++)
505 1 {_nop_();}
506 1 SPICLK=0;
507 1 }
508 1 LcdCs=1;
509 1 /***************************************************************************/
510 1 }
511 void writecode(uchar ins) //向液晶控制模块写命令
512 {
513 1 uchar xdata t;
514 1 uint xdata j;
515 1
516 1 for(j=0;j<500;j++);
517 1 virt_port|=ins&0xf0; //取高字节向1602写数据
518 1 writelcd(virt_port); //先写高4位后再写低4位 这是在选择四个数据线的时候
519 1
520 1 virt_port|=0x08;
521 1 writelcd(virt_port); //使能E脚为高电平
522 1 virt_port&=~0x08;
523 1 writelcd(virt_port); //使能E脚为低电平
524 1
525 1 t=ins<<4;
526 1 virt_port|=t&0xf0; //取低字节向1602写数据
527 1 writelcd(virt_port);
528 1 virt_port|=0x08; //使能E脚为高电平
529 1 writelcd(virt_port);
530 1 virt_port&=~0x08; //使能E脚为低电平
531 1 writelcd(virt_port);
532 1 virt_port=0;
533 1 writelcd(virt_port);
534 1 }
535
536 void writedata(uchar d) //写数据到1602
537 {
538 1 uchar xdata i,t;
539 1 uint xdata j;
540 1
541 1 for(j=0;j<500;j++);
542 1 virt_port|=0x02; //光标返回指令
543 1 writelcd(virt_port);
544 1 virt_port|=d&0xf0; //取高字节数据给数据寄存器
545 1 writelcd(virt_port);
546 1 virt_port|=0x08; //使能E脚为高电平
547 1 writelcd(virt_port);
548 1 virt_port&=0xf7; //使能E脚为低电平
549 1 writelcd(virt_port);
550 1 virt_port&=0x07; //设置光标右移,文字也右移
551 1 writelcd(virt_port);
C51 COMPILER V7.08 LCDC_040 04/24/2008 15:54:41 PAGE 10
552 1
553 1 t=d&0x0f;
554 1 virt_port|=t<<4; //取低字节数据给数据寄存器
555 1 writelcd(virt_port);
556 1
557 1 virt_port|=0x08; //使能E脚为高电平
558 1 writelcd(virt_port);
559 1 for(i=3;i>0;i--);
560 1 virt_port&=0xf7; //使能E脚为低电平
561 1 writelcd(virt_port);
562 1 virt_port=0; //数据清零
563 1 writelcd(virt_port);
564 1 }
565
566 void lcdchar (void)
567 {
568 1 uint xdata i,j,k;
569 1 for(j=0;j<5000;j++); //数据读、写操作,画面不动
570 1 for(k=0;k<5000;k++);
571 1
572 1 for(i=0;i<8;i++)
573 1 {
574 2 writedata(rdata[i]);
575 2 for(j=0;j<1000;j++);
576 2 for(k=0;k<1000;k++);
577 2 for(k=0;k<5000;k++);
578 2 for(k=0;k<1000;k++);
579 2 for(k=0;k<5000;k++);
580 2 for(k=0;k<5000;k++);
581 2 for(k=0;k<5000;k++);
582 2
583 2 }
584 1
585 1
586 1
587 1
588 1 }
589
590
591 void lcdinit()
592 {
593 1 uint xdata i;
594 1
595 1 virt_port=0x00;
596 1 writelcd(virt_port); //RS脚为零写指令寄存器 RW为低电平
597 1 virt_port|=0x08; //使能脚E=1
598 1 writelcd(virt_port);
599 1 virt_port&=0xf7; //使E=0使能脚发生跳变高--低
600 1 writelcd(virt_port);
601 1 for(i=1000;i>0;i--); //3次延时,重要!
602 1 for(i=8000;i>0;i--); //用延时代替查询
603 1
604 1
605 1 virt_port=0; //写入20码,设置为4位总线方式,非常重要!!!!!
606 1 writelcd(virt_port);
607 1 virt_port|=0x20; //只写高字节
608 1 writelcd(virt_port);
609 1 virt_port|=0x08; //E=1
610 1 writelcd(virt_port);
611 1 for(i=20;i>0;i--); //使命令执行
612 1 virt_port&=0xf7; //E=0
613 1 writelcd(virt_port);
C51 COMPILER V7.08 LCDC_040 04/24/2008 15:54:41 PAGE 11
614 1 for(i=10;i>0;i--);
615 1 virt_port=0;
616 1 writelcd(virt_port);
617 1
618 1
619 1
620 1 writecode(0x38); //设两行显示,4线方式5*10字符显示
621 1 for(i=50;i>0;i--);
622 1 writecode(0x06); //光标右移
623 1 for(i=50;i>0;i--);
624 1
625 1
626 1 writecode(0x0c); //开显示指令
627 1 for(i=50;i>0;i--);
628 1
629 1
630 1 writecode(0x02); //光标返回指令
631 1 for(i=50;i>0;i--);
632 1
633 1
634 1
635 1 writecode(0x01); //清屏指令
636 1 for(i=50;i>0;i--);
637 1 }
638
639 void spi_srs () interrupt 6
640 {
641 1 if(SPIF)
642 1 {
643 2 SFRPAGE = SPI0_PAGE;
644 2 SPIF=0;
645 2
646 2 SPI_BUSY=0;
647 2 }
648 1
649 1
650 1 if(WCOL)
651 1 {
652 2 SFRPAGE = SPI0_PAGE;
653 2 WCOL=0;
654 2 }
655 1
656 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1701 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 17 22
PDATA SIZE = ---- ----
DATA SIZE = 5 10
IDATA SIZE = ---- ----
BIT SIZE = 3 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -