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

📄 lcd_drive.c

📁 该程序主要是为液晶显示提供低成驱动的,主要讲述如何去驱动液晶
💻 C
字号:
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint  unsigned int
#define DISPON     0x3f 
#define DISPOFF    0x3e          
#define DISPFIRST  0xc0          
#define SETX       0xB8           
#define SETY       0x40        
#define Lcbusy     0x80          
#define CWADD1  XBYTE[0x7400]   /*p2.3  p2.2  p2.1  p2.0*/
#define CRADD1  XBYTE[0x7600]   /*csa   csb   r/w   d/i*/
#define DWADD1  XBYTE[0x7500]     
#define DRADD1  XBYTE[0x7700]     
#define CWADD2  XBYTE[0x7800]     
#define CRADD2  XBYTE[0x7A00]    
#define DWADD2  XBYTE[0x7900]      
#define DRADD2  XBYTE[0x7B00] 
  
 void  WrcmdL(uchar );            
 void  WrcmdR(uchar ); 
 void  WrdataL(uchar );            
 void  WrdataR(uchar );             
 void  Lcmcls(void);  
 void  lc_setxy(uchar  ,uchar ); 
 void  Lcminit(void); 
 void  lc_delay(unsigned int );
 void  putdot(uchar ,uchar ,uchar *);          
 void  print1(uchar,uchar ,uchar ,uchar ,uchar *);
 void  print2(uchar,uchar ,uint ,uchar ,uchar ,uchar *);
 void  print2_1(uchar,uchar ,uint ,uchar ,uchar,uchar ,uchar *);
 void  menu(uchar ,uchar ,uchar ,uchar ,uchar ,uchar *);
 void  wdot(uchar ,uchar );
 unsigned char code  zifu[160]; 
 unsigned char code  zifu1[96]; 
 unsigned char code  caidan1[512];
 unsigned char code  caidan2[128]; 
 
 uchar col,row,cbyte;
 uchar page=0;

/**************全或半角字符点阵码数据输出*******************/
 void putdot(uchar a,uchar w,uchar *j)  /*a=8或16为字符/汉字,w=1为反白,j为代码指针*/ 
{ 
	uchar i,bakerx,bakery,b;              /*共定义4个局部变量*/
	bakerx=row;
	bakery=col;                            /*暂存x,y坐标,已备下半个字符使用*/	
    lc_setxy(row,col);
    	                                   /*上半个字符输出,a列*/
	  for(i=0;i<a;i++)						
	    {
		 b=j[i];
	    	if(w==1)cbyte=~b;              /*反白显示*/
	    	else cbyte=j[i];               /*取点阵码,rom数组*/
			if(col>0x3F){lc_setxy(row,col);WrdataR(cbyte);}              /*写输出一字节*/
	    	else WrdataL(cbyte);                      
	  	  col++;
	}                                      /*上半个字符输出结束*/
	col=bakery;                         
	row=bakerx+1;                                /*指向下半个字符行*/
	lc_setxy(row,col);
	                                         /*下半个字符输出,16列*/
	for(i=a;i<2*a;i++)
	    {
	    	if(w==1)cbyte=~j[i];     
	    	else cbyte=j[i];               /*取点阵码,rom数组*/
			if(col>0x3F){lc_setxy(row,col);WrdataR(cbyte);}              /*写输出一字节*/
	    	else WrdataL(cbyte);                      
	    	col++;
	    }                                        /*下半个字符输出结束*/
    row=bakerx;
    col=bakery+a;                    
}
/***************打印一行汉字******************/
 void print1(uchar rowfirst,uchar colfirst,uchar n, uchar w,uchar *p) 
{                                         /*hang,lie,zishu,fanbai,daima*/
   uchar i;
   row=rowfirst; 
   col=colfirst;
   for(i=0;i<n;i++)
   { putdot(16,w,p);
     p+=32;
   }
}
/***************打印一串字符*********************/
 void print2(uchar rowfirst,uchar colfirst,uint cdata,uchar n,uchar w,uchar *p)
{uchar i,j,k;                             /*hang,lie,shu,weishu,fanbai,daima*/
 uchar a[8];
 uint m;
  uchar *s;
  col=colfirst;
  row=rowfirst;
  s=p;
  m=cdata;
  for(i=0;i<n;i++)
  {j=m%10;m=m/10;a[i]=j;}
  for(i=0;i<n;i++)
  {k=a[n-1-i];
   s=p+k*16;
   putdot(8,w,s);
  }
}

