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

📄 lcd_12864.c

📁 the driver of 12864 and it includes line
💻 C
📖 第 1 页 / 共 2 页
字号:
	uchar s0;
	uint dot_data,ori_data1,ori_data2;
	uchar Column,move;
	 if(y_loc>31){
	Column = x_loc/16; 
    y_loc  = 63 - y_loc ;}
      else 
	  {
	       y_loc  = 31 - y_loc ;
		   Column = (x_loc/16)+8;
		    }
		  move = x_loc%16; 
	  /*wr_lcd (comm,0x34);
      wr_lcd (comm,y+y_loc);
      wr_lcd (comm,x1+Column);
	  wr_lcd (dat,0xbb);
	  wr_lcd (dat,0xaa);
	  wr_lcd (comm,0x36);*/
	  wr_lcd (comm,0x34);
      wr_lcd (comm,y+y_loc);
      wr_lcd (comm,x1+Column);
	  s0=Read_state();
	  ori_data1=Read_state();
	  ori_data2=Read_state();
	  if(move<8){ 
	  dot_data = 0x80>>move;
	  dot_data = dot_data | ori_data1;	
	  wr_lcd (comm,0x34);
      wr_lcd (comm,y+y_loc);
      wr_lcd (comm,x1+Column);
      wr_lcd (comm,0x30);   
	  wr_lcd (dat,dot_data);  
	  wr_lcd (dat,ori_data2);
	  wr_lcd (comm,0x36);
	  delay(20);
	  }
	  else{
	  move=move-8;
	  dot_data = 0x80>>move;
	  dot_data = dot_data | ori_data2;
	  wr_lcd (comm,0x34);
      wr_lcd (comm,y+y_loc);
      wr_lcd (comm,x1+Column);
      wr_lcd (comm,0x30);  
      wr_lcd (dat,ori_data1);
	  wr_lcd (dat,dot_data);
	  wr_lcd (comm,0x36);
	  delay(20);
	  }
	  	
  }

   void Line(uchar a1,uchar b1,uchar a2,uchar b2)
{
	   	   //y1 = 64 - y1 ;
		   //y2 = 64 - y2 ;
	char i;
    char a,b;
	float y_add;
	a=a2-a1;
    b=b2-b1;
	if(a==0)//画竖线
	{	     
		if(b>0)
		{	for(i=0;i<b;i++)//上升	
			Locat_Dot(a1,b1+i);
		}
		else if(b==0) //画点
			Locat_Dot(a1,b1);
		else		   //下降
		{   for(i=b;i<0;i++)	
			Locat_Dot(a1,b1+i);
		}
	}
	else  y_add = b*1.000/a; //斜线:斜率
	
	if(a>0)//正向
	{
		if((y_add<=1)&&(y_add>=-1))//0°~~ 45°到135°~~ 180°
		{ 
			for(i=0;i<a;i++)	
			{ 
			   delay(20);
			 b=b1+y_add*i;
			   Locat_Dot(a1+i,b);
			}
		}
		else
		{
		     if(b>0)      //正向上升
			 {
				for(i=0;i<b;i++)
				{
					a=a1+i/y_add;
					Locat_Dot(a,b1+i);
				}
			 }
			 else if(b==0)//水平线
			 {
			     for(i=0;i<a;i++)	
			     Locat_Dot(a1+i,b1);
			 }
			 else	      //正向下降
			 {
			     for(i=b;i<0;i++)
			     {
				  	a=a1+i/y_add;
				  	Locat_Dot(a,b1+i);
				 }
			 }
		 } 
	}//正向
	else if(a<0)//反向
    {	   
		if(y_add <=1&&y_add>=-1)//0°~ 45°到 135°~ 180°
		{
			for(i=a;i<0;i++)	
			{
				b=b1+y_add*i;
				Locat_Dot(a1+i,b);
			}
		}
		else
		{
		    if(b>0)
			{
				for(i=0;i<b;i++)
				{
					a=a1+i/y_add;
					Locat_Dot(a,b1+i);
				}
			}
			else if(b==0)
			{
			     for(i=a;i<0;i++)	
		         Locat_Dot(a1+i,b1);
			}
			else
			{
			    for(i=b;i<0;i++)
			    {
				  a=a1+i/y_add;
				  Locat_Dot(a,b1+i);
				}
			}
		} 
    }//x<0: 反向
}

/*----------------显示图形-----------------*/
void img_disp (uchar code *img)
{
  uchar i,j;
  for(j=0;j<32;j++)
  {
    for(i=0;i<8;i++)
    {
      wr_lcd (comm,0x34);
      wr_lcd (comm,y+j);
      wr_lcd (comm,x1+i);
      wr_lcd (comm,0x30);
      wr_lcd (dat,img[j*16+i*2]);
      wr_lcd (dat,img[j*16+i*2+1]);
    }
  }
  for(j=32;j<64;j++)
  {
    for(i=0;i<8;i++)
    {
      wr_lcd (comm,0x34);
      wr_lcd (comm,y+j-32);
      wr_lcd (comm,x2+i);
      wr_lcd (comm,0x30);
      wr_lcd (dat,img[j*16+i*2]);
      wr_lcd (dat,img[j*16+i*2+1]);
    }
  }
  wr_lcd (comm,0x36);
}
/*-------------下半屏显示图形--------------*/
void img_disp1 (uchar code *img)
{
  uchar i,j;
  for(j=0;j<32;j++)
  {
    for(i=0;i<8;i++)
    {
      wr_lcd (comm,0x34);
      wr_lcd (comm,y+j);
      wr_lcd (comm,x2+i);
      wr_lcd (comm,0x30);
      wr_lcd (dat,img[j*16+i*2]);
      wr_lcd (dat,img[j*16+i*2+1]);
    }
  }
  wr_lcd (comm,0x36);
}
/*--------------显示点阵----------------*/
void lat_disp (uchar data1,uchar data2)
{
  uchar i,j,k,x;
  x=x1;
  for(k=0;k<2;k++)
  {
    for(j=0;j<16;j++)
    {
      for(i=0;i<8;i++)
      {
        wr_lcd (comm,0x34);
        wr_lcd (comm,y+j*2);
        wr_lcd (comm,x+i);
        wr_lcd (comm,0x30);
        wr_lcd (dat,data1);
        wr_lcd (dat,data1);
      }
      for(i=0;i<8;i++)
      {
        wr_lcd (comm,0x34);
        wr_lcd (comm,y+j*2+1);
        wr_lcd (comm,x+i);
        wr_lcd (comm,0x30);
        wr_lcd (dat,data2);
        wr_lcd (dat,data2);
      }
    }
    x=x2;
  }
  wr_lcd (comm,0x36);
}
/*-----------------------------------------------*/
//当data1=0xff,data2=0xff时,在x0,y0处反白显示16xl*yl.
void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)
{
  uchar i,j;
  for(j=0;j<yl;j++)
  {
    for(i=0;i<xl;i++)
    {
      wr_lcd (comm,0x34);
      wr_lcd (comm,y0+j);
      wr_lcd (comm,x0+i);
      wr_lcd (comm,0x30);
      wr_lcd (dat,data1);
      wr_lcd (dat,data2);
    }
  }
  wr_lcd (comm,0x36);
}
/*--------------清DDRAM------------------*/
void clrram (void)
{
  wr_lcd (comm,0x30);
  wr_lcd (comm,0x01);
}
/*---------------------------------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
  chk_busy ();
  if(dat_comm)
   {
    P0=P0|0x01;   //data
	delay(20);
    P0=P0&0xfd;   //write
   	delay(20);
   }
  else 
   {
    P0=P0&0xfe;   //command
	delay(20);
    P0=P0&0xfd;   //write
	delay(20);
   }
  data1=content;   //output data or comm
  P0=P0|0x04;
  delay(50);
  P0=P0&0xfb;
  
}
uint Read_state()
{ 
  uint rd_data;
  P2MDOUT=0x00;
  data1=0xff; 
  chk_busy ( );
  P0=P0|0x01; //rs=1;
  delay(20);
  P0=P0|0x02;//rw=1;
  delay(20);
  P0=P0|0x04;//e=1;
  delay(20);
  rd_data=data1;
  delay(20);
  P0=P0&0xfb;
  P2MDOUT=0xff;
  return( rd_data); 
}


void chk_busy (void)
 
{
		
 //P74OUT=0xf3;
  
  data1=0xff;
 	_nop_();
  delay(10);
  P0=P0|0x02;
  delay(20);
  P0=P0&0xfe;
  delay(20);
  
  P0=P0|0x04;
  delay(20);
  P0 =P0&0xfb;
//  while(data1&0x80);
 
  delay(20);
  //P74OUT=0xff;
}

void delay (uint us)   //delay time
{
  while(us--);
}
void delay1 (uint ms)
{
  uint i,j;
  for(i=0;i<ms;i++)
  for(j=0;j<150;j++)
  delay(1);
}


/*------------------主程序--------------------*/
void main ()
{
  System_initial( );
  Port_initial( ) ;
  init_lcd ();
  while (1)
  {
  /*
    lat_disp (0x00,0x00);
    chn_disp (tab1);
    con_disp (0xff,0xff,0x8c,0x80,2,16);
    delay1 (8000);
    clrram();  
    lat_disp (0xcc,0xcc);
    delay1 (8000);
    lat_disp (0x00,0x00);
    chn_disp1 (tab31);
    img_disp1 (tab32);
   delay1 (8000);
   */
    clrram();
	delay1 (80); 
    //lat_disp (0xff,0x00);
    //delay1 (8000); 
    //img_disp (tab5);
	 lat_disp (0x00,0x00);
	 delay1 (80);  
	 Line(0,0,30,10);
	 Line(0,50,30,50);
	 Line(0,50,40,30);
	 Line(20,50,30,60);
	 Line(10,0,10,60);
     delay1 (8000);
	 
  }
}

⌨️ 快捷键说明

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