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

📄 lcd.c

📁 12864的液晶驱动程序
💻 C
字号:
#include <C8051F020.h>

#define uint  unsigned int
#define uchar unsigned char
#define x1    0x80
#define x2    0x88
#define y     0x80
#define comm  0
#define dat   1

sbit cs   = P0^0;  //串行口使能,高电平有效(作RS时,1为数据,0为指令)
sbit std  = P0^1;	//串口数据(作R/W时,1为读,0为写)
sbit sclk = P0^2;	 //串口时钟,高电平有效
sbit psb  = P0^3;   //H=并口; L=串口;
sbit rst  = P0^4;   //复位,低电平有效

void wr_lcd (uchar dat_comm,uchar content);
void delay (uint us);
Read_Data();

uchar code tab6[]={
/*--  调入了一幅图像:这是您新建的图像  --*/
/*--  宽度x高度=128x64  --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x20,0x00,0x40,0x00,0x00,
0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x20,0x00,0x60,0x00,0x00,
0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};

/*---------------系统初始化------------*/
void SysInitial()
{
   uint i;
   EA=0;	   
   WDTCN=0xDE;	//关闭看门狗
   WDTCN=0xAD;
   EA=1; 
   OSCXCN = 0x67;                       // 先选择外捕振荡器,频率为11.0592MHZ ,晶体振荡器方式1.6MHz<f≤3.2MHz
   for (i=0; i < 256; i++) ;            // 再延时(>1ms),
   while (!(OSCXCN & 0x80)) ;           // 等待外部晶振稳定
   OSCICN = 0x88;                       // 选择外部晶振,允许时钟丢失检测	
   XBR0=0x00; //使能交叉开关
   XBR1=0x00;
   XBR2=0x42;
   P3MDOUT=0xff;
   P0MDOUT=0xff;
   P2MDOUT=0xff;                    
   P74OUT=0xff; //P4-P7脚设为推挽 作为输出用	
}			


/*------------------LCD初始化-----------------*/
void init_lcd (void)
{
  rst=0;   //复位
  delay(100);
  rst=1;   //复位无效
  psb=0;   //H:并行  L:串行
  wr_lcd (comm,0x30);  //30---基本指令动作  
  wr_lcd (comm,0x01);  //清屏,地址指针指向00H
  delay (100);	 //清屏需较长时间
  wr_lcd (comm,0x06);  //光标右移,整体不移动
  wr_lcd (comm,0x0c);  //整体显示关,光标显示开,关反白闪烁
}



/*----------------显示图形-----------------*/
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);	 //8位控制端口,选择扩充指令集
      wr_lcd (comm,y+j);	 //选择图形区Y轴坐标
      wr_lcd (comm,x1+i);	 //选择图形区X轴坐标
      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 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);	 //8位控制端口,选择扩充指令集
        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);	//写入数据后选择显示
}


/*------------画点-------------*/
void Locat_Dot(uchar x_loc, uchar y_loc)
{
  uchar Line,Column;
  uchar move;
  uint ori_data;
  uint dot_data;
  uchar value1,value2;
  uint temp1,temp2,s;
  uchar x;
  uint n=0x80;
  y_loc = 63 - y_loc ;
  Column = x_loc/16;  
  Line = y_loc;
  delay(100);

  if(y_loc<16)
	{
	  x=0x98;
	  Line=31-Line;
	} 
  if((y_loc>=16)&&(y_loc<32))
	{
	  x=0x88;
	  Line=31-Line;
	}
  if((y_loc>=32)&&(y_loc<48))
	{
	  x=0x90;
	  Line=63-Line;
	}
  if(y_loc>=48)
	{
	  x=0x80;
	  Line=63-Line;
	}
 
  wr_lcd (comm,0x34);
  wr_lcd (comm,y+Line);   
  wr_lcd (comm,x+Column);	
  wr_lcd (comm,0x30);
  wr_lcd (dat,0xaa);   
  wr_lcd (dat,0xbb);
  wr_lcd (comm,0x36);
  wr_lcd (comm,0x34);
  wr_lcd (comm,y+Line);   
  wr_lcd (comm,x+Column);
  delay(200);
  s=Read_Data();	//虚读
  delay(500);
  temp1=Read_Data();   //实读
  delay(500);
  temp2=Read_Data();
  delay(500);

  ori_data=(temp1<<8)|temp2;
  delay(200);  
  ori_data=0x0000;	
  move = x_loc%16;  
  dot_data = 0x8000>>move;
  delay(500);
  dot_data = dot_data | ori_data;
  delay(200);
  value1 = dot_data/256;
  value2 = dot_data%256;
  delay(200);
  
  wr_lcd (comm,0x34);
  wr_lcd (comm,n+Line);  
  wr_lcd (comm,x+Column);
  wr_lcd (comm,0x30);
  wr_lcd (dat,value1);
  wr_lcd (dat,value2);
  wr_lcd (comm,0x36);
  delay(200);

}