/***************打印浮点字符,小数点保留两位*********************/
 void print2_1(uchar rowfirst,uchar colfirst,uint cdata,uchar n,uchar d,uchar w,uchar *p)
{uchar i,j,k;             /*行,列,显示的数,位数,d小数点前有几位,反白,代码*/
 uchar a[8];
 uint m;                                
  uchar *s;
  col=colfirst;
  row=rowfirst;
  s=p;
  m=cdata;
  for(i=0;i<n;i++)
  {j=m%10;m=m/10;a[i]=j;}
  for(i=0;i<n;i++)
  {k=a[n-1-i];
   s=p+k*16;
   putdot(8,w,s);
   if(i==d-1) putdot(8,w,zifu1+80);
  }
}  
/***************驱动*************/
void WrdataL(uchar X)
{
  while(0x80&CRADD1);
  DWADD1=X;               
}

 void WrdataR( uchar X)
{
  while(0x80&CRADD2);
  DWADD2=X; 
}

 void WrcmdL(uchar X)
{
  while(0x80&CRADD1);                    
  CWADD1=X;                                  
}

 void WrcmdR(uchar  X)
{
  while(0x80&CRADD2);    
  CWADD2=X;                       
}

/***************行列设置****************/
 void  lc_setxy(uchar x,uchar y)
{
   if(y>0x3F){
	WrcmdR(SETX|x);
	WrcmdR(y&0x3F|SETY);
	}
	else{
	WrcmdL(SETX|x);
	WrcmdL(SETY|y);
	}
}
/***************初始化***************/
void Lcminit(void)
     {
     	cbyte=DISPOFF;                  
     	WrcmdL(cbyte);
     	WrcmdR(cbyte);
     	cbyte=DISPON;             
     	WrcmdL(cbyte);
     	WrcmdR(cbyte);
     	cbyte=DISPFIRST;              
     	WrcmdL(cbyte);
     	WrcmdR(cbyte);
     	Lcmcls();                      
     	col=0;                    
     	row=0;
     }
/**************清屏***************/
 void Lcmcls()
{
   uchar  i,j,disp_page;
   for(i=0;i<8;i++)	                          
   {
      disp_page=i;
	  disp_page=disp_page|SETX;
	  while(0x80&CRADD1);
	  WrcmdL(disp_page);
	  WrcmdL(SETY);
	  for(j=0;j<64;j++)WrdataL(0x00);
	  WrcmdR(disp_page);
	  WrcmdR(SETY);
	  for(j=0;j<64;j++)WrdataR(0x00);	  
   }    
}
/*************延时***************/
void lc_delay(unsigned int MS)
     {
      uchar   us,usn;
     	while(MS!=0)
     	     {
     	     	usn=4;
     	     	while(usn!=0)
     	     	    {
     	     	    	us=0xf0;
     	     	    	while(us!=0){us--;}
     	     	    	usn--;
     	     	    }
     	     	 MS--;
     	     }
     }
 
/*********************打印整屏************************/
  void   menu(uchar x,uchar w1,uchar w2,uchar w3,uchar w4,uchar*k) /*x表示所显示的行数*/
{                                                                  /*w1 w2 w3 w4 分别表示*/
   uchar m,n,h,*c;                                                 /*1~4行所显字数*/
   Lcmcls(); 
   c=k;
   row=0;col=0;
   for(m=0;m<x;m++)
   {  if(m==0)h=w1;
	  if(m==1)h=w2;
      if(m==2)h=w3;
      if(m==3)h=w4;
	 for(n=0;n<h;n++)
	  {
	   if(m==page) putdot(16,1,k);
	   else putdot(16,0,k);
       k+=32;
	  }
    col=0;row+=2;
  }
}

/**********************打点程序*****************************/
void wdot(uchar lie,uchar line)
{uchar n;
 col=lie;
 row=line/8;
 lc_setxy(row,col);
 n=line%8;
 cbyte=0x01;
 cbyte=cbyte<<n;
 if(col>0x3F){lc_setxy(row,col);WrdataR(cbyte);}              
 else WrdataL(cbyte);                      
}

 unsigned char code zifu[160]={
//0
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
//1
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
//2
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
//3
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
//4
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
//5
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
//6
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
//7
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
//8
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
//9
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00};

/***************************单位*******************************************/
unsigned char code zifu1[96]={

/*--  文字:  H  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,

/*--  文字:  Z  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,

/*--  文字:  u  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,

/*--  文字:  s  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,

/*--  文字:  V  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,

/*--  文字:  .  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00};

unsigned char code  caidan1[512]={

/*--  文字:  电  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,
0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00,

/*--  文字:  压  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0xFE,0x02,0x42,0x42,0x42,0x42,0xFA,0x42,0x42,0x42,0x62,0x42,0x02,0x00,
0x20,0x18,0x27,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x21,0x2E,0x24,0x20,0x20,0x00,

/*--  文字:  测  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,

/*--  文字:  量  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x40,0x40,0xDF,0x55,0x55,0x55,0xD5,0x55,0x55,0x55,0xDF,0x40,0x40,0x40,0x00,
0x40,0x40,0x40,0x57,0x55,0x55,0x55,0x7F,0x55,0x55,0x55,0x57,0x50,0x40,0x40,0x00,

/*--  文字:  频  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x20,0x3C,0x20,0x20,0xBF,0x24,0x24,0x00,0xF2,0x1A,0xD6,0x12,0x12,0xF2,0x02,0x00,
0x44,0x43,0x20,0x10,0x0B,0x04,0x43,0x40,0x27,0x18,0x07,0x08,0x10,0x27,0x60,0x00,

/*--  文字:  率  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x0C,0x14,0xA4,0x04,0x64,0x35,0xAE,0x64,0x24,0x14,0xA4,0x14,0x04,0x04,0x00,
0x08,0x0A,0x09,0x08,0x08,0x0A,0x0B,0xFE,0x0A,0x0B,0x0C,0x08,0x09,0x0A,0x08,0x00,

/*--  文字:  测  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,

/*--  文字:  量  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x40,0x40,0xDF,0x55,0x55,0x55,0xD5,0x55,0x55,0x55,0xDF,0x40,0x40,0x40,0x00,
0x40,0x40,0x40,0x57,0x55,0x55,0x55,0x7F,0x55,0x55,0x55,0x57,0x50,0x40,0x40,0x00,

/*--  文字:  脉  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0xFE,0x12,0x12,0xFE,0x00,0x48,0xC8,0x09,0xFE,0x82,0x40,0x38,0x10,0x00,0x00,
0x60,0x1F,0x41,0x81,0x7F,0x10,0x08,0x47,0x80,0x7F,0x00,0x01,0x06,0x1C,0x08,0x00,

/*--  文字:  宽  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x10,0x0C,0x14,0x94,0x94,0xBC,0x95,0x96,0x94,0xBC,0x94,0x94,0x14,0x0C,0x04,0x00,
0x00,0x80,0x80,0x4F,0x40,0x20,0x18,0x07,0x38,0x40,0x40,0x4F,0x40,0x70,0x00,0x00,

/*--  文字:  测  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,

/*--  文字:  量  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x40,0x40,0xDF,0x55,0x55,0x55,0xD5,0x55,0x55,0x55,0xDF,0x40,0x40,0x40,0x00,
0x40,0x40,0x40,0x57,0x55,0x55,0x55,0x7F,0x55,0x55,0x55,0x57,0x50,0x40,0x40,0x00,

/*--  文字:  波  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x10,0x60,0x01,0xE6,0x00,0xF8,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x18,0x08,0x00,
0x04,0x04,0xFF,0x40,0x30,0x8F,0x80,0x41,0x26,0x18,0x18,0x26,0x61,0xC0,0x40,0x00,

/*--  文字:  形  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x42,0x42,0xFE,0x42,0x42,0xFE,0x42,0x42,0x40,0x10,0x88,0xE4,0x47,0x02,0x00,
0x80,0x40,0x30,0x0F,0x00,0x00,0x7F,0x00,0x84,0x42,0x21,0x10,0x08,0x0E,0x04,0x00,

/*--  文字:  显  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0x3E,0x2A,0xEA,0x2A,0x2A,0x2A,0xEA,0x2A,0x3E,0x00,0x00,0x00,0x00,
0x20,0x21,0x22,0x2C,0x20,0x3F,0x20,0x20,0x20,0x3F,0x28,0x24,0x23,0x20,0x20,0x00,

/*--  文字:  示  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x20,0x20,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x22,0x20,0x20,0x00,
0x10,0x08,0x04,0x03,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x02,0x0C,0x18,0x00,0x00};

unsigned char code caidan2[128]={

/*--  文字:  测  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,

/*--  文字:  量  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x40,0x40,0xDF,0x55,0x55,0x55,0xD5,0x55,0x55,0x55,0xDF,0x40,0x40,0x40,0x00,
0x40,0x40,0x40,0x57,0x55,0x55,0x55,0x7F,0x55,0x55,0x55,0x57,0x50,0x40,0x40,0x00,

/*--  文字:  值  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x80,0x40,0xF0,0x2F,0x02,0x04,0xE4,0xA4,0xB4,0xAF,0xA6,0xA4,0xE4,0x04,0x00,0x00,
0x00,0x00,0xFF,0x00,0x40,0x40,0x7F,0x4A,0x4A,0x4A,0x4A,0x4A,0x7F,0x40,0x40,0x00,

/*--  文字:  :  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

⌨️ 快捷键说明

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