⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 18bb20.lst

📁 刚通过的1820温度显示程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 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 + -