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

📄 display.c

📁 一个msp430与320*240加4*4键盘的菜单程序... ...!
💻 C
📖 第 1 页 / 共 2 页
字号:
      char_data=*p++;  	            
      WriteData(char_data);          		   	                	          	         
		           
      row+=1;	      	                			 		       
    }
  }
  else
  {	 		 
    for(j=0;j<16;j++)
    {	 	           
      char_addr_point_set(row,col);  //设置Vram地址
      WriteCommand(0x0042);
      
      char_data=*p++;      
      char_data^=0x00ff;
      WriteData(char_data);    	
      
      row+=1; 			 	
    }
  }		   	     
}   
//***************************************************************************/
void showchar16(unsigned int row,unsigned int col,unsigned int chp,unsigned int attribute)
{//   row:显示行  col:显示列   chp:显示第几个字. attribute:反色。1:显示字黑,0显示字白 
  unsigned int  j,char_data;
  const unsigned int *p;
  p=&HZ16_DOT_LIB[0];
  chp=chp*32;
  p=p+chp;             
  col/=8;  		 		         
//-----------------------------------------	 	        
//          显示中文
//-----------------------------------------  
  if(attribute)
  {            
	 	    
    for(j=0;j<16;j++)
    {	 			
      char_addr_point_set(row,col);  //设置Vram地址               
                                     //显示光标右移,设置光标地址
      WriteCommand(0x0042);     // 写显示数据	            
      char_data=*p++;  	             //左8位
      WriteData(char_data);          		   	                	         
      char_data=*p++;  		     //右8位       
      WriteData(char_data);
		           
      row+=1; 	      	                			 		      
    }
  }
  else
  {	 		 
    for(j=0;j<16;j++)
    {	 	           
      char_addr_point_set(row,col);  //设置Vram地址
      WriteCommand(0x0042);
      
      char_data=*p++;      
      char_data^=0x00ff;
      WriteData(char_data);    	   	                 	         
      char_data=*p++;  
      char_data^=0x00ff;	
      WriteData(char_data);  	 		        
		             
      row+=1; 			 	
    }
  }		   	     
}   
//***************************************************************************/
void showchar24(unsigned int row,unsigned int col,unsigned int chp,unsigned int attribute)
{//   row:显示行  col:显示列   chp:显示第几个字. attribute:反色。1:显示字黑,0显示字白                            
  unsigned int  j,char_data;   
  const unsigned char *p;
  p=&Cdot24lib[0];
  chp=chp*72;
  p=p+chp;             
  col/=8;  		 		         
//----------------------------------------- 	 	        
//         显示中文
//-----------------------------------------  
  if(attribute)
  {            
	 	    
    for(j=0;j<24;j++)
    {	 			
	char_addr_point_set(row,col);  //设置Vram地址
	WriteCommand(0x0042);  
	 	            
	char_data=*p++;  	           
	WriteData(char_data);     //左8位     		   	                	         
	char_data=*p++;  		              
	WriteData(char_data);     //中8位           
	char_data=*p++;  		              
	WriteData(char_data);     //右8位
		           
	row+=1;
      	                			 		       
    }
  }
  else
  {	 		 
    for(j=0;j<24;j++)
    {	 	           
	char_addr_point_set(row,col);  //设置Vram地址
	WriteCommand(0x0042);
		           
	char_data=*p++;             
        char_data^=0x00ff;
	WriteData(char_data);    	   	                 	         
	char_data=*p++;  
	char_data^=0x00ff;	
	WriteData(char_data);  	 		        	             
	char_data=*p++;  
	char_data^=0x00ff;	
	WriteData(char_data);  
	    	         
	row+=1;		 	
    }
  }		   	     
} 
//***************************************************************************/
// 画水平线(Y1=Y2) X=8*i
//***************************************************************************/
void lineH(unsigned int y1,unsigned int x1,unsigned int y2,unsigned int x2)
{
   unsigned int i,ipos,length1,length2;
   ipos=y1*40+x1/8+1200; 
   length1=y2*40+x2/8+1200;
   length2=length1-ipos;
   wr_cmd_0(0x4c); 
   wr_cmd_2(0x46,ipos); 
   wr_cmd_0(0x42);
   for(i=0;i<length2;i++)
   {
      WriteData(0xff); 
   }	
} 
//==================================================
//   画点
//==================================================
 void  pixel(unsigned int PointY,unsigned int PointX)                //   PointY 行 PointX 列 
{    
	unsigned int i, StartAddr;    
	unsigned int dat,dat2,dat3;  
     
	StartAddr=PointY*40 + PointX/8 +1200;
     
	dat=(unsigned int)(7-PointX%8);        //产生点的数据  
	dat2=0x0001;  
	for(i=0;i<dat;i++) 
	{
	   dat2<<=1;
	} 
 
	wr_cmd_0(0x004c); 
	wr_cmd_2(0x0046,StartAddr);           //读该点所在单元地址内容
	wr_cmd_0(0x0043);
	dat3=ReadDataLcm();
	dat2|=dat3;	
 	
 	wr_cmd_0(0x004c); 
	wr_cmd_2(0x0046,StartAddr);           //设置该点所在单元地址    
	wr_cmd_1(0x0042,dat2);                // 画点位数据 	
}
//==================================================
//  画点--点
//==================================================
void line(unsigned int y1,unsigned int x1,unsigned int y2,unsigned int x2)
{
    unsigned int x,y;    
    float k,b;    
    if(x1==x2)                                // x1=x2,画垂直线
    {
        if(y1<=y2)
        {
          for(y=y1;y<=y2;y++)
          {
            pixel(y, x1);
          }
        }
        else
        {
          for(y=y2;y<=y1;y++)
          {
            pixel(y, x1);
          }
        }          
    }
    else
    {
	if( fabs(y1-y2) <=  fabs(x1-x2))            // |k|<=1      // y行数 <= x列数
	{        
          k=((float)y2-y1) / ((float)x2-x1) ;        
	  b=y1-k*x1;        
	  if( x1 < x2 )       
          {            
            for(x=x1;x<=x2;x++)            
            {                
              y=(unsigned int)(k*x+b);                
	      pixel(y, x);            
	     }        
	   }        
	   else
           {            
             for(x=x2;x<=x1;x++)            
             {                
               y=(unsigned int)(k*x+b);                
               pixel(y,x);            
             }        
           }    
	}    
	else                                                       // 行数>列数                           
	{        
          k=((float)x2-x1) / ((float)y2-y1) ;        
	  b=x1-k*y1;        
	  if( y1 <= y2 )        
	  {            
            for(y=y1;y<=y2;y++)            
	    {                
              x=(unsigned int)(k*y+b);                
	      pixel(y,x);
            }        
          }        
          else        
          {            
            for(y=y2;y<=y1;y++)            
            {                
              x=(unsigned int)(k*y+b);                
              pixel(y , x);            
            }        
          }    
        }
    }
}
//==================================================
// 画圆
//==================================================
void circle(unsigned char OY,unsigned char OX,unsigned char R)//
{
  unsigned int dx,dy,xx,rr,rs;
  
  dy = R;
  rr = R*R;
  rs = R*71/100;          //0.71R
  
  for(dx=0;dx<=rs;)
  { 
    dx++;
    xx = dx*dx;
    while((rr-xx)<(dy*dy))
      {
        dy--;
      }
    
    pixel(OY-dy,OX+dx);  //第一象限
    pixel(OY-dy,OX-dx);  //第二象限
    pixel(OY+dy,OX-dx);  //第三象限
    pixel(OY+dy,OX+dx);  //第四象限
    
    pixel(OY-dx,OX+dy);  //第一象限
    pixel(OY-dx,OX-dy);  //第二象限
    pixel(OY+dx,OX-dy);  //第三象限
    pixel(OY+dx,OX+dy);  //第四象限
    
  }
}
/***************显示一幅全屏图像******************/ 
void Displayonebmp (Uchar Area,Uchar const *puts) //参数Area为第几图层 
{ 
Uint X; 
Uchar i,j; 
X=0; 
WriteCommand(0x4c ); //设置光标为右移 
WriteCommand( 0x46 ); //设置光标的地址 
switch(Area) 
{ 
case 1:WriteData( BasePart1 );break; //BasePart1
case 2:WriteData( BasePart2 );break; 
case 3:WriteData( BasePart3 );break; 
} 
WriteCommand( 0x42 ); //允许MCU把数据写入到显示缓冲区去 
for(i=0;i<240;i++) 
{ 
for(j=0;j<40;j++) 
{ 
WriteData(puts[X]); 
X++; 
} 
} 
}
void dispbmp(void)
{
    Displayonebmp (1,bmp2);
}
//============================== 西文显示演示程序 ============================== 
// 仅仅用于文本方式下的西文字符串显示,本函数只写入第3显示区 

void TextDisp( Uchar Ox,Uchar Oy, Uchar const *ptr ) { 

Uchar TexLength=0,ii; 
Uint  iTemp; 

    while(ptr[TexLength]>0x1f) {TexLength++;};   // 获取字串长度 

    iTemp = Oy*paraP9+Ox; 
    WriteCommand( 0x5d );        // 光标形状设置,代码0x5d 
    WriteData( 0x07 );                // 设置光标水平点为CSX=8 
    WriteData( 0x07 );                // 光标为块状形式,垂直点为CSY=8 

    WriteCommand( 0x5b );            // 显示合成方式设置.代码0x5b 
    WriteData( 0x01 );                // 设置参数:显示3区为文本属性,二重xor合成 

    WriteCommand( 0x59 );            // 写入指令DISP ON/OFF代码,后续参数: 
    WriteData( 0x56 );                // 01 01 01 10显示1~4区开显示,光标闪烁显示 
     
    iTemp = (Uint)Oy * paraP9 + Ox;                // 光标位置到实际ram地址换算 
     
    WriteCommand( 0x4c );                    // 自动右移光标指向 
     
    WriteCommand( 0x46 );                        // 制定光标位置 
    WriteData( (Uchar)(iTemp &0xff) );            // 设置光标地址CSR 
    WriteData( (Uchar)(iTemp /256 + BasePart3) );    // 加入显示三区起始地址SAD2H 

    WriteCommand( 0x42 );                        // 当前位置写入数据指令 

    for(ii=0;ii < TexLength;ii++) { 

        WriteData( ptr[ii] );                    // 写入显示字符代码 
    } 
    DelayMs(350); 
} 

