📄 18bb20.lst
字号:
561 1 set_E2();
562 1 wait_ready();
563 1 set_A0(); //数据
564 1 clr_WR();//写触发
565 1 NOP();NOP();
566 1 lcd_data = c;
567 1 NOP();NOP();
568 1 clr_E2();
569 1 }
570
571 ////////////////////////////////////////////////////////////////////////////////
572 //等待ready:等待LCD内部操作完成
573 ////////////////////////////////////////////////////////////////////////////////
574 void wait_ready(void)
575 {
576 1 // DDRA = 0x00; //PA口输入
577 1 lcd_data = 0xff;
578 1 clr_A0(); //指令
579 1 set_WR(); //读
580 1 NOP(); NOP();
581 1 while(lcd_data & status_busy); //读入LCD状态,1=忙,一直等待LCD内部操作完成
582 1 // DDRA = 0xff; //重新置PA口输出
583 1 }
584
585 ////////////////////////////////////////////////////////////////////////////////
586 //调用方式:void lcd_init(void)
587 //函数说明:122x32LCD初始化,开机后仅调用一次
588 ////////////////////////////////////////////////////////////////////////////////
589 void lcd_init(void)
590 {
591 1 send_mi(reset); //复位m-left,s-right
592 1 send_si(reset);
593 1
594 1 send_mi(disp_off); //关闭显示
595 1 send_si(disp_off);
596 1
597 1 send_mi(dynamic_driver); //动态驱动
598 1 send_si(dynamic_driver);
599 1
600 1 send_mi(clk32); //1/32占空比
601 1 send_si(clk32);
602 1
603 1 send_mi(adc_select); //clockwise
604 1 send_si(adc_select);
605 1
606 1 //send_mi(mode_write); //写模式
607 1 //send_si(mode_write);
608 1
609 1 send_mi(col_addr_set);
610 1 send_mi(disp_start_line); //归回零列,设定显示起始行首
611 1 send_si(col_addr_set);
612 1 send_si(disp_start_line);
C51 COMPILER V6.12 18BB20 04/20/2008 13:57:54 PAGE 11
613 1
614 1 send_mi(disp_on); //开显示
615 1 send_si(disp_on);
616 1 }
617
618 ////////////////////////////////////////////////////////////////////////////////
619 //调用方式:void lcd_clr(void)
620 //函数说明:清屏
621 ////////////////////////////////////////////////////////////////////////////////
622 void lcd_clr(void)
623 {
624 1 uchar i, page;
625 1 for (page=0;page<4;page++)
626 1 {
627 2 send_mi(page_addr_set+page);
628 2 send_si(page_addr_set+page);
629 2
630 2 for (i=0;i<122;i++) //若为62则中间可能有条竖线
631 2 { send_mi(i); //主窗口设置为0列
632 3 send_si(i); //从窗口设置为0列
633 3 send_md(0);
634 3 send_sd(0);
635 3 }
636 2 }
637 1 }
638
639 ////////////////////////////////////////////////////////////////////////////////
640 //调用方式:void set_page(uchar page)
641 //函数说明:同时设置主(右)从(左)显示页为0-3页
642 ////////////////////////////////////////////////////////////////////////////////
643 void set_page(uchar page)
644 {
645 1 send_mi(page_addr_set|page);
646 1 send_si(page_addr_set|page);
647 1 }
648
649 ////////////////////////////////////////////////////////////////////////////////
650 //调用方式:void SetAddress(uchar address)
651 //函数说明:同时设置主(右)从(左)列地址为0-61列
652 ////////////////////////////////////////////////////////////////////////////////
653 void set_address(uchar address)
654 {
655 1 send_mi(address&0x7F); //&0x7F,考虑到防止越限
656 1 send_si(address&0x7F);
657 1 }
658
659 ////////////////////////////////////////////////////////////////////////////////
660 //调用方式:void putchar_l(uchar c)
661 //函数说明:在右页(从窗口)当前地址画一个字节(8点)
662 ////////////////////////////////////////////////////////////////////////////////
663 void putchar_l(uchar c)
664 {
665 1 send_md(c);
666 1 }
667
668 ////////////////////////////////////////////////////////////////////////////////
669 //调用方式:void putchar_r(uchar c)
670 //函数说明:在左页(主窗口)当前地址画一个字节(8点)
671 ////////////////////////////////////////////////////////////////////////////////
672 void putchar_r(uchar c)
673 {
674 1 send_sd(c);
C51 COMPILER V6.12 18BB20 04/20/2008 13:57:54 PAGE 12
675 1 }
676
677 ////////////////////////////////////////////////////////////////////////////////
678 //调用方式:void draw_bmp(uchar col,uchar layer,uchar width,uchar *bmp)
679 //函数说明:画一个图,横坐标是col,layer表示上下层,width是图形的宽,高固定16
680 // bmp是图形指针
681 // 使用zimo21软件,采用纵向取模下高位得到bmp数据。
682 // col 图型的起始位置0~121
683 // layer 图形的位置(Y坐标)0-下半部分 非0-上半部分
684 // width 图形宽度8,16可选
685 // bmp 图形数据指针
686 ////////////////////////////////////////////////////////////////////////////////
687 void draw_bmp(uchar col,uchar layer,uchar width,uchar *bmp)
688 {
689 1 uchar x;
690 1 uchar address; //address表示显存的物理地址
691 1 uchar p=0;
692 1 uchar page=0;
693 1 uchar window=0; //page表示上下两页,window表示左右窗口(0左,1右)
694 1 if (layer) page=2; //左-主窗口,右-从窗口
695 1
696 1 for (x=col; x<col+width; x++)
697 1 {
698 2 if (x>121)return; //防止显示乱码
699 2 if (x>60) //左右窗口定位
700 2 {
701 3 window=1; //右-从窗口
702 3 address=x%61;
703 3 }
704 2 else
705 2 address=x; //主窗口输出
706 2
707 2 set_page(page); //上层数据输出
708 2 set_address(address);
709 2
710 2 if (window)
711 2 putchar_r(bmp[p]);
712 2 else
713 2 putchar_l(bmp[p]);
714 2
715 2 set_page(page+1); //下层数据输出
716 2 set_address(address); //列保持不变
717 2
718 2 if (window)
719 2 putchar_r(bmp[p+width]);
720 2 else
721 2 putchar_l(bmp[p+width]);
722 2
723 2 p++;
724 2 }
725 1 }
726
727 ////////////////////////////////////////////////////////////////////////////////
728 //函数:void disp_one_ascii(uchar col,uchar layer,uchar ascii_code)
729 //说明:显示单个ASCII码col-列;layer-上下行:1-上,0-下;ascii_code:所要显示德ASCCII码
730 ////////////////////////////////////////////////////////////////////////////////
731 void disp_one_ascii(uchar col,uchar layer,uchar ascii_code,uchar mode)
732 {
733 1 uchar i;
734 1 for(i=0;i<16;i++) //ASCII码显示占用16个字节
735 1 {
736 2 if(mode)dot_buffer[i]=~ascii[(ascii_code-0x20)*16 + i];
C51 COMPILER V6.12 18BB20 04/20/2008 13:57:54 PAGE 13
737 2 else dot_buffer[i]= ascii[(ascii_code-0x20)*16 + i];
738 2 }
739 1 draw_bmp(col,layer,8,dot_buffer);
740 1 }
741
742 ////////////////////////////////////////////////////////////////////////////////
743 //函数:void disp_ram_data(uchar col,uchar layer,uchar n,uchar mode)
744 //说明:显示小于4个的十进制数字//修改缓冲区的大小可以扩展显示
745 ////////////////////////////////////////////////////////////////////////////////
746 void disp_ram_data(uchar col,uchar layer,uchar n,uchar mode)
747 { uchar i;
748 1 for (i=0;i<n;i++)
749 1 {
750 2 if(mode)disp_one_ascii(col,layer,disp_buffer[i]+0x30,1);
751 2 else disp_one_ascii(col,layer,disp_buffer[i]+0x30,0);
752 2 col += 8;
753 2 }
754 1 }
755
756 ////////////////////////////////////////////////////////////////////////////////
757 //函数:void dprintf(uchar col,uchar layer,uchar *ptr,uchar mode)
758 //说明:ASCII(8*16) 和 汉字(16*16)显示函数
759 ////////////////////////////////////////////////////////////////////////////////
760 void dprintf(uchar col,uchar layer,uchar *ptr,uchar mode)
761 {
762 1 uchar c1,c2;
763 1 uchar i,j,k;
764 1 uchar ulen;
765 1 //uchar ucol,ulayer,umode;
766 1 uchar ucol,ulayer;
767 1 ulen = 0;
768 1 ucol = col;
769 1 ulayer = layer;
770 1
771 1 while (ptr[ulen]!= 0)ulen++; //探测字串长度
772 1 i=0;
773 1 while(i<ulen)
774 1 {
775 2 c1 = ptr[i];
776 2 c2 = ptr[i+1];
777 2 //ASCII字符与汉字内码的区别在于128做分界;大于128的为汉字码
778 2 if(c1 <=128) //ASCII
779 2 {
780 3 if(mode)disp_one_ascii(ucol,ulayer,c1,1);
781 3 else disp_one_ascii(ucol,ulayer,c1,0);
782 3 ucol+=8;
783 3 i++; //ASCII码的处理
784 3 }
785 2 else //中文
786 2 {
787 3 for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)
788 3 { //查找定位当前汉字的点阵区
789 4 //这里还不是很理解,还请哪位朋友指教QQ179359254只能理解是根据index索引去查找汉字表格
790 4 if((c1 == GB_16[j].Index[0]) && (c2 == GB_16[j].Index[1]))
791 4
792 4
793 4 break;
794 4 }
795 3 for(k=0;k<32;k++)
796 3 { if(mode)dot_buffer[k]=~GB_16[j].Msk[k];
797 4 else dot_buffer[k]= GB_16[j].Msk[k];
798 4 }
C51 COMPILER V6.12 18BB20 04/20/2008 13:57:54 PAGE 14
799 3 draw_bmp(ucol,ulayer,16,dot_buffer);
800 3 ucol+=16;
801 3 i+=2; //中文的处理
802 3 }
803 2 }
804 1 }
805
806 ////////////////////////////////////////////////////////////////////////////////
807 ////////////////////////////////////////////////////////////////////////////////
808 void main(void)
809 {
810 1 char i;
811 1 uint j;
812 1 for(i=0;i<10;i++);
813 1 for(j=1;j<10;j++); //开机延时
814 1 lcd_init();//液晶初始化
815 1 lcd_clr();//清屏
816 1 while(1)
817 1 { draw_bmp(0,1,122,top);//显示上半部分图形
818 2 draw_bmp(0,0,122,bot);//显示下半部分图形
819 2 //只是12232上半部分和下半部分分开太远了,用来显示图片不是很好看
820 2 delay_ms(2000);delay_ms(2000);lcd_clr(); //延时后清屏好显示下面的温度
821 2
822 2 dprintf(0,1,"现在温度",0);
823 2 get_temperature();//转换并读取保存
824 2 disp_ram_data(16,0,5,0);//显示温度
825 2 dprintf(57,0,"度",0);//温度标号懒得做了^_^
826 2 delay_ms(2000);delay_ms(2000);lcd_clr();
827 2 }
828 1 }
829
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1355 ----
CONSTANT SIZE = 2204 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 40 40
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -