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

📄 lcd12864.c

📁 主要用于12864 液晶 OCMG4C8 显示汉字
💻 C
字号:
#include"C8051F020.h" //串行通信方式

#define uchar unsigned char
#define uint unsigned int

#define comm  0
#define dat   1

uint table[8][64]={0};	  // 不能写成 :uint code table[8][64]={0};	

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<15;j++)
	delay(1);
}

//-------------------------------------------
//-------------------------------------------
void wr_lcd (uchar dat_comm,uchar content)
{
	uchar a,i,j;
	delay (50);
	a=content;
	
	P3=P3|0x01;     //cs
	
	P3=P3&0xfb;     //sclk=0;
	P3=P3|0x02;     //std=1;					 
	for(i=0;i<5;i++)
	{
		P3=P3|0x04; //sclk=1;
		P3=P3&0xfb;	//sclk=0;
	}
	
	P3=P3&0xfd;     //write			  /*RW*/
	P3=P3|0x04;     //sclk=1;
	P3=P3&0xfb;	    //sclk=0;
	
	if(dat_comm)					 
		P3=P3|0x02;  //data	  		  /*RS*/
	else             //command
		P3=P3&0xfd;             
	P3=P3|0x04;      //sclk=1;
	P3=P3&0xfb;	     //sclk=0;
	
	P3=P3&0xfd;      //std=0;
	P3=P3|0x04;      //sclk=1;
	P3=P3&0xfb;	     //sclk=0;
	
	for(j=0;j<2;j++)
	{
		for(i=0;i<4;i++)
		{
			a=a<<1;	/*a:要显示的内容;或指令*/
		
			if(CY==1)P3=P3|0x02;  //std=1;	 /*std=CY*/
			else  P3=P3&0xfd;     //std=0;
			
			P3=P3|0x04;        //sclk=1;
			P3=P3&0xfb;	       //sclk=0;
		}
		for(i=0;i<4;i++)
		{
			P3=P3&0xfd;      //std=0;
			P3=P3|0x04;      //sclk=1;
			P3=P3&0xfb;	     //sclk=0;
		}
	}
}
void Locat_Dot(uchar x_loc, uchar y_loc) //参数是液晶上的坐标 0~127,0~63
{
	uint dot_data;
 
 	uchar Line,Column, move;
	uchar first,second;
	uchar x_axis, y_axis;

	y_axis  = 63-y_loc ;
    x_axis = x_loc/16;  
    Line   = y_axis;

	 if(y_loc<16)  
	 {
	 	Column=0x18+x_axis;	
		Line=31-Line;
	}
 
    if( (y_loc>16 )&&(y_loc>32))
	{
	  Column=0x08+x_axis;
	  Line=31-Line;
	}
	
	if((y_loc>=32)&&(y_loc<48))
	{
	  Column=0x10+x_axis;
	  Line=63-Line;
	}

	if(y_loc>=48)
	{
		Column=0x00+x_axis;
		Line=63-Line;
	}

	move = x_loc%16;  
	dot_data = 0x8000>>move;
	table[x_axis][y_axis] = table[x_axis][y_axis]|dot_data;
	dot_data = table[x_axis][y_axis]; 
	
	delay(100);
	first  = dot_data/256;
	second = dot_data%256;
	delay(200);
	
	wr_lcd (comm,0x34);
	wr_lcd (comm,0x80+Line);  
	wr_lcd (comm,0x80+Column);
	wr_lcd (comm,0x30);
	wr_lcd (dat,first);
	wr_lcd (dat,second);

	wr_lcd (comm,0x36);
	delay(200);
}


void Line(uchar x1,uchar y1,uchar x2,uchar y2)
{ 
    uchar i,x,y;
	float y_add;
	x=x2-x1;
	y=y2-y1;
	if(x==0)
    {	     
		 if(y>0)
		 {	  for(i=0;i<y;i++)	
              Locat_Dot(x1,y1+i);
		 }
		 else if(y==0)
		     Locat_Dot(x1,y1);
		 else
		 {   for(i=y;i<0;i++)	
              Locat_Dot(x1,y1+i);
		 }
	}
	else 
	   y_add = y*1.000/x;
	if(x>0)
	{
	  if(y_add <=1&&y_add>=-1)
	  {
	     for(i=0;i<x;i++)	
	     {  y=y1+y_add*i;
		    Locat_Dot(x1+i,y);
	     }
	  }
	  else
	  {
	    if(y>0)
		{
		   for(i=0;i<y;i++)
		   {  x=x1+i/y_add;
			  Locat_Dot(x,y1+i);
			}
		 }
		 else if(y==0)
		 {   for(i=0;i<x;i++)	
		     Locat_Dot(x1+i,y1);
		 }
		 else
		 {
		    for(i=y;i<0;i++)
		    {  x=x1+i/y_add;
			   Locat_Dot(x,y1+i);
			}
		 }
	  } 
	}
   else if(x<0)
   {	   
	  if(y_add <=1&&y_add>=-1)
	  {
	     for(i=x;i<0;i++)	
	     {  y=y1+y_add*i;
		    Locat_Dot(x1+i,y);
	     }
	  }
	  else
	  {
			if(y>0)
			{
			   for(i=0;i<y;i++)
			    {  x=x1+i/y_add;
				   Locat_Dot(x,y1+i);
				 }
			}
			else if(y==0)
			{    for(i=x;i<0;i++)	
			      Locat_Dot(x1+i,y1);
			}
			else
			{
			    for(i=y;i<0;i++)
			    {   x=x1+i/y_add;
				    Locat_Dot(x,y1+i);
				}
			}
	   } 
   }
	delay(200);

}
/*------------------初始化-----------------*/
void init_lcd (void)
{
	P3=P3|0x10;			//RST
	delay(20);
	P3=P3&0xf7;			//PSB=0;串行,P3.3=0
	delay(20);
	wr_lcd (comm,0x30);  /*30---基本指令动作*/   
	wr_lcd (comm,0x01);  /*清屏,地址指针指向00H*/
	delay (100);
	wr_lcd (comm,0x06);  /*光标的移动方向*/
	wr_lcd (comm,0x0c);  /*开显示,关游标*/
	delay(200);

}
/*---------------显示汉字或字符----------------*/
void character_dis(uchar code *chn)
{
	uchar i,j;
	wr_lcd (comm,0x30);
	wr_lcd (comm,0x80);
	for (j=0;j<4;j++)
	{
		for (i=0;i<16;i++)
		wr_lcd (dat,chn[j*16+i]);
	}

}
/*-----------上半屏显示汉字或字符------------*/
void upper_display (uchar code *chn)
{
	uchar i,j;
	wr_lcd (comm,0x30);
	
	wr_lcd (comm,0x80);
	j=0;
	for (i=0;i<16;i++)
	wr_lcd (dat,chn[j*16+i]);
	
	wr_lcd (comm,0x90);
	j=1;
	for (i=0;i<16;i++)
	wr_lcd (dat,chn[j*16+i]);
}
/*----------------显示图形-----------------*/
void graph (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,0x80+j);
      wr_lcd (comm,0x80+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,0x80+j-32);
      wr_lcd (comm,0x88+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 down_graph (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,0x80+j);
      wr_lcd (comm,0x88+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 lattice_disp (uchar data1,uchar data2)
{
  uchar i,j,k,x;
  x=0x80;
  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,0x80+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,0x80+j*2+1);
        wr_lcd (comm,x+i);
        wr_lcd (comm,0x30);
        wr_lcd (dat,data2);
        wr_lcd (dat,data2);
      }
    }
    x=0x88;
  }
  wr_lcd (comm,0x36);
  delay(200);

}
/*-----------------------------------------------*/
//当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 clr_ddram (void)
{
  wr_lcd (comm,0x30);
  wr_lcd (comm,0x01);
  delay (180);
}
/*--------------清GDRAM------------------*/
void clr_gdram (void)
{
	lattice_disp(0x00,0x00);
	delay(200);

}
/*
void Clr_gdram(void) 
{  
    uchar x,y; 
	wr_lcd (comm,0x34);   //开启扩充指令集  并关绘图显示    
	 
	for(y=0;y<32;y++) 
	{ 
		wr_lcd (comm,y+0x80);    //行地址   
		wr_lcd (comm,0x80);     //列地址 
		for(x=0;x<16;x++) 
		{  
		 wr_lcd (dat,0x00);  
		 wr_lcd (dat,0x00); 
		} 
	} 
    wr_lcd (comm,0x36);  //开绘图显示 
} 

*/

⌨️ 快捷键说明

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