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

📄 12864driver.h

📁 单片机开发
💻 H
字号:
#define  LCD    P0
#define  uchar  unsigned  char
#define  uint   unsigned  int

sbit E  =P2^0;	 //使能
sbit RW =P2^1;	 //读写选择
sbit DI =P2^2;	 //相当于RS 数据指令选择
sbit CS2=P2^3;	 //右  0有效
sbit CS1=P2^4;	 //左
sbit RST=P2^5;   //复位信号 低电平有效


//延时函数
void Delay_ms(int t)												 
{                           										 
   int i,j;														     
   for(i=0;i<t;i++)	 											     
   {																
     for(j= 0; j<120; j++);	//for循环120次为1ms						
   }															     
}

//状态查询函数 							
void Check_Busy()
{
     uchar busy;

	 do
	 {
		 RW=1;	                 //读出指令状态
	     DI=0;	               
	   	 LCD=0xFF;            //当RW=1  E=1  DI=0(指令数据) 
		 E=1;	             //指令状态分别输出到数据总线DB7 DB0 的相应位,即可从P1将指令读回
		 busy=LCD;            //从P1读回指令状态数据
	     E=0;				 //E下降沿指令写入IR
		 
		 RW=1;
		 DI=0;
		 LCD=0xFF;
		 E=1;
		 busy=LCD;
		 E=0; 

		 busy=busy&0x80;		 //判断D7是否为0
	 }while(busy!=0x00);	
}

//LCD命令写入函数	   
void W_Cmd(uchar cmd)
{
     Check_Busy();
	 RW=0;		             //写入
	 DI=0;					 //DI=0写指令
	 LCD=cmd;
	 E=1;		             //E下降沿将指令写入IR
	 E=0;
}


//开显示
void LCD_On()
{			    
     W_Cmd(0x3F);  //开显示条件 RW=0 DI=0 P1=0x3F
}


//关显示
void LCD_Off()
{
	 W_Cmd(0x3E);
}


//初始化 显示起始行
void Set_Line(uchar line)  //设定DR的数据从哪一行开始显示在屏幕的第一行	
{                              
	 W_Cmd(line+0xC0);	   //0xC0为Z地址计数器起始地址
}


//初始化 页
void Set_Page(uchar page)   
{
	 W_Cmd(page+0xB8);	   //0xB8为页的起始地址
}


//初始化 列
void Set_Column(uchar column)  
{
	 W_Cmd(column+0x40);   //0x40为列的起始地址
}


//数据写入LCD
void W_Dat(uchar dat)
{
	 Check_Busy();
	 RW=0;
	 DI=1;				  //显示数据
	 LCD=dat;
	 E=1;				    
	 E=0;				  //E下降沿 数据写入DR
}



//选择屏幕
void Set_Screen(unsigned char NO)	
{
	 switch (NO)
	 {
		 case 0:   CS1=0; //全选中
			       CS2=0;
			       break;
		 case 1:   CS1=0; //左屏
		  	       CS2=1;
			       break;
		 case 2:   CS1=1; //右屏
			       CS2=0;
		     	   break;
		 default:  break;
	 }	
}

//初始化函数
void LCD_Initial()
{
     RST=0;				//复位
	 Delay_ms(10);
	 RST=1;
	 Set_Screen(0);
	 LCD_Off();
	 LCD_On();
}

//清屏函数
void LCD_Clear()
{
	 uchar page,i;
	 Set_Screen(0);				     
	 for(page=0;page<8;page++)		  //8页
	 {	
	      							   
	      Set_Page(page);			  //初始化页
		  Set_Column(0);			  //初始化列
		  Set_Line(0);				 
	      for(i=0;i<64;i++)           //在对DDRAM进行读写操作后 Y地址指针自动加1
	      {
	          W_Dat(0);  
		  }	 
     }
}


/***********汉字显示函数****************/
/* n显示的汉字个数
   screen起始显示的屏  
   page起始显示的页数 
   column起始显示的列数	   0~63
   character字符数组
   flag=1反白显示
*/
void Chinese_Disp(uchar n,uchar screen,uchar page,uchar column,uchar code *character,bit flag)
{
     uint i,j,k,a=0,b=0;
	 
	 if(n<=8)
	 {
	      for(i=0;i<n;i++)//显示几个字符
	      {	 		       
	           for(j=0;j<16;j++)   //显示方式 上下列依次显示
		       {	 
			         Set_Screen(screen);

			         if(((i*16+column+j)>63)&&(screen==1))   //若字符将超出左屏
		             Set_Screen(screen+1);

					 /*****显示字的上半部分****/

					 Set_Page(page);
			         Set_Column((column+i*16+j)%64);
					 Set_Page(page);
			         if(flag==0)
                     W_Dat(character[i*32+j]);
			         else
			         W_Dat(~character[i*32+j]);


					 /*****显示字的下半部分****/

					 Set_Page(page+1);
					 Set_Column((column+i*16+j)%64);
					 if(flag==0)
                     W_Dat(character[i*32+16+j]);
			         else
			         W_Dat(~character[i*32+16+j]);
		       }

	       }
	 }
	 /************若字数超过8个滚动显示*****************/
	 
	 if(n>8) //此处用whlie循环会导致中断不起作用  ?????
	 {
     for(k=0;k<=(n-8)*16;k++) //左移
	 {

	      //设定一个参数a 记录每次循环显示的初始地址 循环一次后加1 若满足条件+16
	      for(i=0;i<8;i++)//滚动显示8个字符
	      {	    
		       if(i<4)      Set_Screen(1);
			   else         Set_Screen(2);
			   	       
	           for(j=0;j<16;j++)   //显示方式 上下列依次显示
		       {	 
					 /*****显示字的上半部分*****/
					 Set_Page(page);
					 Set_Column((i*16+j)%64);
					 b=a+j+i*32;
			         if(flag==0)
					 {	 
					     if(b/16%2==1)	 W_Dat(character[b+16]);
						 else            W_Dat(character[b]);
					 }
			         else
			         {	 
					     if(b/16%2==1)	 W_Dat(~character[b+16]);
						 else            W_Dat(~character[b]);
					 }
					 /*****显示字的下半部分*****/
					 Set_Page(page+1);
					 Set_Column((i*16+j)%64);
				     if(flag==0)
					 {	 
					     if(b/16%2==1)	 W_Dat(character[b+32]);
						 else            W_Dat(character[b+16]);
					 }
			         else
			         {	 
					     if(b/16%2==1)	 W_Dat(~character[b+32]);
						 else            W_Dat(~character[b+16]);
					 }
		       }

	       }
		   if(k==0)	   Delay_ms(1000);
		   //Delay_ms(1000);	 //画面持续时间
		   a++;
		   if(a%16==0) a+=16;
	 }

	  a--;


	  for(k=0;k<=(n-8)*16;k++) //右移
	 {

	      //设定一个参数a 记录每次循环显示的初始地址 循环一次后加1 若满足条件+16
	      for(i=0;i<8;i++)//滚动显示8个字符
	      {	    
		       if(i<4)      Set_Screen(1);
			   else         Set_Screen(2);
			   	       
	           for(j=0;j<16;j++)   //显示方式 上下列依次显示
		       {	 
					 /*****显示字的上半部分*****/
					 Set_Page(page);
					 Set_Column((i*16+j)%64);
					 b=a+j+i*32;
			         if(flag==0)
					 {	 
					     if(b/16%2==1)	 W_Dat(character[b+16]);
						 else            W_Dat(character[b]);
					 }
			         else
			         {	 
					     if(b/16%2==1)	 W_Dat(~character[b+16]);
						 else            W_Dat(~character[b]);
					 }
					 /*****显示字的下半部分*****/
					 Set_Page(page+1);
					 Set_Column((i*16+j)%64);
				     if(flag==0)
					 {	 
					     if(b/16%2==1)	 W_Dat(character[b+32]);
						 else            W_Dat(character[b+16]);
					 }
			         else
			         {	 
					     if(b/16%2==1)	 W_Dat(~character[b+32]);
						 else            W_Dat(~character[b+16]);
					 }
		       }

	       }
		   if(k==0)	   Delay_ms(1000);
		   //Delay_ms(1000);	 //画面持续时间
		   
		   if(a%16==0) a-=16;
		   a--;
	 }
	 a=0;
	 } 
}

/*************空白显示16行×8列**************/
void Blank_Disp(uchar n,uchar screen,uchar page,uchar column,bit flag)
{
     uint i,j;
	 Set_Screen(screen);
     for(i=0;i<n;i++)  //n<8
	 {	 
	     Set_Page(page);
	     Set_Column(column+i*8);
	     for(j=0;j<8;j++)
		 {	 if(flag==0)
             W_Dat(0x00);
			 else
			 W_Dat(0xFF);
		 }

		 Set_Page(page+1);
	     Set_Column(column+i*8);
		 for(j=0;j<8;j++)
		 {	 
		     if(flag==0)
             W_Dat(0x00);
			 else
			 W_Dat(0xFF);
		 }
	 }
}

⌨️ 快捷键说明

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