/*--------------清DDRAM------------------*/
void clrram (void)
{
  wr_lcd (comm,0x30);
  wr_lcd (comm,0x01);
  delay (180);
}


/*---------------------------------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
  uchar a,i,j;
  delay (50);	//延时,等待内部动作完成
  a=content;
  cs=1;
  sclk=0;
  std=1;
  for(i=0;i<5;i++)	//写入5个1,作为启动位
  {
    sclk=1;
    sclk=0;
  }
  std=0;		  
  sclk=1;
  sclk=0;
  if(dat_comm)   //判断写数据还是写命令
    std=1;   //data
  else
    std=0;   //command
  sclk=1;
  sclk=0;
  std=0;	//写入1个0
  sclk=1;
  sclk=0;
  for(j=0;j<2;j++)	 //分别写入高四位和低四位
  {
    for(i=0;i<4;i++)
    {
      a=a<<1;
      std=CY;
      sclk=1;
      sclk=0;
    }
    std=0;	//写入4个0
    for(i=0;i<4;i++)
    {
      sclk=1;
      sclk=0;
    }
  }
}

/*-----------------读出值--------------------*/
Read_Data()
{
  uchar b1=0,b2=0;
  uchar result,i,j;
  cs=1;
  sclk=0;
  std=1;
  for(i=0;i<5;i++)	//写入5个1,作为启动位
  {
    sclk=1;
    sclk=0;
  }
  std=1;		  
  sclk=1;
  sclk=0;
 
  std=1; 
  sclk=1;
  sclk=0;

  std=0;	//写入1个0
  sclk=1;
  sclk=0;

  P0MDOUT=0xfd;
  	 
  for(j=0;j<8;j++)   //分别读出高四位和低四位
 	{
	  b1=b1<<1;
	  sclk=1;
      sclk=0;
	  if(std)
	     b1++;
	}
  for(i=0;i<8;i++)
	{
	  b2=b2<<1;
	  sclk=1;
      sclk=0;
	  if(std)
	     b2++;
	}
  b2=b2>>4;
  result=(0xf0&&b1)|(0x0f&&b2);
  P0MDOUT=0xff;	 
    return(result); 

  /*	for(j=0;j<2;j++)
	{
		for(i=0;i<4;i++)
		{
			b=b|(uchar)std;//b:读回的状态值
			if(j==1&&i==3);
			else b=b<<1;
			
			sclk=1;        //sclk=1;
			sclk=0;	       //sclk=0;
		}
		for(i=0;i<4;i++)
		{
			sclk=1;      //sclk=1;
			sclk=0;	     //sclk=0;
		}
	} 
	   return(b);  */


 	cs=0; 
} 
/*-----------------------------------*/
void delay (uint us)   //delay time
{
	while(us--);
}


/*------------------主程序--------------------*/
void main ()
{
  SP=0x5f; 
  SysInitial();
  init_lcd ();
  while (1)
  {
	clrram();
	delay(8000);
	lat_disp (0x00,0x00);
	delay(8000);
	img_disp (tab6);
    delay(8000);
   Locat_Dot(6,36);
   delay(8000);
   Locat_Dot(6,34);
   delay(8000);
   Locat_Dot(6,32);
   delay(8000);
  }
}

⌨️ 快捷键说明

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