void  text_1(void)
{
  TextDisp( 0,13, StrForSample1 );    // 英文字符串的显示,演示光标自动移位 
}

/*==============================================================================
; 汉字写入子程序(图形方式)。每次调用输出一个汉字
; 支持图形方式使用,完成汉字点阵码的输出。
; 携入参数: Ox,Oy....写入显示的左上角坐标,Ox是以字节单位,Oy以行扫描线单位
   Ptr......汉字码,库内的排列编码,大型程序时请改用unsigned int类型
; 无返回数据。
==============================================================================*/
void PPutCdotInGraph( Uint Ox, Uchar Oy, Uchar Cnumber, Uchar DotWidth ) //汉字写入子程序(图形方式)
{
Uint tempPtr,Optr;
Uchar tempCount1,tempCount2,nByte;
  
Optr = (Uint)Oy * paraP9 + Ox+0x04b0;
nByte = DotWidth/8;
WriteCommand( CsrDirD );   // 自动右移。
tempPtr = (Uint)Cnumber * DotWidth*nByte;

for (tempCount1=0;tempCount1<nByte;tempCount1++) {

WriteCommand( CsrW );    // 光标定位指令
WriteData( (Uchar)(Optr &0xff) );  // 设置光标地址CSR
WriteData( (Uchar)(Optr /256 ) );
WriteCommand( mWrite );    // ram写指令
  
switch(DotWidth){
  case 8:  for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
      WriteData( HZ8_DOT_LIB[tempPtr] ); // 写入数据
      tempPtr += nByte;
      }
      break;
  case 24: for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
      WriteData( Cdot24lib[tempPtr] ); // 写入数据
      tempPtr += nByte;
      }
      break;
  case 32: for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
      WriteData( Cdot32lib[tempPtr] ); // 写入数据
      tempPtr += nByte;
      }
      break;   
  case 48: for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
      WriteData( Cdot48lib[tempPtr] ); // 写入数据
      tempPtr += nByte;
      }
      break;
         }
tempPtr = Cnumber * DotWidth*nByte + tempCount1 + 1;
Optr++;
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -