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

📄 ocm4x8c.c

📁 液晶显示程序 可显示图形汉字字符(大图小图均能) 基于2812
💻 C
📖 第 1 页 / 共 2 页
字号:
      k=k+2;
    }
  }
 //下半屏
  for(i=32;i<64;i++)
  {
    for(j=0;j<8;j++)
    {
      Wr_lcd(COMM,0x34); //
      Wr_lcd(COMM,0x80+i-32);
      Wr_lcd(COMM,0x88+j);
      Wr_lcd(COMM,0x30);
      Wr_lcd(DATA,img[k]);  //D15-D8
      Wr_lcd(DATA,img[k+1]); //D7-D0
      k=k+2;
    }
  }
  Wr_lcd(COMM,0x36); //送显示图形指令 
}

//显示图形:起点(x,y) width X height
void Img_Disp(int x,int y,Uint16 height,Uint16 width,Uchar *img)
{
  Uchar i,j,m,n,k;
  //if(x<0||x>31||y<0||height%16!=0||width%16!=0)return;
    for(i=x;i<Min(x+height,64);i++) //row
    {
      for(j=y;j<Min(y+width,128);j+=16) //col
      {
		  if (i>=32) 
		     {m = i-32;
			  n=j/16;  //0x80
		 	  k=1; }  

		  else
		     {m=i;
		      n=j/16;
		      k=0;}
        Wr_lcd(COMM,0x34);//扩展指令
        Wr_lcd(COMM,0x80+m);
        Wr_lcd(COMM,0x80+0x08*k+n);
        Wr_lcd(COMM,0x30);
        Wr_lcd(DATA,img[(i-x)*width/8+(j-y)/8]);  //image
        Wr_lcd(DATA,img[(i-x)*width/8+(j-y)/8+1]);//
       }
    }
   Wr_lcd(COMM,0x36);//显示图形
}
//清除图形:起点(x,y) width X height
void Img_clr(int x,int y,Uint16 height,Uint16 width)
{
  Uchar i,j,m,n,k;
  //if(x<0||x>31||y<0||height%16!=0||width%16!=0)return;
  for(i=x;i<Min(x+height,64);i++) //row
    {
      for(j=y;j<Min(y+width,128);j+=16) //col
      {
		  if (i>=32) 
		     {m = i-32;
			  n=j/16;  //0x80
			  k=1; }  
		  else
		     {m=i;
		      n=j/16;
		      k=0;}
        Wr_lcd(COMM,0x34);//扩展指令,关闭图形
        Wr_lcd(COMM,0x80+m);
        Wr_lcd(COMM,0x80+0x08*k+n);//设地址
        Wr_lcd(COMM,0x30);//基本指令
        Wr_lcd(DATA,0x0);
        Wr_lcd(DATA,0x0);
        }
  }
   Wr_lcd(COMM,0x36);//显示图形
}
/*---------------反白显示---------------------------*/
//ocm4x8c 的一三行为反白选择的第一行,二四行为反白选择的第二行
//Function1:
//某一行反白显示  04H~07H
void Con_Disprow(int row)
{
  if(row<0||row>4)return;
  Wr_lcd(COMM,0x34); //扩展指令 关闭图形
  row&=0x03; 
  Wr_lcd(COMM,0x04+row);//
  Wr_lcd(COMM,0x30); //基本指令
}

//当data1=0xFF,data2=0xFF时,在x0,y0处反白显示16x1*y1.
//当data1=0xff,data2=0x00时,在x0,y0处前半反白显示8x1*y1.
//当data1=0x00,data2=0xff时,在x0,y0处后半反白显示8x1*y1.
void con_disp(Uchar data1,Uchar data2,int x0,int y0,int x1,int y1)
{
  Uchar i,j;
  for(j=0;j<y1;j++)
  {
    for(i=0;i<x1;i++)
    {
      Wr_lcd(COMM,0x34);
      Wr_lcd(COMM,y0+j); 
      Wr_lcd(COMM,x0+i);
      Wr_lcd(COMM,0x30);
      Wr_lcd(DATA,data1);
      Wr_lcd(DATA,data2);
    }
  }
   Wr_lcd (COMM,0x36); // 绘图显示
}

//某一区域反白显示
void Con_disparea(int x, int y, int height,int width)
{
	Uchar i,j,m,n,k,data1,data2;
    if(y<0||y>15||x<0||x>31||0!=(height%16)||0!=(width%16)) return;
    for(i=x;i<Max(x+height,64);i++)
    {
		for(j=y;j<Max(y+width,128);j+=16)
		{
			if (i>=32) 
			   {m=i-32;
			    n=j/16;
			    k=1;}
			else{m=i;
				 n= j/16;
				 k=0;}
			Wr_lcd(COMM,0x34);//扩展指令,关闭图形
			Wr_lcd(COMM,0x80+m);
			Wr_lcd(COMM,0x80+0x08*k+n);//设地址
			Wr_lcd(COMM,0x30);//基本指令
			data1= Read_lcd();
		    data2= Read_lcd();
			Wr_lcd(DATA,data1^0xFF);  //
		    Wr_lcd(DATA,data2^0xFF);
		}
    }
	Wr_lcd(COMM,0x36);//显示图形
}
/*--------------显示点阵----------------*/
// data1=0x00,data2=0x00-----clear screen
void lat_disp(Uchar data1,Uchar data2)
{
  Uchar i,j;
  //上半屏
  for(i=0;i<32;i++)
  {
    for(j=0;j<8;j++)
    {
      Wr_lcd(COMM,0x34); //扩充指令  绘图显示
      Wr_lcd(COMM,0x80+i); //设定绘图地址80H~FFH
      Wr_lcd(COMM,0x80+j);//
      Wr_lcd(COMM,0x30); //变更指令集
      Wr_lcd(DATA,data1);  
      Wr_lcd(DATA,data1);
    }
  }
 //下半屏
  for(i=32;i<64;i++)
  {
    for(j=0;j<8;j++)
    {
      Wr_lcd(COMM,0x34); //
      Wr_lcd(COMM,0x80+i-32);
      Wr_lcd(COMM,0x88+j);
      Wr_lcd(COMM,0x30);
      Wr_lcd(DATA,data2);  //D15-D8
      Wr_lcd(DATA,data2); //D7-D0
    }
  }
  Wr_lcd(COMM,0x36); //送显示图形指令 
}

/*-------------------光标显示---------------------------*/
//当data1=0xff,data2=0x00时,在x,y处显示前半光标.
//当data1=0x00,data2=0xff时,在x,y处显示后半光标.
//当data1=0x00,data2=0x00时,在x,y处不显示光标.
//y0=0x8f or y0=0x9f.
void cur_disp(Uchar data1,Uchar data2,Uchar x,Uchar y)
{
  Wr_lcd (COMM,0x34);
  Wr_lcd (COMM,y);
  Wr_lcd (COMM,x);
  Wr_lcd (COMM,0x30);
  Wr_lcd (DATA,data1);
  Wr_lcd (DATA,data2);
  Wr_lcd (COMM,0x36);
}

 //光标回到原点---地址归位
void origin_cur(void)
{
    Wr_lcd (COMM,0x30);
    Wr_lcd (COMM,0x02);
    Wr_lcd (COMM,0x06);
}

//、显示状态 开/关(08H/0CH/ODH/0EH/0FH)
void OnOff_cur(Uchar cur_con,Uchar cur_on)
{ Uchar data;
  if((cur_con==0)&&(cur_on==0))data=0x0C;  //
  if((cur_con==1)&&(cur_on==0))data=0x0D; // 
  if((cur_con==0)&&(cur_on==1))data=0x0E; // show&&not-con
  if((cur_con==1)&&(cur_on==1))data=0x0F; //con&&show
  Wr_lcd(COMM,data);
}

void Move_cur(int dir)  //dir=1/0
{ Uchar data;
  if(dir==1)data=0x14;
  if(dir==0)data=0x10;
  Wr_lcd(COMM,data);
}

//write command or data
void Wr_lcd(Uchar data_comm,Uchar data)
{   Uchar m;
    Chk_Busy();
    RS=data_comm; 
    delay(1500);
    RW=0; 
    delay(1500);
    GpioMuxRegs.GPBDIR.all=0x00;
    m=GpioDataRegs.GPBDAT.all;
    m&=0xFF00;   
    data&=0x00FF; 
    GpioMuxRegs.GPBDIR.all=0xFFFF;
    GpioDataRegs.GPBDAT.all=m|data;
    delay(1500);
    EN=1 ; 
    delay(1500);
    EN=0 ;    
}

//---------------------------------------

Uchar Read_lcd(void)
{   
    Uchar data;
    Chk_Busy();
    RS=1;
    delay(1500);
    RW=1;
    delay(1500);
    data=GpioDataRegs.GPBDAT.all; 
    return data;
}

/*清DDRAM--清屏子程序*/
void Clr_ram(void)
{
  Wr_lcd(COMM,0x30);
  Wr_lcd(COMM,0x01);
  delay(1500);
}

void Chk_Busy(void)
{  
    RS=0;   //
	delay(1500);
    RW=1;   //Read  
	delay(1500);
	EN=1;
    if(BF==1){}
    EN=0;
}

//延时,取大取小子程序
void delay (int delay)   //delay time
{
	while(delay--); 
}
 //延时秒程序
void delay_s(int ss)
{ int i;
  while(ss--)
  {i=40;
   do
   {delay(30000);}
   while(i--);
  }
}

int Max(int x,int y)
{
 int max;
 if(x>=y)max=x;
 else max=y;
 return max;
}

int Min(int x,int y)
{
 int min;
 if(x<=y)min=x;
 else min=y;
 return min;
}

⌨️ 快捷键说明

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